热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NoSQLBench入门教程

NoSQLBench发布于2020年3月,它是第一个试图在分布式系统性能测试上做到面面俱到的专业测试工具。同时,它旨在让轻量级的和专业的用户都可以使用。什么是NoSQLBench?


NoSQLBench发布于 2020年 3月,它是第一个试图在分布式系统性能测试上做到面面俱到的专业测试工具。同时,它旨在让轻量级的和专业的用户都可以使用。


什么是 NoSQLBench


当今的开发人员希望创造性能可扩展的应用程序。这就要求使用在多地运行的分布式系统,无论是容器镜像或是跨公共、私有或混合云平台运行的服务。然而,测试这些应用程序往往比想象的要难。


可扩展的系统的性能测试工具一直都很有限。 NoSQLBench发布于 2020年 3月,它是第一个试图在分布式系统上做到面面俱到的专业测试工具。同时,它旨在让轻量级的和专业的用户都可以使用。


NoSQLBench致力于解决其他工具无法解决的测试难题。它允许用户使用目标系统的原生查询语言对访问模式进行建模。它不假定所有 NoSQL数据库只是同一概念的不同版本。用 NoSQLBench进行实际测试并不需要您是专业的程序员,也不需要您传输巨量数据来得到真实的测试数据或操作。


使用 NoSQLBench配置了一个工作负载 workload后,就可以开始测试了。如果需要更改访问模式或操作中使用的数据,只需要更改配置,就可以再次测试。这个过程如此简单,即使是任意大小的数据集也可如此操作。这样用户可以直观的洞察到生产环境中同样的工作负载会是什么样的效果。  


NoSQLBench 具有其他测试工具不具备的功能



  • 基于模版的的过程式数据生成 ——使用函数轻松复制和粘贴海量的虚拟数据集

  • 确定性的工作负载的表现 ——每个周期 cycle都是特定并可重复的

  • 模块化协议支持 ——包括 cql及其他

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

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

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

  • docker-metrics监控界面 ——支持自动运行和配置基于 docker的 grafana功能栈,以实现丰富的监控界面

  • 协调一致的显示高保真的性能指标,支持 coordinated omission,具有多种输出格式和报告选项


这些功能每一个都有单独的重要价值。当把它们合在一起时,他们将形成一个功能强大的工具包,使性能测试对每个人来说都变得更轻松。 NoSQLBench使我们能够专注于测试需求,而不用在测试工具上做出妥协。


这也意味着我们可以避免创建昂贵而复杂的一次性测试工具。在实践中,这些一次性的工具通常有严重的缺陷。毕竟,构建各方面都考虑周全的测试工具并非易事。我们希望通过提供一种工具,它既可以简化处理所有困难的部分而又不剥夺使用者的控制权。


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


核心概念


NoSQLBench的工作负载都被整合在一个 YAML配置文件中。工作负载主要基于语句 (statements),而 YAML格式强调出了这一点。您也可以通过在这些语句中添加绑定 (bindings)来指定用于操作的数据。为了组织和选出起作用的语句,您可以添加标签 (tags)。语句还可以有针对特定语句的参数 (params),比如是否将某一操作标记为幂等操作,或者是否使用预处理语句 (prepared statement)等等。


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驱动程序执行一个活动 (activity)的结果。这个驱动程序不使用任何传输协议,但是它可以将呈现出来的操作打印到控制台以供诊断。想要熟悉数据绑定,这是一种非常常见的方法。如果您针对 Apache Cassandra数据库运行工作负载的话,这也是一种快速检查工作负载将执行哪些操作的方法。为此,您所需要做的就是将 driver = stdout更改为 driver = cql并提供一个可以连接的主机。


这显示了在测试场景中拥有一组通用概念和配置原语的强大所在。虽然这并不意味着不同的系统能够奇迹般地使用彼此的语句形式和协议,但这确实意味着您可以用一种惯用的方式表达它们,并根据目标系统定制您的测试。 NoSQLBench高级驱动程序(如 cql)的工作是将语句模板调整为您正在使用的协议形式。对于严肃的测试来说,如果性能测试工具不允许您使用目标系统的原生语言来控制访问模式和访问操作,那么它一定是无用的。


