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

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
}

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容