手把手教你在 CentOS 环境下实现 Go 使用 RocksDB 进行数据持久化

一、概述

  因为目前在做一个分布式键值存储系统的持久化组件,通过相关资料的查询最终选择使用 RocksDB 作为底层的持久化组件,RocksDB 是 FaceBook 的一个项目,主要使用 C++ 进行开发,所以当我们在自己的服务器上进行配置的时候需要自己手工进行相关 C++ 库依赖的配置以及 RocksDB 的编译和连接工作。对于 RocksDB 的优点我这里就不做赘述了,感兴趣的可以自己去网上查询相关的资料。

  虽然 Golang 和 RocksDB 都还算是比较出名的两款技术,但是在网上对于其连接的教程资料却少的可怜,并且在这个过程中还存在着许多错误的博文,因此在采坑之后,打算通过本篇博文来记述 Golang 连接 RocksDB 的方法,而整篇博文会从最基础的步骤开始,一步一步的最终实现 Golang 连接 RocksDB 并能够直接进行使用。

  博客内所有文章均为 原创,所有代码均为 原创,若转载请附原文链接。


二、配置环境

2.1 服务器环境

  这里大概介绍一下当前服务器的相关环境信息:

  • 阿里云 CentOS Linux 服务器
  • GCC \ G++ version 4.8.5
  • Go version go1.9 linux/amd64

  需要注意的是,本篇博文所讲述的配置方法及相关命令均基于 CentOS ,如果你的服务器是 Ubuntu 需要自行修改相关的命令。


三、配置流程

3.1 依赖关系配置

  • 首先第一点,你需要保证你的 gcc 至少升级到 4.8 版本以获得 C++ 11 支持,对于 gcc 的版本查看可以直接使用命令 gcc --version,如果当前 gcc 的版本低于 4.8 则可以使用 yum install gcc48-c++命令来安装 4.8 版本;在这里插入图片描述
  • 其次,使用下列命令来安装 gflags :
    git clone https://github.com/gflags/gflags.git
    cd gflags
    git checkout v2.0
    ./configure && make && sudo make install

注意:安装后,请将 gflags 的包含路径添加到你的 CPATH 环境变量中,并将 lib 路径添加到中 LIBRARY_PATH 。如果使用默认设置安装,则 include 路径将为 /usr/local/include ,lib路径将为 /usr/local/lib 。具体操作方法如下:

  (1)使用 vim /etc/profile命令配置环境变量
  (2)在文件的末尾插入下面三条配置:

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

  (3)编辑完成后保存文件,然后使用命令 source /etc/profile使配置生效

  • 然后使用下面的命令安装 snappy、zlib、bzip2、lz4 和 ASAN:
    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
  • 最后使用下面的命令安装 zstandard:
   wget 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

  对于上面相关依赖关系的介绍基本如下:

(1)RocksDB与以下压缩库链接:

  • zlib-用于数据压缩的库。
  • bzip2-用于数据压缩的库。
  • lz4-用于极快数据压缩的库。
  • snappy-用于快速数据压缩的库。
  • zstandard-快速实时压缩算法。

(2)所有的工具都取决于:

  • gflags-处理命令行标志处理的库。即使没有安装gflag,也可以编译rocksdb库。

(3)如果希望构建RocksJava静态目标,则需要使用cmake来构建Snappy。

3.2 获取并编译 RocksDB

  • 首先,使用下述命令从 GitHub 上获取 RocksDB 的源码 Git :
git clone https://github.com/facebook/rocksdb.git
  • 然后切换到项目目录下,并切换分支(这里的分支按照 gorocksdb 建议应为 5.16.fb+ ,所以我选择的是 5.18.fb),这里需要注意是网上有一篇博文的叙述是错误的,它直接使用的是 5.7fb 来进行切换,但是 Git 中其实并不存在该分支,正确的写法应为 5.7.fb
