rocksdb使用说明

一、概述
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
}

你可能感兴趣的:(rocksdb使用说明)