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