教程– NoSQLBench入门

发布于:2021-01-07 10:23:46

0

196

0

NoSQLBench 测试工具 数据库

NoSQLBench于2020年3月发布,它是第一个测试工具,旨在涵盖任何严肃的测试工具在分布式系统上应具备的所有基础。同时,它旨在使休闲和认真的用户都可以使用。

什么是NoSQLBench?

今天的开发人员希望构建可扩展的应用程序。这要求使用可在多个位置运行的分布式系统,无论这些是容器映像还是跨公共,私有或混合云平台运行的服务。但是,测试这些应用程序比应做的难。

规模系统的性能测试工具受到限制。NoSQLBench于2020年3月发布,它是第一个测试工具,旨在涵盖任何严肃的测试工具在分布式系统上应具备的所有基础。同时,它旨在使休闲和认真的用户都可以使用。

NoSQLBench旨在解决测试挑战,而其他工具根本不是针对这些挑战而设计的。它允许用户使用目标系统的本机查询语言对访问模式进行建模。它不假定所有NoSQL数据库只是同一思想的不同版本。NoSQLBench不需要您成为开发人员就可以构建有意义的测试,也不需要您随批处理数据一起提供实际的测试数据或操作。

使用NoSQLBench配置工作负载后,就可以执行了。如果您需要更改操作中使用的访问模式或数据,这是一个配置更改,您准备再次进行测试。即使使用任意大小的数据集,这也是可能的。这使用户可以直接洞悉在生产时对于同等工作量的期望。

NoSQLBench具有其他测试工具中找不到的功能:

  • 面向配方的过程数据生成—用于复制和粘贴访问大量虚拟数据集的功能

  • 确定性的工作负载行为-每个周期都是特定且可重复的

  • 模块化协议支持-从cql等开始

  • 语句和数据的配置语言—操作和访问模式的语言

  • 内置脚本—启用自动机驱动的高级场景分析

  • 特定于周期的操作和诊断-您可以重试任何特定的周期以了解更多信息

  • docker-metrics仪表板—支持自动运行和配置基于docker的grafana堆栈以实现丰富的仪表板

  • 高保真度指标的一致视图,支持协调的遗漏,具有多种输出格式和报告选项

这些功能各自以各自的方式发挥重要作用。当放在一起时,他们会创建一个功能强大的工具箱,使每个人的性能测试变得更加轻松。NoSQLBench使我们能够专注于测试需求,而不会在测试工具上做出妥协。

这也意味着我们可以避免构建一次性测试工具的昂贵且复杂的问题。实际上,这些短命的工具通常具有严重的缺陷。毕竟,构建以所有正确方式正常工作的测试工具并非易事。我们希望通过提供可以处理所有坚硬零件而又不脱离用户控制权的方式来打破这种模式。

性能测试工具需要花费一些时间才能在测试人员的工具箱中赢得一席之地。值得庆幸的是,无论对于DataStax还是客户,NoSQLBench都已证明自己是一种宝贵的工具。

核心概念

NoSQLBench工作负载在YAML配置文件中进行组织。工作量主要基于语句 ,因此YAML格式强调了这一点。您还可以向这些语句添加绑定 ,以指定用于操作的数据。要组织和选择活动语句,可以添加标签。语句还可以具有特定于语句的语句参数 ,例如是否将操作标记为幂等,或是否使用准备好的语句,等等。

Hello World

本教程是对基本NoSQLBench工作流程的高级介绍。您可以将其用作进行任何级别测试的基本模板。如果您在测试中需要更多具体细节,请随时添加。假设您想使用CQL将10亿条记录写入目标系统。为此,您将要使用cql驱动程序。

假设您从这样的语句草图开始:

# hello-world-dml.yaml statements:  - example: |     insert into hello.world (cycle,name,sample)       values ({cycle},{cyclename},{sample});    bindings:     cycle: Identity()     cyclename: NumberNameToString()     sample: Normal(100.0D, 10.0D)

现在我们有了一个起点,我们如何知道它将完成我们想要的?

您可以逐周期预览语句的外观。这是stdout驱动程序如何解释此配置以产生一些语句的方式:

nb run driver=stdout yaml=hello-world-dml.yaml cycles=5# output Logging to logs/scenario_20200403_101645_863.log insert into hello.world (cycle,name,sample)  values (0,zero,95.30390911280935); insert into hello.world (cycle,name,sample)  values (1,one,104.73915634900615); insert into hello.world (cycle,name,sample)  values (2,two,112.3236295086616); insert into hello.world (cycle,name,sample)  values (3,three,111.38872920562173); insert into hello.world (cycle,name,sample)  values (4,four,91.52878591168258);