输出中的每一行表明每个操作的周期数是特定的,这也是每个操作所使用数据的基础。


如果您将达到这种效果所花费的精力与其他任何测试工具进行比较,您就会明白我们为什么要努力构建这个工具包。继续阅读下去,您使用 NoSQLBench的原因会越来越多 !


下一个级别


那么,我们如何利用上面的简单语句,并把它转换成易得易用的工具呢?我们需要允许使用者建立一个完整的测试场景,包括 DDL。幸好这很容易做得到,因为在 NoSQLBench中没有什么语句形式是不能使用的。您只需创建语句来定义您的键空间 (keyspace)和模式 (schema):


下面是我们模式中的工作负载配置 :



# 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不需要绑定 ),以及一个被称为语句参数 (statement parameter)的新 YAML元素。 prepared: false 语句设置禁止自动使用预处理语句,因为您不能对 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语句 : 由于 insert-sample语句模板中的名称引用了全局文档范围中提供的绑定名称,所以会使用它们。任何没有引用的绑定都只是作为一个可选项存在,但并没有被使用。如果没有使用,它就不会被激活。

  • 引入了语句块 (statement blocks):这是组织语句的一种方式,以便您将它们打包进行配置和引用。第一个块中的所有 DDL语句都有一个语句参数 prepared: false

  • 使用语句标签 (statement tags): 这允许我们选择起作用的语句,我们将在下一节中演示。第一个块中定义的所有语句都具有块级配置,带有标签 phase: schema 。第二块中的所有语句 (仅一个 )都有标签 phase: main

  • 添加了一个新语句来实现读取操作:实现 randomish_cycle绑定 (binding)的函数将生成一个介于 0和当前操作周期之间的值。

  • 为了演示的目的,添加了一些比率:按照上述比率,每 5次操作中插入操作占 4次,读取操作为第 5次。为每个周期选择的语句也是基于这个比率。


由于我们已经将不同类型的语句组织到测试工作流程的不同部分中,我们就可以分别调用它们了。


注意:在 YAML文件中,正确的缩进是很重要的。第一次使用 YAML的用户经常会纠结这个问题。确保使用空格键而不是 tab键,并将所有子元素缩进到比父元素靠后的位置。如果您从未使用过 YAML,那么在构建更高级的场景之前先熟悉一下 YAML为好。我们推荐 Eric Goebelbecker的《 YAML Tutorial: Everything You Need to Get Started in Minutes》一文。


创建模式 ( 带有标签 )


本节要求您拥有一个 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 来将命令行日志记录级别从警告 WARNING级别提高到信息 INFO级别,或者添加 -vv 来提高到 DEBUG调试级别。


更进一步


我们现在还可以执行一些 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 的图表功能也用起来。这个参数得益于NoSQLBench 内部通过Docker 容器集成的Prometheus, Grafana 和Graphite Exporter 环境。



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应用栈会在本地生成,并且所有指标都已预先配置好以便自动进入该应用栈。我们刚开始关注到这个特别的功能就已经能感受到它的有用之处了。


下面是它呈现的样子 :



如果需要,您还可以用其他格式获得您的结果。如果您查看了 nb help 的输出,您会看到各种报告指标的方法,包括 graphite、 HDR logs、 CSV等等。


具名场景


如果您希望每个人只需要一个命令就能够运行您的工作负载,包括模式设置和主阶段,您可以这样做。 NoSQLBench新添加的一个名为 named scenario的特性允许您以如下形式将命令嵌入到 workload 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中。


现在动手吧


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


您还可以使用 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/# or
nb docserver
# output
Started documentation server at http://localhost:12345/

然后,您可以在启动它的系统上的一个网络连通的地址看到它。


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


获取 NoSQLBench


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


展望


NoSQLBench一直在改进。首先必须构建 NoSQLBench的核心机制,而下一代的改进将集中于使用户更容易使用 NoSQLBench。我们期待着看到以下进步 :



  • 改进的文档

  • 改进的内置案例

  • 更多的驱动程序

  • 指南的用户界面


