一、概述
1. RocksDB是FaceBook的kv开源组件,使用C++进行开发,因此需要配置C++依赖的配置。而RocksDB需要手工编译和连接。
2. gorocksdb是rocksdb的Go包装器,即通过cgo的方式使用rocksdb。
3. 本文主要介绍的是linux环境下golang如何使用rocksdb。
二、环境配置
- Devclound开机机,tlinux集成环境
- gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)
- go version go1.13.3 linux/amd64
三、配置流程
1. 前置配置
(1)安装gcc
gcc版本需要支持c++11特性,因此需要安装4.8以上的版本。 查看版本命令:gcc --version
安装命令:yum install gcc48-c++
(2)安装gflags:google开源的一套命令行参数解析工具,支持从环境变量和配置文件读取参数
安装命令:
git clone [https://github.com/gflags/gflags.git](https://github.com/gflags/gflags.git)
cd gflags
git checkout v2.0
./configure && make && sudo make install
默认安装,include路径将为 /usr/local/include ,lib路径将为 /usr/local/lib
安装后,需要将gflags的包含路径添加到你的CPATH环境变量中,并将lib路径添加到中LIBRARY_PATH,方法如下所示:
- 编辑 vim /etc/profile 配置环境变量
- 设置以下内容
export CPLUS_INCLUDE_PATH=${CPLUS_INCLUDE_PATH}:/usr/local/include export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib export LIBRARY_PATH=${LIBRARY_PATH}:/usr/local/lib
- 编辑后保存文件,source /etx/profile 配置生效
(3)安装rocksdb依赖库
- 涉及到的库:zlib,bzip2,lz4,snappy,zstandard
zlib-用于数据压缩的库
bzip2-用于数据压缩的库
lz4-用于极快数据压缩的库
snappy-用于快速数据压缩的库
zstandard-快速实时压缩算法
- 安装命令:
sudo yum install snappy snappy-devel
sudo yum install zlib zlib-devel
sudo yum install bzip2 bzip2-devel
sudo yum install lz4-devel
sudo yum install libasan
wget [https://github.com/facebook/zstd/archive/v1.1.3.tar.gz](https://github.com/facebook/zstd/archive/v1.1.3.tar.gz)
mv v1.1.3.tar.gz zstd-1.1.3.tar.gz
tar zxvf zstd-1.1.3.tar.gz
cd zstd-1.1.3
make && sudo make install
2、安装编译rocksdb
- 获取rocksdb源码:git clone https://github.com/facebook/rocksdb.git
- 切换分支代码(注:gorocksdb建议使用5.16.fb+以上的版本)
cd rocksdb
git checkout 5.18.fb
- 手动编译并连接rocksdb,动态库使用shared_lib,静态库使用static_lib
PORTABLE=1 make shared_lib
INSTALL_PATH=/usr/local make install-shared
3、配置gorocksdb,path/to/rocksdb修改为本机rocksdb所有在路径即可
CGO_CFLAGS="-I/path/to/rocksdb/include" \
CGO_LDFLAGS="-L/path/to/rocksdb -lrocksdb -lstdc++ -lm -lz -lbz2 -lsnappy -llz4 -lzstd" \
go get [github.com/tecbot/gorocksdb](http://github.com/tecbot/gorocksdb)
4、测试
- 测试用例:打开rocksdb,并进行读写操作
package main
import (
"errors"
"[github.com/tecbot/gorocksdb](http://github.com/tecbot/gorocksdb)"
"log"
"strconv"
)
const (
DB_PATH = "/gorocksdb"
)
func main() {
db, err := OpenDB()
if err != nil {
log.Println("fail to open db,", nil, db)
}
readOptions := gorocksdb.NewDefaultReadOptions()
readOptions.SetFillCache(true)
writeOptions := gorocksdb.NewDefaultWriteOptions()
writeOptions.SetSync(true)
for i := 0; i < 10; i++ {
keyStr := "test" + strconv.Itoa(i)
var key []byte = []byte(keyStr)
db.Put(writeOptions, key, key)
log.Println(i, keyStr)
slice, err2 := db.Get(readOptions, key)
if err2 != nil {
log.Println("get data exception:", key, err2)
continue
}
log.Println("get data:", slice.Size(), string(slice.Data()))
}
}
// opendb
func OpenDB() (*gorocksdb.DB, error) {
options := gorocksdb.NewDefaultOptions()
options.SetCreateIfMissing(true)
bloomFilter := gorocksdb.NewBloomFilter(10)
readOptions := gorocksdb.NewDefaultReadOptions()
readOptions.SetFillCache(false)
rateLimiter := gorocksdb.NewRateLimiter(10000000, 10000, 10)
options.SetRateLimiter(rateLimiter)
options.SetCreateIfMissing(true)
options.EnableStatistics()
options.SetWriteBufferSize(8 * 1024)
options.SetMaxWriteBufferNumber(3)
options.SetMaxBackgroundCompactions(10)
// options.SetCompression(gorocksdb.SnappyCompression)
// options.SetCompactionStyle(gorocksdb.UniversalCompactionStyle)
options.SetHashSkipListRep(2000000, 4, 4)
blockBasedTableOptions := gorocksdb.NewDefaultBlockBasedTableOptions()
blockBasedTableOptions.SetBlockCache(gorocksdb.NewLRUCache(64 * 1024))
blockBasedTableOptions.SetFilterPolicy(bloomFilter)
blockBasedTableOptions.SetBlockSizeDeviation(5)
blockBasedTableOptions.SetBlockRestartInterval(10)
blockBasedTableOptions.SetBlockCacheCompressed(gorocksdb.NewLRUCache(64 * 1024))
blockBasedTableOptions.SetCacheIndexAndFilterBlocks(true)
blockBasedTableOptions.SetIndexType(gorocksdb.KHashSearchIndexType)
options.SetBlockBasedTableFactory(blockBasedTableOptions)
//log.Println(bloomFilter, readOptions)
options.SetPrefixExtractor(gorocksdb.NewFixedPrefixTransform(3))
options.SetAllowConcurrentMemtableWrites(false)
db, err := gorocksdb.OpenDb(options, DB_PATH)
if err != nil {
log.Fatalln("OPEN DB error", db, err)
db.Close()
return nil, errors.New("fail to open db")
} else {
log.Println("OPEN DB success", db)
}
return db, nil
}