cd rocksdb
git checkout 5.18.fb
  • 完成分支切换后,手动编译并连接 rocksdb,具体的介绍在下面的参考资料【1】中有详细的介绍,这里就不做赘述,有需要的自己去看就可以了,具体使用的编译命令如下:
PORTABLE=1 make shared_lib
INSTALL_PATH=/usr/local make install-shared
  • 最后需要注意的是,网上的一篇博文中说编译完成后还需要再次配置环境变量,但其实这是并没有必要的,因为当我们执行完上步的第二条命令后,相关的连接和头文件就已经被放到我们之前配置的 usr/local/lib下面了,并且如果你这里重复配置的话,是可能会出错的。

在这里插入图片描述

3.3 配置 goRocksDB

  • 首先,需要明确的是,其实这个库就是一个 C++ 的 RocksDB 和 Golang 的连接库,这个库完成了对于 RocksDB 的封装,并提供了特定的接口来供我们的 Golang 使用,但其实它与我们自己实现的方式是相同的,都是采用 cgo 的方法来进行连接的。

  • 对于 goRocksDB 的配置相对来说比较简单一点,只需要使用下面的三条命令即可(这里是假设你的 GOPATH 等 Golang 的相关环境已经配置完成),需要注意的是在使用的时候请将 /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

四、配置测试

4.1 测试流程

  当你完成了上述的配置后,如果一切正常就可以进入到测试阶段了,对于配置后的测试我们直接使用 GoRocksDB 官方提供的示例代码来进行,具体流程如下:

  • 编写测试 Go 文件(需要 注意 的是,我这里为了测试简便,所以忽略了错误处理和相关流的关闭工作,当你们自己使用的时候需要处理报错和及时关闭输入输出流):
package main

import (   
    "fmt"
	"github.com/tecbot/gorocksdb"
)

func main() {
	
	// 使用 gorocksdb 连接 RocksDB
	bbto := gorocksdb.NewDefaultBlockBasedTableOptions()
	bbto.SetBlockCache(gorocksdb.NewLRUCache(3 << 30))
	opts := gorocksdb.NewDefaultOptions()
	opts.SetBlockBasedTableFactory(bbto)
	opts.SetCreateIfMissing(true)
	// 设置输入目标数据库文件(可自行配置,./db 为当前测试文件的目录下的 db 文件夹)
	db, _ := gorocksdb.OpenDb(opts, "./db")
	
	// 创建输入输出流
	ro := gorocksdb.NewDefaultReadOptions()
	wo := gorocksdb.NewDefaultWriteOptions()
	// 将键为 foo 值为 bar 的键值对写入文件中
	_ = db.Put(wo, []byte("foo"), []byte("bar"))
	// 获取数据库中键为 foo 的值
	value, _ := db.Get(ro, []byte("foo"))	
	defer value.Free()
	// 打印数据库中键为 foo 的值
    fmt.Println("value: ", string(value.Data()[:]))
   	// 删除数据库中键为 foo 对应的键值对
	_ = db.Delete(wo, []byte("foo"))
}
  • 然后将该文件移动到 GOPATH 目录下,通过下面的指令来运行
	go run main.go

4.2 测试结果

  上面的命令运行后的结果应如下,这时就证明我们的 Golang 通过 goRocksDB 连接 RocksDB 已经成功了,对于 goRocksDB 的更多使用方法可以查看下面参考资料中的【3】。

在这里插入图片描述


五、参考资料

【1】依赖配置:https://github.com/facebook/rocksdb/blob/master/INSTALL.md

【2】goRocksDB:https://github.com/tecbot/gorocksdb

【3】goRocksDB doc:https://godoc.org/github.com/tecbot/gorocksdb

【4】RocksDB:https://github.com/facebook/rocksdb

【5】RocksDB 介绍:http://alexstocks.github.io/html/rocksdb.html

【6】参考博文:https://blog.csdn.net/TaroYoVen/article/details/88813386


发布了244 篇原创文章 · 获赞 32 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_40697071/article/details/103791892