很好,我们已经有了一些有用的东西!您看到的是使用stdout 驱动程序执行活动的结果。该驱动程序不讲任何有线协议,但是它知道如何将渲染的操作打印到控制台进行诊断。这是熟悉数据绑定的一种非常常见的方式。这也是一种快速检查如果在Apache Cassandra数据库上运行工作负载将执行哪些操作的快速方法。为此,您需要做的就是将driver = stdout更改为driver = cql并提供要连接的主机。

这显示了在整个测试场景中拥有一组通用的概念和配置原语的力量。这并不意味着不同的系统会神奇地说出彼此的陈述形式和协议,而是意味着您可以以惯用的方式表达它们并针对目标系统定制测试。NoSQLBench高级驱动程序(如cql)的工作是使语句模板适应所使用协议的本机形式。任何不允许您使用目标系统的本地语言来控制访问模式和操作的性能测试工具,对于认真的测试都没有用。

输出中的每一行都演示了每个操作的周期数是如何具体的,以及如何将其用作每个操作中使用的数据的基础。

如果将达到此目标所需的工作量与任何其他测试工具进行比较,您将开始明白为什么我们要努力构建此工具包。继续阅读,使用NoSQLBench的原因将开始堆积起来!

下一级

那么,我们如何将这个草图放在上面,并将其转换为易于人们使用和运行的东西?为此,我们需要允许他们设置整个测试方案,包括DDL。值得庆幸的是,这很容易做到,因为NoSQLBench中没有任何语句形式是神圣的。您只需创建语句来定义您的键空间和架构:

这是我们的架构工作负载配置:

# hello-world-ddl.yaml statements:   - create-keyspace: |      create keyspace if not exists hello      WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'};     params:      prepared: false   - create-table: |       create table if not exists hello.world (         cycle  bigint,         name   text,         sample double,         primary key(cycle)       );     params:      prepared: false

这显示了两个没有绑定的语句(DDL不需要它们),还有一个新的YAML元素,称为语句参数。的准备:错误设置禁止自动使用准备好的发言的,因为你不能做到这一点与DDL。

但是现在我们有两个语句块,只要将它们保存在单独的文件中就可以了。但是,我们可以做得更好。NoSQLBench YAML格式已经过改进,可以支持各种测试结构,包括块,标签和默认值。它仍然是完全有效的YAML,但是NoSQLBench知道如何以一种有用的方式将这些层组合在一起:

# hello-world.yaml bindings:  cycle: Identity()  cyclename: NumberNameToString()  sample: Normal(100.0D, 10.0D)  randomish_cycle: HashRangeScaled() blocks:  - tags:     phase: schema    params:     prepared: false    statements:     - create-keyspace: |        create keyspace if not exists hello        WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'};     - create-table: |        create table if not exists hello.world (         cycle  bigint,         name   text,         sample double,         primary key(cycle)        );  - tags:     phase: main    statements:     - insert-sample: |        insert into hello.world (cycle,name,sample)         values ({cycle},{cyclename},{sample});       ratio: 4     - read-sample: |        select * from hello.world where cycle={randomish_cycle}       ratio: 1

此版本中的新元素如下:

  • 绑定部分未直接附加到insert-sample语句。由于插入样本语句模板中的名称引用了全局文档范围中提供的绑定名称,因此将使用它们。任何未引用的绑定都只是一个配方。如果不使用它,则不会被调用。

  • 介绍了语句块。这是一种组织语句的方式,以便您可以将它们作为一组进行配置和引用。第一块中的所有DDL语句的语句参数均为prepare:false

  • 使用语句标签。这使我们可以选择活动语句,如我们在下一节中将演示的那样。第一个块中定义的所有语句都将具有块级别的配置,标签阶段为:schema。第二个块中的所有语句(唯一的一条)将具有标记阶段:main

  • 添加了新的语句来说明读取。馈送randomish_cycle绑定的函数将生成一个介于0和当前操作周期之间的值。

  • 为了说明目的,添加了一些比率。在上述比率下,每5次操作将使用4次插入操作,而读取操作将是第5次操作。为每个周期选择的陈述也基于比率确定。

现在我们已经将不同类型的语句组织到了测试工作流的不同部分,我们可以单独调用它们。

注意:重要的是要注意YAML文件中的正确缩进。第一次使用YAML的用户经常为此感到困扰。确保使用空格而不是制表符,并且缩进所有子元素而不是其父元素。如果您以前从未使用过YAML,那么在构建更高级的方案之前先熟悉一下YAML是一个好主意。我们建议使用EAML Goebelbecker撰写的YAML教程:几分钟内入门所需的一切。

创建架构(带有标签)

本部分要求您具有要连接的CQL系统。如果您还没有,则可以使用以下这种方式启动DSE实例:

docker run -e DS_LICENSE=accept --name my-dse -p 9042:9042 -d  datastax/dse-server:6.7.7

让我们创建模式。

nb run driver=cql yaml=hello-world tags=phase:schema host=host # output Logging to logs/scenario_20200205_013213_767.log

请注意,没有控制台输出。这是因为NoSQLBench假定除非您要求,否则您不希望细节受到困扰。如果您确实想查看详细信息,则可以始终抛出-v来提高控制台日志记录级别,从警告到信息,或者-vv进行调试。

打开它

现在,我们还可以执行一些DML操作:

nb run driver=cql yaml=hello-world tags=phase:main host=host cycles=1M # output 01:53:23.719 [scenarios:001] WARN i.e.activityimpl.SimpleActivity - For testing at  scale, it is highly recommended that you set threads to a value higher than the  default of 1. hint: you can use threads=auto for reasonable default, or consult the  topic on threads with `help threads` for more information. ^C (I hit control-C to interrupt it.)

NoSQLBench轻轻地提醒我们打开线程。很好。让我们也将grafana的优势融入其中,这要归功于与prometheus,grafana和石墨出口商的本地docker集成。

nb run driver=cql yaml=hello-world tags=phase:main host=host cycles=1B threads=20x  --docker-metrics# output Logging to logs/scenario_20200205_015849_242.log # every minute you'll see a progress indicator hello-world: 0.36%/Running (details: min=0 cycle=3589475 max=1000000000) hello-world: 0.67%/Running (details: min=0 cycle=6734460 max=1000000000) hello-world: 0.98%/Running (details: min=0 cycle=9777225 max=1000000000)

使用–docker-metrics,在场景开始之前,将在本地系统上组成一个docker堆栈,并预先连接所有度量以自动进入。这是我们刚刚开始使用的功能,但它已经非常有用。

外观如下:

{xunruicms_img_title}

您可以根据需要以其他格式获取结果。如果查看nb help的输出,您将找到各种报告指标的方法,包括石墨,HDR日志,CSV等。

命名方案

如果您希望每个人都可以使用单个命令来运行您的工作负载,包括架构设置和主阶段,则可以执行此操作。NoSQLBench的一项新增功能(称为命名方案)使您可以将命令以如下形式嵌入到工作负载YAML中:

# add this to hello-world.yaml scenarios:   default:     ddl: run driver=cql tags==phase:schema threads==1 cycles==2     dml: run driver=cql tags==phase:main threads=auto cycles=1M

这样,您可以运行以下命令从头到尾运行测试:

nb hello-world host=host

最终结果是,使用了命名方案中的两个模板化命令,而命令行上的任何选项都将其覆盖,而不会被“ ==”锁定。当然,您仍然可以将其与–docker-metrics和其他选项结合使用。您还可以使用default以外的名称来编纂不同的命名方案,并将它们作为工作负载的yaml文件之外的第二个选择器传递。这是一个相对较新的功能,但是已经用于将常见工作负载的目录烘焙到NoSQLBench中。

深入

您可以在http://docs.nosqlbench.io/上访问NoSQLBench文档。

您还可以使用docserver模式访问NoSQLBench的文档,作为该工具本身的一部分。使用与该工具捆绑在一起的文档,您将永远不会怀疑这些文档是否与您使用的版本有关。此模式也是希望UI功能进入NoSQLBench的方式。

您可以使用以下docker命令启动docserver模式:

docker run --rm -a STDOUT --net=host --name nb-docs nosqlbench/nosqlbench docserver http://0.0.0.0:12345/# output Started documentation server at http://0.0.0.0:12345/# ornb docserver # output Started documentation server at http://localhost:12345/

然后,您可以在启动它的系统上的可路由地址处浏览到它。

要完全控制NoSQLBench场景,需要了解一些活动参数,例如线程。强烈建议新用户阅读指南中的基本活动参数。

获取NoSQLBench

您可以在https://github.com/nosqlbench/nosqlbench/releases下载NoSQLBench的最新版本。

未来

NoSQLBench一直在改进。必须首先构建NoSQLBench的核心机制,但是下一个改进的时代将集中在增强用户使用它的方式上。我们一直期待着重大的改进:

  • 改进的文档

  • 内置的改进示例

  • 其他驱动程序

  • 用户界面以补充指南

NoSQLBench允许您查看在有或没有应用程序的情况下数据库的性能。它使得可以迭代数据模型,测量基准性能并计划规模。

无论您要测试的是什么NoSQL数据库,我们都希望使每个人都能使用一组通用的概念和工具来简化测试。为了实现这一目标,我们希望使NoSQLBench建立在用于NoSQL测试的事实上的标准上的工具集。通过将NoSQLBench和CQL驱动程序发布为开源,我们迈出了实现这一愿景的第一步。