NoSQLBench允许您查看在使用或不使用应用程序时数据库的执行情况。它使得迭代数据模型、测量基线性能和计划数据库的规模成为可能。


我们希望让所有人都能使用一套通用的概念和工具,不论你测试的是什么 NoSQL数据库,都使得测试更加容易。为了实现这个目标,我们希望 NoSQLBench所基于的工具集可以成为行业内 NoSQL测试的事实标准。通过将 NoSQLBench和 CQL驱动程序作为开源发布,我们已经迈出了实现这一愿景的第一步。


测试愉快!




推荐阅读
  • Docker 环境下 MySQL 双主同步配置指南
    本文介绍了如何在 Docker 环境中配置 MySQL 的双主同步,包括目录结构的创建、配置文件的编写、容器的创建与设置以及最终的验证步骤。 ... [详细]
  • 在 CentOS 7 环境中使用 MySQL 5.6 镜像启动数据库时遇到权限问题,本文将详细探讨并提供解决方案。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 本文详细解析了 Yii2 框架中视图和布局的各种函数,并综述了它们在实际开发中的应用场景。通过深入探讨每个函数的功能和用法,为开发者提供了全面的参考,帮助他们在项目中更高效地利用这些工具。 ... [详细]
  • 在本文中,我们将探讨如何在Docker环境中高效地管理和利用数据库。首先,需要安装Docker Desktop以确保本地环境准备就绪。接下来,可以从Docker Hub中选择合适的数据库镜像,并通过简单的命令将其拉取到本地。此外,我们还将介绍如何配置和优化这些数据库容器,以实现最佳性能和安全性。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • Docker入门指南:初探容器化技术
    Docker入门指南:初探容器化技术摘要:Docker 是一个使用 Go 语言开发的开源容器平台,旨在实现应用程序的构建、分发和运行的标准化。通过将应用及其依赖打包成轻量级的容器,Docker 能够确保应用在任何环境中都能一致地运行,从而提高开发和部署的效率。本文将详细介绍 Docker 的基本概念、核心功能以及如何快速上手使用这一强大的容器化工具。 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • 解读中台架构:微服务与分布式技术的区别及应用
    中心化与去中心化是长期讨论的话题。中心化架构的优势在于部署和维护相对简单,尤其在服务负载较为稳定的情况下,能够提供高效稳定的性能。然而,随着业务规模的扩大和技术需求的多样化,中心化架构的局限性逐渐显现,如扩展性和故障恢复能力较差。相比之下,微服务和分布式技术通过解耦系统组件,提高了系统的灵活性和可扩展性,更适合处理复杂多变的业务场景。本文将深入探讨中台架构中微服务与分布式技术的区别及其应用场景,帮助读者更好地理解和选择适合自身业务的技术方案。 ... [详细]
  • Kubernetes中为容器设置主机名解析配置
    在某些特定场景中,例如请求的域名为内部网络域名或需要通过透明代理/正向代理才能访问时,容器无法直接使用宿主机的 hosts 文件。为了实现主机名解析,可以在 Kubernetes 的 Pod YAML 文件中定义 hosts 条目,从而确保容器能够正确解析所需的主机名。 ... [详细]
  • 从用户转型为开发者:一场思维升级的旅程 | 专访 StarRocks Committer 周威
    从用户转变为开发者,不仅是一次角色的转换,更是一场深刻的思维升级之旅。本次专访中,StarRocks Committer 周威分享了他如何在这一过程中逐步提升技术能力与思维方式,为开源社区贡献自己的力量。 ... [详细]
  • 本文探讨了将PEBuilder转换为DIBooter.sh的方法,重点介绍了如何将DI工具集成到启动层,实现离线镜像引导安装。通过使用DD命令替代传统的grub-install工具,实现了GRUB的离线安装。此外,还详细解析了bootice工具的工作原理及其在该过程中的应用,确保系统在无网络环境下也能顺利引导和安装。 ... [详细]
author-avatar
葛菁昱
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有