YCSB环境搭建与新数据库测试的详细指导
写在文章前。由于首次接触YCSB等测试架构,所以在搭建环境的过程中遇到了大量的问题,也通过解读源码等方法逐个解决。国内外的资料对相关测试也就是点到为止,并没有很好的指导作用。所以希望本文能为后人的搭建提供更好的帮助。
RocksDB搭建总结
从mac虚拟机上迁移到Windows上,RocksDB环境又重装了一遍,我把装机过程总结如下(本次安装使用了ubuntu16.04的server 更轻量级):
这里大量参考了
https://www.jianshu.com/p/f233528c8303在此表示感谢
-
首先安装java环境(这个很简单就不多说了)
-
然后安装g++:这个默认会安装最新环境,所以ok
apt-get install g++
- 下面装依赖环境
apt-get install build-essential
apt-get install libsnappy-dev zlib1g-dev libbz2-dev libgflags-dev
- 后面在本地的某个文件夹下下载rocksdb
git clone https://github.com/facebook/rocksdb.git
image.png
- 编译静态库,release mode,获得librocksdb.a
make static_lib
- 编译动态库,获得librocksdb.so,release mode,获得lbrocksdb.so
make shared_lib
- 此时我们需要将.so文件放到属于它的位置,方便后续编译
于是我在文件夹中找到属于.so文件的路径
image.pngcp -r include/ /usr/include
cp librocksdb.so.6.1.0 /usr/lib/x86_64-linux-gnu
ln -s /usr/lib/x86_64-linux-gnu/librocksdb.so.6.1.0 /usr/lib/x86_64-linux-gnu/librocksdb.so.6
ln -s /usr/lib/x86_64-linux-gnu/librocksdb.so.6.1.0 /usr/lib/x86_64-linux-gnu/librocksdb.so
ld config
这样就ok。
YCSB搭建总结
这里的YCSB搭建总体上来说不是简单的使用其自带库,而是将自己DIY的数据库放入到框架中。然而这个过程非常耗时耗力,所以我将其过程进行一些总结。(全是泪,全是坑)
首先是搭建问题。这个YCSB源码包比较大,所以直接下载会非常耗时,有可能会中断,所以我采用了如下方法:
> git clone https://github.com/brianfrankcooper/YCSB.git
> git checkout 0.15.0
使用git还是可以满足我们的要求的。得到YCSB目录
,下图为目录中的具体内容。
之后我们可以对RocksDb进行测试。
此时我们先不用纠结YCSB的具体是如何实现的,我们先学会如何使用。
- 首先我们需要对RocksDB进行编译操作:
mvn -pl com.yahoo.ycsb:rocksdb-binding -am clean package
此时我们会得到命令行的反馈:
image.png说明我们对RocksDB的maven工程编译成功,这个时候我们会发现在rocksdb的目录下多了target
目录。这个目录里面放了我们所需的****.jar
等后期测试所必须的文件。
- 之后我们就可以运行我们的测试指令了。
./bin/ycsb load rocksdb -s -P workloads/workloadc -p rocksdb.dir=/tmp/ycsb-rocksdb-test
image.png
这里我们输入上面的指令,这里稍微进行一些介绍,load
指装载指令,即将测试所需的data装入到数据库中(这里特指insert操作),而我们这里使用了workloadb类型的工作(这里有A到F六种操作,具体的代表网上有很多说明),而-p
可以显示修改YCSB内置的默认配置。而后面的-p
代表rocksdb的工作目录(就是那些log日志等等文件存放的位置); -s
代表将结果打印出来,也可以使用s > logs/workloadB/transaction-workloadAA.log
这种来将结果保存到特定文件中。
之后我们得到如下:
image.png根据图我们能够看到对于c工作量来说,我们插入了1000条记录并且得到了测试时间、吞吐量等等。
之后执行
/bin/ycsb run rocksdb -s -P workloads/workloadc -p rocksdb.dir=/tmp/ycsb-rocksdb-test
我们对载入的数据进行运行操作,即进行查询。得到:
image.png由于C是只读型,100% Reads。所以我们在run的时候只可以看到read的效率。得到了吞吐量等结果。
上述内容就是测试的大致过程。其中我在翻看源码的时候还发现了在workload文件中可以对配置文件进行修改(在core文件中也有一些可调整的配置文件),以定制测试数据内容。
image.png image.png配置DIY数据库进行测试
上面介绍了如何使用YCSB来进行测试工作,而我们大多数时候要将自己设计的存储系统放置于此进行测试。此时我们需要修改各种配置文件并将自己的数据库完美的放置于此系统下。
首先,我们要了解YCSB的工程结构。
在我查阅了资料并对结构了解后,我发现YCSB目录下拥有很多数据库的子目录。
image.png而这些子目录对应的是一个可用数据库,比如我们上面进行测试的rocksdb。
我们就要类比这种已有数据库来搭建自己的数据库。
我们进入rocksdb来分析其结构。
image.png image.png
典型的maven工程。在根目录下有pom文件,并且在src中有main于test。而test我们不做处理,所以我们要创建如下文件夹与文件:
- pom文件(根目录)
- 关键java程序(里面包含db文件接口的扩充)已经package-info.java(这个可以参考rocksdb中写的,就一句话)
PS:这里需要注意,这些文件夹也需要我们手动创建(确实层数比较多,但是没办法。。。)。
而这里的其他.java文件是KtOutCrypto.java
文件所需要的依赖文件,所以这里可以忽略。
之后我们就需要具体来说一下文件所需要包含的内容了。
- 首先是
KtOutCrypto.java
文件。该文件中需要重定义如下接口:
public Status insert(String table, String key, Map<String, ByteIterator> values)
public void init() throws DBException
public Status read(String table, String key, Set<String> fields, Map<String, ByteIterator> result)
public Status delete(String table, String key)
public void cleanup() throws DBException
public Status scan(String table, String startkey, int recordcount, Set<String> fields, Vector<HashMap<String, ByteIterator>> result)
public Status update(String table, String key, Map<String, ByteIterator> values)
当这些接口定义完成后,我们需要修改根目录的pom文件。
网上许多教程都没有类似的修改方法,所以我将这些小的点都写详细一些:
image.png由于我的项目并没有依赖太多库,所以简单的写一些就可以。
- 之后就是对YCSB的配置进行修改,并添加进我们的数据库。
首先是在YCSB的module中修改pom文件,添加我们的ktstore文件。
image.png然后对YCSB的bin目录下的bindings.properties
文件进行修改,添加进入我们的项目名称:
而这个路径就是我们的核心java函数所在的位置。
接着对ycsb进行修改:
image.png在database中添加我们的路径,用于使系统找到我们的关键函数:
image.png至此,我们的环境配置修改已经完成。
下面我们要对我们的DIY数据库进行maven建立。
mvn -pl com.yahoo.ycsb:xxxxx-binding -am package
(这里xxxxx为DIY数据库的名称,比如rocksdb)
然后我们看到我们的工程成功建立:如果java文件有错误或者其他地方存在问题,此时就会报出大量的错误。
image.png在这里大家需要注意的是,maven工程拥有一个很严谨的java编译过程,严谨是指你java文件中的空格数量都会给你纠正,所以在写java代码的时候一定要注意,否则在这个阶段你需要对那些格式问题进行大量的修改才能通过编译。
此时我们就得到了target新目录,并在里面看到了.jar文件。
image.png之后我们就可以类比上面的rocksdb来进行load、run的操作了。
在这个环境搭建的过程中由于国内外的教程不全,所以我进行了大量的尝试与源码分析。所以这个周期花费的时间非常长,我希望这篇指导文章能够帮助读者更快的上手测试过程。希望为计算机事业做出一些小小的贡献!
本文为原创,转载请标记出处:[https://www.jianshu.com/p/675947cdcce4](https://www.jianshu.com/p/675947cdcce4)