Skip to content

使用 YCSB 测试 TerarkMongo

rockeet edited this page Aug 23, 2018 · 1 revision

English

1. 下载 TerarkMongo

目前我们提供了一个静态编译版本的 TerarkMongo 供用户进行测试,请通过下方的链接进行下载。

下载 mongod-Linux-x86_64-g++-4.8.tar.bz2

完成下载后,您可以直接安装运行即可。

2. 创建测试所需的数据库以及表

  • 启动 Mongod:
cd /path/to/mongod
LD_LIBRARY_PATH=$PWD/lib ./mongod -f config # `config` 是默认的配置文件

配置文件说明:

net:
  bindIp: "0.0.0.0"
  port: 27017
storage:
  dbPath: "data" # 必须提前创建数据目录
  engine: "rocksdb"
  rocksdb:
    maxWriteMBPerSec: 200 # 文件写入速度限流,根据 SSD 的性能调整
    terarkdb:
      enabled: true
      localTempDir: "data/terark-tmp" # 必须提前创建
      cleanTempDir: true
      softZipWorkingMemLimit: 17179869184  # 16G,用总内存的 1/8
      hardZipWorkingMemLimit: 34359738368  # 32G,总内存的 1/4
      smallTaskMemory: 1073741824  # 1G,总内存的 1/64
  • 创建测试用户及测试数据库
cd /path/to/mongo
./mongo
use database
db.createUser({user: "root", pwd: "root", roles: [ ]})
db.auth("root", "root")
db.createCollection("usertable")

3. 准备原始数据

用户可以根据自己的需要,自行选择测试数据集,一般来说要求测试数据集每行是一条完整记录,强烈建议使用真实数据进行测试。

我们为用户提供 wikipedia 的全量数据(103GB),经过 xz 高度压缩后大约 17GB,如果需要请联系我们获取下载地址。

4. 下载并编译 Terark 修改版的 YCSB

git clone git@github.com:Terark/YCSB.git
cd YCSB
mvn -pl com.yahoo.ycsb:mongodb-binding -am clean package

这个步骤会编译必须的一些模块。

5. 开始测试

整个测试过程,可以大致分为三个阶段,分别是:

  • 数据加载(只写)
  • 随机读测试(只读)
  • 读写混合测试

5.1. 配置文件准备

根据上面三个阶段,我们可以在YCSB根目录创建三个不同的配置文件,如:

wikipedia_load.conf, wikipedia_read.conf,wikipedia_readwrite.conf

完整的配置选项参考这里

每个配置文件的配置项目各不相同, 参数的大致说明:

workload:指定我们定制的 workload:FileWorkload
datafile:源数据的路径
fieldnames:每行数据中使用指定分隔符分割的数据项,每一个使用“,”分割,数量需要和源数据中数据项相同
writerate:读写比例
batchread:当其等于 1 时,使用 read;大于 1 时,使用 batchRead
delimiter:源数据中分割各数据项的分割符,如:“\t”,“\0”
mongodb.upsert=true:在混合测试中会把随机读出的数据插入到一个临时表中,而可能会导致主键冲突,故将 upsert 设为 true

mongodb.url: 参考 YCSB/MongoDB Configuration Parameters

5.2. 加载数据

配置文件示例(wikipedia_load.conf ):

# wikipedia_load.conf

# 需要插入的数据条数,一般是数据源的行数
recordcount=38508221

workload=com.yahoo.ycsb.workloads.FileWorkload


mongodb.url=mongodb://root:root@127.0.0.1:27017/database
mongodb.upsert=true

# 准备插入的数据源
datafile=/path/to/wikipedia.txt
# 数据源文件中,单行数据代表的各个字段名称
# 对于 wikipedia 数据可以是:cur_id,cur_namespace,cur_title,cur_text,cur_comment,cur_user,cur_user_text,cur_timestamp,cur_restrictions,cur_counter,cur_is_redirect,cur_minor_edit,cur_random,cur_touched,inverse_timestamp
fieldnames=fieldname1,fieldname2,fieldname3,fieldname4,fieldname5,fieldname6,...
# 单行数据中多个字端的字段分隔符
delimiter=\t

启动脚本:

./bin/ycsb load mongodb -s -P wikipedia_load.conf -threads 16 > load_wikipedia_thread_16.txt

输出文件在测试完成后会输出统一的统计信息,在测试过程中控制台会显示实时写入速度,和预估的写入剩余时间。

5.2. 随机读测试

配置文件示例(wikipedia_read.conf ):

# wikipedia_read.conf
# 数据源的行数,用来内部计算一些hash值试用,与其他阶段数值需要相同
recordcount=38508221

# 总操作数,自由定义
operationcount=64000000
workload=com.yahoo.ycsb.workloads.FileWorkload

# 使用 uniform 分布进行读测试
requestdistribution=uniform

mongodb.url=mongodb://root:root@127.0.0.1:27017/database
mongodb.upsert=true

# 批量度设置,一次读取多少数据
batchread=1

启动测试脚本:

./bin/ycsb run mongodb -s -P wikipedia_read.conf -threads 16 > read_wikipedia_thread_16.txt

5.4. 读写混合测试

配置文件示例(wikipedia_readwrite.conf ):

# wikipedia_readwrite.conf
# 数据源的行数,用来内部计算一些hash值试用,与其他阶段数值需要相同
recordcount=38508221
# 总操作数,自由定义
operationcount=64000000
workload=com.yahoo.ycsb.workloads.FileWorkload

# 使用 uniform 分布进行读测试
requestdistribution=uniform

mongodb.url=mongodb://root:root@127.0.0.1:27017/database
mongodb.upsert=true

# 写占的比例,0.05 表示 5%
writerate=0.05
# 批量度设置,一次读取多少数据
batchread=1

启动测试脚本:

./bin/ycsb run mongodb -s -P wikipedia_readwrite.conf -threads 16 > readwrite_wikipedia_thread_16.txt

读写混合测试说明:

  1. 程序会在每次请求前生成 KEY 进行随机读取
  2. 读取到的数据,会按照预定的比例写回到另一个临时表中(usertable_for_write)
  3. 每次开始测试之前,需要先清空临时表 usertable_for_write