概述
熟悉Flink和Kafka的朋友,使用它们时或者阅读源码时,肯定会多多少少见过RocksDB的身影。Flink流处理和Kafka流处理都支持RocksDB用作状态读写操作。本文主要介绍什么是RocksDB?如何安装RocksDB?Java如何使用内嵌式RocksDB?
什么是RocksDB?
RocksDB是由Facebook数据库工程团队基于LevelDB开发和维护的,旨在充分实现快存上存储数据的服务能力。RocksDB是一个可嵌入的(内嵌式使用不用专门安装部署RocksDB)、持久型的key-value存储代码库,特别适合在闪存驱动器上存储数据,Key和value是任意大小的字节流,支持原子的读和写。RocksDB采用LSM设计,在写放大因子(WAF)、读放大因子(RAF)和空间放大因子(SAF)之间进行了灵活的权衡。RocksDB支持多线程压缩,特别适合在单个数据库中存储TB级别的数据。
RocksDB支持在不同的生产环境(纯内存、Flash、hard disks or HDFS)中调优,RocksDB针对多核CPU、高效快速存储(SSD)、I/O boundworkload做了优化,支持不同的数据压缩算法、和生产环境debug的完善工具。
如何安装RocksDB?
注意:并非所有使用RocksDB场景都需安装RocksDB。
提前安装可能的依赖
[root@felixzh1 opt]# yum -y install lrzszgit gcc gcc-c++ lz4-devel snappy snappy-devel zlib zlib-devel bzip2 bzip2-devellz4 lz4-devel zstd
复制
安装配置cmake
下载cmake
[root@felixzh1 opt]# wget https://cmake.org/files/v3.6/cmake-3.6.0-Linux-x86_64.tar.gz
复制
解压cmake
[root@felixzh1 opt]# tar -zxvf cmake-3.6.0-Linux-x86_64.tar.gz
复制
配置cmake环境变量
[root@felixzh1opt]# cat >>/etc/profile <<EOF
> export PATH=\$PATH:/opt/cmake-3.6.0-Linux-x86_64/bin
> EOF
[root@felixzh1 opt]# source etc/profile
复制
安装配置gflags
下载gflags
[root@felixzh1 opt]# wget https://github.com/gflags/gflags/archive/v2.2.2.tar.gz
复制
解压gflags
[root@felixzh1 opt]# tar -zxvfv2.2.2.tar.gz
复制
编译安装gflags
[root@felixzh1 opt]# cd gflags-2.2.2/&& mkdir build && cd build/
[root@felixzh1 build]# cmake-DBUILD_SHARED_LIBS=ON -DBUILD_STATIC_LIBS=ON -DINSTALL_HEADERS=ON-DINSTALL_SHARED_LIBS=ON -DINSTALL_STATIC_LIBS=ON .. && make
[root@felixzh1 build]# make install
复制
配置gflags环境变量
[root@felixzh1 build]# cat>>/etc/profile <<EOF
> exportLD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/usr/local/lib
> EOF
[root@felixzh1 build]# source etc/profile
复制
安装配置RocksDB
下载RocksDB
[root@felixzh1 build]# wgethttps://github.com/facebook/rocksdb/archive/v6.4.6.tar.gz && tar -zxvfv6.4.6.tar.gz && cd rocksdb-6.4.6/
复制
编译安装RocksDB
[root@felixzh1 rocksdb-6.4.6]# mkdir build&& cd build && cmake -DCMAKE_INSTALL_PREFIX=/usr/local/rocksdb.. && make && make install
复制
配置RocksDB环境变量
[root@felixzh1 build]# cat>>/etc/profile <<EOF
> exportCPLUS_INCLUDE_PATH=\$CPLUS_INCLUDE_PATH:/usr/local/rocksdb/include/
> exportLD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/usr/local/rocksdb/lib64/
> export LIBRARY_PATH=\$LIBRARY_PATH:/usr/local/rocksdb/lib64/
> EOF
[root@felixzh1 build]# source etc/profile
复制
内置工具测试
[root@felixzh1 build]# cd/opt/rocksdb-6.4.6/build/tools/
[root@felixzh1 tools]# ./ldb –h
复制
创建数据库myRocksDB,并put数据
[root@felixzh1 tools]# ./ldb--db=/opt/myRocksDB --create_if_missing put felixzh_key felixzh_value
复制
scan数据库myRocksDB
[root@felixzh1 tools]# ./ldb--db=/opt/myRocksDB scan
复制
get数据库myRocksDB中指定key
[root@felixzh1 tools]# ./ldb--db=/opt/myRocksDB get felixzh_key
复制
查看数据文件
[root@felixzh1 tools]# ll opt/myRocksDB/
复制
Java如何使用内嵌式RocksDB?
RocksDB是一种C++开发的、嵌入式的Key:Value数据库,其实系统无需安装。支持C++和Java两种语言API。这里只测试Java语言API。C++语言API见官网示例:https://rocksdb.org/docs/getting-started.html
maven依赖
<dependency>
<groupId>org.rocksdb</groupId>
<artifactId>rocksdbjni</artifactId>
<version>6.6.4</version>
</dependency>
复制
演示代码
import org.rocksdb.Options;
import org.rocksdb.RocksDB;
import org.rocksdb.RocksIterator;
public class RocksDBDemo {
static {
RocksDB.loadLibrary();
}
private static RocksDB rocksDB;
private static String path = "/opt/myRocksDB";
public static void main(String[] args) throws Exception {
Options options = new Options();
options.setCreateIfMissing(true);
rocksDB = RocksDB.open(options, path);
System.out.println("put: key is felixzh_key, value is felixzh_value");
rocksDB.put("felixzh_key".getBytes(), "felixzh_value".getBytes());
System.out.println("===================================");
byte[] bytes = rocksDB.get("felixzh_key".getBytes());
System.out.println("get: key is felixzh_key, value is " + new String(bytes));
RocksIterator iter = rocksDB.newIterator();
System.out.println("===================================");
System.out.println("all key and value:");
for (iter.seekToFirst(); iter.isValid(); iter.next()) {
System.out.println("iter key: " + new String(iter.key()) + ",iter value: " +
new String(iter.value()));
}
}
}
复制
完整代码工程:https://github.com/felixzh2020/felixzh-learning-java
注意:Windows下不可执行,异常如下:
打包在linux运行(该主机无需安装RocksDB)
[root@felixzh opt]# java -cpRocksDBCase-1.0-jar-with-dependencies.jar RocksDBDemo
复制