一、前言

巨杉数据库(SequoiaDB是国内第一款新一代文档型分布式数据库,巨杉数据库由巨杉软件完全自主研发,拥有完全自主知识产权,不基于任何其它的开源项目。SequoiaDB数据库是为分布式存储、并行计算模型、云计算资源条件下搭建和运行应用程序而设计的。

作为一款操作性数据库,巨杉数据库在海量数据实时读写场景具有得天独厚的优势,拥有较高的读写性能。

为便于跟其他同类数据库进行比较,在本篇文章中,我们介绍一个专门用于对NoSQL数据库产品进行性能测试的工具——YCSB。

二、YCSB介绍

YCSB全称为Yahoo! Cloud Serving Benchmark,是雅虎开源的一款通用的性能测试框架。YCSB不仅安转简单,还可以自由扩展测试数据类型和支持的数据库产品。通过对其进行扩展,YCSB可以支持对多个不同的NOSQL产品进行性能测试,通过测试结果可以了解数据库在并发写入、读取、更新时的一些指标,比如吞吐量、操作延迟等。

YCSB是由Java语言实现的性能测试工具,其架构如图一所示:

图一 YCSB架构图

Workload Executor是产生应用负载的,DB Interface Layer是将特定数据库的API转为YCSB的API,用户可以自定义负载和数据库。

YCSB包括两个组件:

YCSB客户端,一个可扩展的工作负载生成器;

核心工作负载,一组由YCSB客户端执行的工作负载场景。

YCSB包括一组核心工作负载,其中定义了基本的性能测试场景。利用这些工具负载得到的性能数据,可以对大多数不同系统的性能做出权衡。

目前,YCSB的核心工作负载包括6种,其中的5种如表一所示:

表一 YCSB核心工作负载

用户可以自定义不同操作(read、update、scan、insert)的比例,选择操作目标记录的分布:Zipfian(随机选择记录,存在热记录)、Uniform(等概率随机选择记录)和Latest(近期写入的记录是热记录)。

三、SequoiaDB测试步骤

利用YCSB对SequoiaDB进行测试时,可以按照本章的步骤进行。这里的测试步骤假定只需要运行一个YCSB客户端,因为对于一个9-12台机器的集群规模来说,一个YCSB客户端已经足够。对于更大规模的集群,为了产生足够大的测试压力,可能需要同时运行多个YCSB客户端。但是,在运行一个YCSB客户端不能得到理想的测试结果时,可以尝试并行地运行多个YCSB客户端来提升测试性能。

3.1 安装数据库集群

在测试的硬件环境上安装SequoiaDB,并部署好集群。在运行YCSB客户端之前,需要先建立表来存放数据,对应到SequoiaDB中就是集合,默认情况下,完整的集合名称为ycsb.usertable,ycsb为集合空间,usertable为集合。

为了充分发挥SequoiaDB的分布式处理能力,测试数据需要尽可能打散到多个数据分区组里面。因此,在建立集合的时候需要注意指定Domain参数,Domain值为包含SequoiaDB集群中所有数据节点的数据域。假如集群中包含三个数据分区组:datagroup1、datagroup2、datagroup3,创建集合的语句为:

  1. > var global_domain = db.createDomain("global_domain ", ['datagroup1',' datagroup 2',' datagroup 3'], {AutoSplit:true})
  2. > db.createCS("ycsb", {Domain:" global_domain "})
  3. > db.ycsb.createCL("usertable", {ShardingKey:{_id:1}, ShardingType:"hash"})

3.2 实现DB接口层

目前版本的YCSB默认不支持SequoiaDB,不能直接用于SequoiaDB的测试,但是YCSB作为通用的测试框架,提供了一套方法对其本身进行扩展。所以,在开始测试前,我们需要按照YCSB的扩展要求实现其对SequoiaDB的支持。

DB接口层是一个java类,当YCSB客户端发起读、写、更新、删除请求时,DB接口层负责将这些查询转化为对应数据的API。当运行YCSB客户端时,需要在命令行指定DB接口层的类名,客户端会动态地加载数据库的接口类。命令行或者负载文件中指定的参数值也会传递给DB接口类实例。

DB接口层隐藏了特定数据库的实现细节,当实现了DB接口层后,可以通过YCSB客户端对数据库进行性能测试而不用关心数据库的具体实现,且不需要改变。

DB接口层是一个提供了数据库read、insert、update、delete、scan接口的虚类。因此,需要使用SequoiaDB的java驱动实现这几个方法。创建一个工程,新建一个名为SequoiaDBClient的类,并让其继承com.yahoo.ycsb.DB。

首先,实现init方法。init方法主要用于对数据库对象进行初始化。由于我们使用了SequoiaDB连接池的技术,因此,需要在init方法中进行初始化。连接池初始化的代码示例如下:

  1. try {
  2. SequoiadbOption sdbOption = new SequoiadbOption();
  3. sdbOption.setMaxConnectionNum(maxConnectionnum);
  4. sdbOption.setMaxIdeNum(maxidleconnnum);
  5. sdbOption.setRecheckCyclePeriod(period * );
  6. ConfigOptions connectOpt = new ConfigOptions();
  7. connectOpt.setConnectTimeout();
  8. connectOpt.setMaxAutoConnectRetryTime();
  9. ArrayList<String> urls = new ArrayList<String>();
  10. if (hosts != null){
  11. for (int i= ;i< hosts.length;++i){
  12. urls.add(hosts[i]+":"+port);
  13. System.out.println(i+ "url" + urls.get(i));
  14. }
  15. }else{
  16. String[] urlset = surl.split(",");
  17. for (int i= ;i< urlset.length;++i){
  18. urls.add(urlset[i]);
  19. System.out.println(i+ "url" + urls.get(i));
  20. }
  21. }
  22. sdbpools = new SequoiadbDatasource(urls,"","", connectOpt,sdbOption);
  23. } catch (Exception e) {
  24. System.err.println("Could not initialize Sequoiadb connection pool for Loader: "
  25. + e.toString());
  26. e.printStackTrace();
  27. throw new DBException(e.toString());
  28. }

然后,实现查询和更新方法。需要实现的方法为:

  1. //Read a single record
  2. public int read(String table, String key, Set<String> fields, HashMap<String,String> result);
  3.  
  4. //Perform a range scan
  5. public int scan(String table, String startkey, int recordcount, Set<String> fields, Vector<HashMap<String,String>> result);
  6.  
  7. //Update a single record
  8. public int update(String table, String key, HashMap<String,String> values);
  9.  
  10. //Insert a single record
  11. public int insert(String table, String key, HashMap<String,String> values);
  12.  
  13. //Delete a single record
  14. public int delete(String table, String key);

  

每个方法都包括一个集合名称和一个记录键值的参数,对于读操作(read、scan)还有读操作的返回字段值及返回结果。update和insert还包括字段名和字段值得HashMap。

SequoiaDB的read、update、insert、delete使用方法请参考官网Java驱动开发文档。

最后,将以上的实现打成jar包sequoiadb-binding-0.1.4.jar,并放到ycsb-0.1.4目录下。修改bin/ycsb源文件,在dict DATABASES中新增产品SequoiaDB,如图二所示:

图二 ycsb源文件修改

也可以从SequoiaDB获取YCSB测试工具包,我们已经依据YCSB的结构实现了DB Interface Layer,而且我们根据需要对开源YCSB测试工具包进行了整理。我们将与YCSB自身实现相关的文件放在ycsb目录下,将产品实现相关包放在product目录下,在测试相关产品时,先执行ycsb-0.1.4目录下的copy.sh将相关产品的包拷入ycsb目录下。

3.3 配置工作负载

工作负载定义了loading阶段将要装载到数据库中的数据和transaction阶段针对初始化测试数据将要执行的操作。工作负载可以通过参数文件进行定义,也可以在命令行指定。当同时指定时,命令行参数会生效。如果使用参数文件,它在测试的两个阶段都会用到。

参数文件可配置项如表二所示:

参数名

说明

fieldcount

单条记录字段数(默认值:10)

fieldlength

每个字段大小(默认值:100字节)

readallfields

是否读取所有记录(默认值:true)

readproportion

读比例(默认值:0.95)

updateproportion

更新比例(默认值:0.05)

insertproportion

插入比例(默认值:0)

scanproportion

扫描比例(默认值:0)

readmodifywriteproportion

同一记录读、修改、回写比例(默认值:0)

requestdistribution

记录选择策略:uniform,zipfian,latest(默认值:uniform)

maxscanlength

最大scan记录数(默认值:100)

scanlengthdistribution

scan记录选择策略(默认值:uniform)

insertorder

记录插入策略:ordered,hashed(默认值:hashed)

operationcount

操作执行数

maxexecutiontime

最大执行时间,单位:秒

table

表名(默认值值usertable)

recordcount

初始化记录条数(默认值:0)

表二 参数说明

另外,与SequoiaDB实现相关的参数包括:

参数名

说明

sequoiadb.host

SequoiaDB协调节点所在主机(默认值:localhost)

sequoiadb.port

SequoiaDB协调节点端口号(默认值:11810)

sequoiadb.insertmode

数据装载方式,支持bulk,single

sequoiadb.bulknumber

批量插入记录数,insertmode为bulk时生效

表三 SequoiaDB相关参数

实践中建议将重要参数放置在参数文件中,而不是通过命令行的方式指定,便于复用。

3.4 选择合适的运行参数

通过参数文件,我们可以定义一个特定的工作负载,除此之外,还有其他的参数可以在执行性能测试时指定,即运行参数。运行参数在运行YCSB客户端时通过命令行指定。运行参数包括:

-threads:客户端线程数。默认情况下,YCSB客户端只运行一个线程,可以通过增加线程数提高整体吞吐量。

-target:每秒操作数目标值。

-s:状态(status)。YCSB客户端定期打印状态,默认情况下,每10s会将运行状态打印出来。

3.5 初始化测试数据

工作负载有两个可执行阶段:初始化测试数据(loading phase)和测试执行(transaction phase)。初始化测试数据使用如下命令:

  1. ./bin/ycsb load sequoiadb workloads/sequoia1 -s

  

数据插入过程需要关注YCSB客户端定期打印的状态信息,如果需要保存状态信息,可以将输出结果重定向到文件。以95%update5%read为例,数据装载过程的状态信息如图三所示:

图三 数据装载过程状态信息

数据装载性能也是数据库性能的一个参考指标,我们需要关注的是INSERT AverageLatency,代表的是插入操作的平均时延,最后的结果会以Excel表的形式导出,方便后续进行结果的统计分析。

3.6 执行测试

数据装载完成后,可以通过如下命令执行测试:

  1. ./bin/ycsb run sequoiadb workloads/sequoia1 -s

  

测试过程也会定期打印状态信息,以95%update5%read为例,测试过程的状态信息如图四所示:

图四 测试执行过程状态信息

测试执行完后,测试结果也会以Excel的形式导出,导出文件路径和导出文件名通过参数exportfile进行配置。测试结果内容如图五所示:

图五 YCSB测试结果内容

从测试结果可以得到总的吞吐量(Throughput)、总耗时(RunTime)以及每一类操作的操作数(Operations)、平台时延(AverageLatency)、最大时延(MaxLatency)、最小时延(MinLatency)等,也可以查看指标随时间序列的变化情况。

四、测试案例

YCSB测试结果中包含多个测试指标值,这些指标值用于评估NoSQL数据库性能时能从各个不同方面对所测试产品进行评估。因此,在用YCSB对SequoiaDB进行测试时,应根据测试目的进行测试规划,并针对性地进行测试结果分析。

若需要跟其他同类产品进行比较,可以使用YCSB默认支持的6种核心工作负载;若要评估SequoiaDB的水平扩展能力,可以以某一个工作负载(比如只读场景)为基础,通过水平增加物理服务器数量,分析性能随物理服务器的变化情况。本文中我们以YCSB常见的几个工作负载为例,说明利用YCSB对SequoiaDB的整体性能进行评估。

4.1 测试环境

数据库服务

6台服务器

组件

配置

CPU

4 core

内存

16 GB

磁盘

300GB * 1

OS

SUSE Linux Enterprise Server (SLES) 12 SP1

测试客户端

服务器类型

机器配置

节点数

测试客户端

4C,16G,100G存储,Suse Linux 12 SP1

1

软件及版本

软件项

版本

说明

SequoiaDB数据库

2.0

广州巨杉软件开发有限公司发行的分布式数据库

4.2 物理部署

每台测试机器上部署一个数据节点,每个数据节点构成单独的数据节点组。每个机器上都部署有协调节点,可以连接到任意一台物理机上进行数据访问。

图六 SequoiaDB物理部署

4.3 测试结果

测试场景包括插入、单纯查询、查询为主、查询更新平衡、更新为主、单纯更新六个场景,结果如表四、图七所示:

场景

场景说明

测试结果
(单位:TPS/S)

插入

批量插入

122249

单纯查询

100%查询

30650

查询为主

95%查询+5%更新

30030

查询更新平衡

50%查询+50%更新

20033

更新为主

5%查询+95%更新

18909

单纯更新

100%更新

18131

表四 YCSB测试结果

图七 YCSB测试结果

从结果中可以看到,在当前硬件环境条件下,SequoiaDB的插入性能达到122249TPS/S,单纯查询和以查询为主的性能都超过30000TPS/S,单纯更新性能达到18131TPS/S。整体性能非常优秀。

YCSB测试过程中YCSB测试客户端的资源利用情况为:

图八 YCSB测试客户端资源利用情况

SequoiaDB集群服务器资源利用情况为:

图九 SequoiaDB集群服务器资源利用情况

可以看到,由于YCSB测试客户端的CPU利用率几乎跑满,成为性能测试的瓶颈。因此,在改善现有硬件测试环境的情况下,可以提升现有性能测试结果。

五、结论

SequoiaDB完善的功能和良好的可扩展性不仅使其可以使用通用的性能测试工具进行性能评估,也为SequoiaDB的应用开发提供了极大便利。从整体上来看,SequoiaDB性能表现出色,并且还根据国内实际的应用场景做了非常多的本地化优化工作,使得用户在使用SequoiaDB来构建大数据平台时,能在性能和功能上都得到一个比较好的体验。

SequoiaDB巨杉数据库2.6最新版下载
SequoiaDB巨杉数据库技术博客
SequoiaDB巨杉数据库社区

【操作教程】利用YCSB测试巨杉数据库性能的更多相关文章

  1. 利用http_load测试Web引擎性能

    http_load是基于linux平台的性能测试工具,它体积非常小,仅100KB.它以并行复用的方式运行,可以测试web服务器的吞吐量与负载. 一.获得http_load httpd_load的官方站 ...

  2. python测试mysql数据库性能(二)

    一,普通写入数据库 二,批量写入数据库 三,普通写入数据库添加事务 config = { 'host': 'localhost', 'port': 3306, 'database': 'test', ...

  3. 巨杉Tech|SequoiaDB 巨杉数据库高可用容灾测试

    数据库的高可用是指最大程度地为用户提供服务,避免服务器宕机等故障带来的服务中断.数据库的高可用性不仅仅体现在数据库能否持续提供服务,而且也体现在能否保证数据的一致性. SequoiaDB 巨杉数据库作 ...

  4. jmeter测试 常用数据库的性能

    在线程组中设置线程属性,执行次数=线程数*循环次数 本次JOB共插入了5W条记录,从14:56:46开始到15:01:29结束共耗时343s,平均145.8条/s. 同理sql sever:从15:2 ...

  5. 入门级----黑盒测试、白盒测试、手工测试、自动化测试、探索性测试、单元测试、性能测试、数据库性能、压力测试、安全性测试、SQL注入、缓冲区溢出、环境测试

    黑盒测试 黑盒测试把产品软件当成是一个黑箱子,只有出口和入口,测试过程中只要知道往黑盒中输入什么东西,知道黑盒会出来什么结果就可以了,不需要了解黑箱子里面是如果做的. 即测试人员不用费神去理解软件里面 ...

  6. 【巨杉数据库SequoiaDB】巨杉Tech | 分布式数据库Sysbench测试最佳实践

    引言 作为一名DBA,时常需要对某些数据库进行一些基准测试,进而掌握数据库的性能情况.本文就针对sysbench展开介绍,帮助大家了解sysbench的一般使用方法. ​ sysbench简介 什么是 ...

  7. 【SQL server初级】数据库性能优化三:程序操作优化

    数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第三部分 数据库性能优化三:程序操作优化 概述:程序访问优化也可以认为是访问SQL语句的优化,一个好的SQL语句是可以减少 ...

  8. 【转】dd命令详解及利用dd测试磁盘性能

    dd命令详解及利用dd测试磁盘性能   linux下dd命令详解 名称: dd 使用权限: 所有使用者 manpage 定义: convert and copy a file 使用方式: dd [op ...

  9. SequoiaDB 巨杉数据库Docker镜像使用教程

    为方便用户快速体验,SequoiaDB 巨杉数据库提供基于 Docker 的镜像.本文介绍如何在 Docker 环境下部署 SequoiaDB 分布式集群环境.   集群规划 我们准备在五个容器中部署 ...

随机推荐

  1. Servlet的优化.GenericServlet

    如何更好的使用servlet?GernericServlet可以由自己仿照一个出来,下面就是介绍了如何写这样的一个类 1.init方法 妥善的保存config对象 2.空参init方法,为了防止开发人 ...

  2. springMvc注解之@ResponseBody和@RequestBody

    简介 springmvc对json的前后台传输做了很好封装,避免了重复编码的过程,下面来看看常用的@ResponseBody和@RequestBody注解 添加依赖 springmvc对json的处理 ...

  3. Linux services, runlevels, and rc.d scripts

    Reference: [1] https://www.linux.com/news/introduction-services-runlevels-and-rcd-scripts A Linux se ...

  4. 《算法4》1.5 - Union-Find 算法解决动态连通性问题,Python实现

    Union-Find 算法(中文称并查集算法)是解决动态连通性(Dynamic Conectivity)问题的一种算法,作者以此为实例,讲述了如何分析和改进算法,本节涉及三个算法实现,分别是Quick ...

  5. ASP.NET Core MVC 模型绑定用法及原理

    前言 查询了一下关于 MVC 中的模型绑定,大部分都是关于如何使用的,以及模型绑定过程中的一些用法和概念,很少有关于模型绑定的内部机制实现的文章,本文就来讲解一下在 ASP.NET Core MVC ...

  6. 开涛spring3(6.3) - AOP 之 6.3 基于Schema的AOP

    6.3  基于Schema的AOP 基于Schema的AOP从Spring2.0之后通过“aop”命名空间来定义切面.切入点及声明通知. 在Spring配置文件中,所以AOP相关定义必须放在<a ...

  7. 纯css实现多标签浮动居中(任意个数)

    在做的一个网页上有一块要用浮动标签,具体就是网页底部有未知数量,未知尺寸的元素要水平居中,有点类似于分页器. 首先,我们先新建一个容器con,就是标签的爸爸,用来控制标签在页面的位置,.father{ ...

  8. Virtualbox让kali虚拟机共享主机的无线网络连接

    今天在测试虚拟机下安装kali系统时,遇到一个问题,默认安装完kali系统后,虚拟机不能上网.虚拟机网络配置使用的是默认的网络地址转换(NAT)选项. 网上查了很多,都说使用NAT模式时虚拟机不用做任 ...

  9. Java常用类之【Math类、Random类、System类、Runtime类】

    一.Math类 Math类 [绝对值]Math.abs();//返回对应类型的绝对值 [最大值和最小值]Math.max(int a, int b) ,Math.min(int a,int b);(其 ...

  10. wpf XAML xaml 进行 数据绑定,Resource DataContext ElementName

    先做个声明:这里绑定都在前台实现,至于后台怎么写,那比前台简单多了,但更常用的是xaml中绑定.我们分析下最简单的字符串绑定来弄清楚原理,其他的类推就是. 数据绑定主要是要弄清楚两个东西,一个是源So ...