QuarkDB 是一个由 CernIT-ST 部门开发的高可用的 键-值 存储的内存数据库, 其实现了 redis 命令集的一个小的子集. QuarkDB 建立在 rocksdb 之上, rocksdb 则是一个强一致性的嵌入式的 键-值存储系统.


目录

  1. 安装 QuarkDB
    1. 通过源安装
    2. 通过源码编译安装
  2. 搭建 QuarkDB 集群
  3. 运行 QuarkDB 集群
  4. 扩展 QuarkDB 集群
    1. 增加节点
    2. 移除节点

QuarkDB的高可用性是由多副本节点和 raft 分布一致性算法保证的.

安装 QuarkDB

通过源安装

安装 QuarkDB 最简单的方式就是从源里进行安装. 如果运行的是 CentOS 7, 将如下内容保存到 quarkdb.repo, 放在 /etc/yum.repos.d下.

1
2
3
4
5
6
7
8
9
10
11
[quarkdb-stable]
name=QuarkDB repository [stable]
baseurl=http://linuxsoft.cern.ch/repos/quarkdb7-stable/x86_64/os
enabled=1
gpgcheck=False

[quarkdb-stable-debug]
name=QuarkDB repository [stable debug]
baseurl=http://linuxsoft.cern.ch/repos/quarkdb7-stable/x86_64/debug
enabled=1
gpgcheck=False

然后通过如下命令安装

1
sudo yum install -y quarkdb quarkdb-debuginfo

通过源码编译安装

  1. 下载源码包

    1
    2
    git clone https://gitlab.cern.ch/eos/quarkdb.git && cd quarkdb
    git submodule update --recursive --init
  2. 安装依赖包

    1
    sudo yum install -y expect jemalloc libzstd xrootd xrootd-client-libs xrootd-libs xrootd-selinux xrootd-server xrootd-server-libs
  3. 安装 devtoolset-7

    1
    yum install centos-release-scl && yum install devtoolset-7 && source /opt/rh/devtoolset-7/enable
  4. 编译测试安装 QuarkDB

    1
    2
    3
    4
    mkdir build && cd build
    cmake ..
    make
    ./test/quarkdb-tests

搭建 QuarkDB 集群

假定我们在 qdb-1.example.com:7777, qdb-2.example.com:7777, qdb-3.example.com:7777 三台机器上部署 QuarkDB 集群, 确定集群的名字 --clusterID 可由 uuid 产生, 比如 0c01a140-b3ff-11e8-86bb-9cb6d0e634f1, 一个唯一的 clusterID 能够避免 集群节点误与其他集群交流.

首先,我们要在每一个节点上初始化数据库文件夹. 在每一个节点上运行如下命令:

1
quarkdb-create --path /var/lib/quarkdb/node-x --clusterID 0c01a140-b3ff-11e8-86bb-9cb6d0e634f1 --nodes qdb-1.example.com:7777,qdb-2.example.com:7777,qdb-3.example.com:7777

其中 x 表示节点 id, 每个节点上的命令都要保持 --clusterID--nodes 一直.

修改 数据库文件夹权限:

1
sudo chown -R xrootd:xrootd /var/lib/quarkdb/node-x

QuarkDB 使用 XrootD 作为通信后端, 所以其配置跟 EOS 等类似. 每个节点上的配置文件如下( raft 模式)

1
2
3
4
5
xrd.port 7777
xrd.protocol redis:7777 libXrdQuarkDB.so
redis.mode raft
redis.database /var/lib/quarkdb/node-x
redis.myself qdb-x.example.com:7777

将其保存到 /etc/xrootd/xrootd-quarkdb.cfg, 然后通过 systemd 启动 quarkdb 实例

1
sudo systemctl enable --now xrootd@quarkdb

log 文件是 /var/log/xrootd/quarkdb/xrootd.log.

运行 QuarkDB 集群

为了正常运行 QuarkDB 集群, 必须有大多数(或法定数(quorum)) 的节点正常可使用, 例如 3个至少有2个, 5个至少有3个,7个至少有4个.

启动集群中大部分节点后, 如果正常的话, 这些节点会进行选举,一个变成 leader, 其他变成 followers.

在任一节点上使用 redis-cli -p 7777 进入与集群交互界面, 使用 raft-infoquarkdb-info 可以查看节点信息.

验证节点是否正常工作.

1
2
3
4
qdb-1.example.com:7777> set mykey myval
OK
qdb-1.example.com:7777> get mykey
"myval"

扩展 QuarkDB 集群

增加节点

  1. 在新节点上运行创建集群的命令, --nodes 选项中不要有新的节点,

    1
    2
    3
    4
    $ sudo quarkdb-create --path /var/lib/quarkdb/node-4 --clusterID 0c01a140-b3ff-11e8-86bb-9cb6d0e634f1
    --nodes qdb-1.example.com:7777 qdb-2.example.com:7777 qdb-3.example.com:7777
    ...
    $ sudo systemctl enable --now xrootd@quarkdb.service
  2. leader 节点上使用 raft_add_observer 命令添加新节点为 observer

    1
    $ redis-cli -h leader -p 7777 raft_add_observer qdb-4.example.com:7777
  3. 在新节点成为 observer 并上线后,提升其为 follower

    1
    2
    $ redis-cli -h leader -p 7777 raft_info
    $ redis-cli -h leader -p 7777 raft_promote_observer qdb-4.example.com:7777

移除节点

假设我们要移除 qdb-4.example.com

1
$ redis-cli -h leader -p 7777 raft_remove_memeber qdb-4.example.com:7777

需要注意的是, 不能移除 leader.