K6 在 Nebula Graph 上的压测实践

背景
对于数据库来说,性能测试是一个非常频繁的事情。优化查询引擎的规则,调整存储引擎的参数等,都需要通过性能测试,查看系统在不同场景下的影响。
即便是同样的代码,同样的参数配置,在不同的机器资源配置,不同的业务场景下也有较大的区别,记录一下内部的压测实践过程,有一个参考。
本文中操作系统为 x86 架构 CentOS 7.8。
部署 nebula 的机器配置为 4C 16G 内存,SSD 磁盘,万兆网络。
工具
nebula-ansible 用于部署 nebula 服务
nebula-importer 用于导入数据到 nebula 集群中
k6-plugin k6 压测工具,里面使用 go 客户端向 nebula 集群发起请求
nebula-bench 整合了生成 LDBC 数据集,数据导入和压测。
ldbc_snb_datagen_hadoop LDBC 数据生成工具
概述
数据使用 ldbc_snb_datagen 自动生成的 LDBC 数据集,整体流程如下图。

部署拓扑,使用 1 台机器作为压测负载机,3 台机器组成一个 nebula 集群

为了方便监控,压测负载机还部署了:
Promethues
Influxdb
Grafana
node-exporter
nebula 机器上还部署了:
node-exporter
process-exporter
具体步骤
使用 nebula-ansible 部署 nebula
先初始化用户,打通 ssh
分别登录 192.168.8.60,192.168.8.61,192.168.8.62,192.168.8.63,创建 vesoft 用户,加入 sudoer 中,并设置 NOPASSWD。
登录 192.168.8.60,打通 ssh
下载 nebula-ansible,安装 ansible,修改 ansible 配置
inventory.ini 示例
安装并启动 nebula
部署监控
为了方便部署,使用 Docker-Compose 运行,需要先在机器上安装 Docker 和 Docker-Compose。
登录 192.168.8.60 压测机
配置 grafana 的数据源和 dashboard,具体见 https://github.com/vesoft-inc/nebula-bench/tree/master/third 。
生成 LDBC 数据集
导入数据
以下是 .env 示例
导入过程中,可以重点关注以下网络带宽和磁盘 io 写。


执行压测
会根据 scenarios 里的代码,自动渲染出 js 文件,然后使用 k6 压测所有场景。
执行后,js 文件和压测结果都在 output 文件夹中。
其中 latency
是服务端返回的 latency 时间, responseTime
是客户端从发起 execute 到接收的时间,单位 us。
也可以对单个场景压测,不断调整配置参数,来进行对比。
并发读
同时可以观察监控的各个指标。

checks 是校验请求是否执行成功,如果执行失败,会在 csv 中保存失败的错误消息。
grafana 上 k6 的监控数据

并发写
可以手动修改一下 js 文件,调整 batchSize
当 batchSize 为 300,并发为 400 的时候,就会错误产生。
发现是 E_CONSENSUS_ERROR
,应该是并发大的时候,raft 的 appendlog buffer overflow 了,可以调整相关的参数。
总结
使用 LDBC 作为标准数据集,数据特征会标准一些,可以生成更多的数据比如 10 亿点,而数据结构是一样的。
使用 k6 作为压测负载工具,二进制相比 Jmeter 更方便,而且因为 k6 底层使用 Golang 的 goroutine,相比 Jmeter 使用更少的资源。
通过工具,模拟各种场景或者调整 nebula 的参数,可以更好的使用到服务器资源。
《开源分布式图数据库 Nebula Graph 完全指南》,又名:Nebula 小书,里面详细记录了图数据库以及图数据库 Nebula Graph 的知识点以及具体的用法,阅读传送门:https://docs.nebula-graph.com.cn/site/pdf/NebulaGraph-book.pdf
交流图数据库技术?加入 Nebula 交流群请先填写下你的 Nebula 名片,Nebula 小助手会拉你进群~~
评论