暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

学习 RocksDB 的第一课

TiDB之路 2022-03-09
2397

前言

最近看了一篇文章挺有意思的,叫《RocksDB Is Eating the Database World》。如下图,RocksDB
正在吞噬着整个数据库世界。

Why ?

我个人觉得有以下几点:

  • 重新设计一个存储引擎是一个极其复杂的事情,而且会浪费巨大的人力和物力,同时开发周期也会变得漫长。但其实自己设计存储引擎也有极大的好处,技术可控,并且可以和上层绑定进行优化,发挥出最大的性能。就好比头文字中的AE86,让发动机和整个车的平衡能达到一个最优值。
  • RocksDB
    出身名门,且在负载较高的FaceBook
    环境下稳定运行,足以说明它是可以应付大规模应用的。也就是说它的可靠性强。
  • 性能出色。RocksDB
    在密集型的基准测试中表现非常亮眼,MyRocks项目是 MySQL 的一个分支,它用 RocksDB
    作为 MySQL 的存储引擎来代替 InnoDB,Mark Callaghan 进行了广泛而严格的测试。

可以看到在写入密集型基准测试中,因为有LSM Tree
的能力加持,可以完胜innodb。但在读上面,因为写放大的问题,使得它在读取密集型基准测试要落后于innodb。但是两者在读的差距并没有写那么明显。

从WiKi上看,当前Rocksdb
主要使用是在替代后端
嵌入式
上。

RocksDB 安装

初步了解了RocksDB
之后,我们还是先把它装起来。安装有一个捷径可以选择,参考github的一键安装脚本。https://gist.github.com/srimaln91/bea462f8e3cefc793125757a3080391f

你也可以手动一步步执行。

⚠️ 注意

当前RocksDB的版本是6.29.3,但是在CentOS 7版本上编译会遇到issue。

https://github.com/tecbot/gorocksdb/issues/203

建议安装6.15.x或者早期版本,我选择是6.15.5

ROCKSDB_VERSION="6.15.5"ZSTD_VERSION="1.5.2"yum install -y \  wget \  gcc-c++ \  snappy snappy-devel \  zlib zlib-devel \  bzip2 bzip2-devel \  lz4-devel \  libasan \  gflagswget -qO /tmp/zstd-${ZSTD_VERSION}.tar.gz https://github.com/facebook/zstd/archive/v${ZSTD_VERSION}.tar.gzwget -qO /tmp/rocksdb-${ROCKSDB_VERSION}.tar.gz https://github.com/facebook/rocksdb/archive/v${ROCKSDB_VERSION}.tar.gzcd /tmptar xzvf zstd-${ZSTD_VERSION}.tar.gztar xzvf rocksdb-${ROCKSDB_VERSION}.tar.gzecho "Installing ZSTD..."pushd zstd-${ZSTD_VERSION}make && make installpopdecho "Compiling RocksDB..."pushd rocksdb-${ROCKSDB_VERSION}make shared_libmake install-shared INSTALL_PATH=/usr/local# cleanuprm -rf /tmp/zstd-${ZSTD_VERSION}.tar.gz /tmp/zstd-${ZSTD_VERSION}rm -rf /tmp/rocksdb-${ROCKSDB_VERSION}.tar.gz /tmp/rocksdb-${ROCKSDB_VERSION}echo "Installation Completed!"
复制

选择自己要安装的版本和位置,然后后台一键安装。

用Golang进行测试

安装完成之后,我们可以使用golang
来进行测试。因为是嵌入式数据库,所以这里直接在go程序中使用。

⚠️ 注意

需要设置下面的C环境变量,并安装gorocksdb
模块。

CGO_CFLAGS="-I/usr/local/include/rocksdb/include" \CGO_LDFLAGS="-L/usr/local/include/rocksdb -lrocksdb -lstdc++ -lm -lz -lbz2 -lsnappy -llz4 -lzstd" \go get github.com/tecbot/gorocksdb
复制

安装完成后,我们写一个go程序。

package mainimport ("github.com/tecbot/gorocksdb""log")func main(){  options := gorocksdb.NewDefaultOptions()  options.SetCreateIfMissing(true)        db, err := gorocksdb.OpenDb(options, "/tmp/gorocksdb1")        if err != nil {        log.Println("fail to open db,"nil, db)        }else         {                log.Println("open db success"nil, db)        }  db.Close()}
复制

这个程序极其的简单,就是打开数据库。

go run c1.go/tmp/go-build579019632/b001/exe/c1: error while loading shared libraries: librocksdb.so.6.15: cannot open shared object file: No such file or directoryexit status 127
复制

运行报错,这里找不到librocksdb.so.6.15
,把环境变量LD_LIBRARY_PATH
设置一下。

export LD_LIBRARY_PATH=/usr/local/lib/go run c1.go2022/03/08 22:48:53 open db success <nil> &{0x2740420 /tmp/gorocksdb1 0xc00005a040}
复制

数据库打开成功,我们去看一下。

[root@copy-of-vm-ee-centos76-v1 gorocksdb1]# ls -lrttotal 148-rw-r--r-- 1 root root     0 Mar  8 22:48 LOCK-rw-r--r-- 1 root root    37 Mar  8 22:48 IDENTITY-rw-r--r-- 1 root root    16 Mar  8 22:48 CURRENT-rw-r--r-- 1 root root     0 Mar  8 22:48 000004.log-rw-r--r-- 1 root root  6062 Mar  8 22:48 OPTIONS-000006
-rw-r--r-- 1 root root    57 Mar  8 22:48 MANIFEST-000003
-rw-r--r-- 1 root root 23272 Mar  8 22:48 LOG

复制

原来嵌入式数据库就是这么玩的。

后记

今天只是对RocksDB的一个小小的认识和初步的尝试,后续将带来更多精彩学习教程。

Refenerce

https://gist.github.com/srimaln91/bea462f8e3cefc793125757a3080391f
https://en.wikipedia.org/wiki/RocksDB#Alternative_backend
https://rockset.com/blog/rocksdb-is-eating-the-database-world/


文章转载自TiDB之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论