QuarkDB 是一个由 CernIT-ST 部门开发的高可用的 键-值 存储的内存数据库, 其实现了 redis 命令集的一个小的子集. QuarkDB 建立在 rocksdb 之上, rocksdb 则是一个强一致性的嵌入式的 键-值存储系统. QuarkDB的高可用性是由多副本节点和 raft 分布一致性算法保证的.


Table of Contents

  1. 安装 QuarkDB
    1. 通过源安装
    2. 通过源码编译安装
  2. 搭建 QuarkDB 集群
    1. 初始化数据库文件夹
    2. 配置 QuarkDB 实例
    3. 运行 QuarkDB 集群
  3. 管理 QuarkDB 集群
    1. 增加节点
    2. 移除节点
    3. 密码认证

下图是 CERN 给出的 EOS 未来 NS 的设计,使用 QuarkDB 作为 EOS 的元数据存储服务器:

下面就简要介绍一下如何搭建一个 QuarkDB 集群。

安装 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://storage-ci.web.cern.ch/storage-ci/quarkdb/master/el7/x86_64/
enabled=1
gpgcheck=False

[quarkdb-stable-debug]
name=QuarkDB repository [stable debug]
baseurl=http://storage-ci.web.cern.ch/storage-ci/quarkdb/master/el7/x86_64/
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
  1. 安装依赖包
1
2
sudo yum install -y expect jemalloc libzstd xrootd xrootd-client-libs xrootd-libs xrootd-selinux xrootd-server xrootd-server-libs
sudo yum install -y lz4-devel lz4-static lz4 jemalloc jemalloc-devel zstd libzstd libzstd-devel libdwarf-static libdwarf-devel libdwarf-tools
  1. 安装 devtoolset-7
1
yum install centos-release-scl && yum install devtoolset-7 && source /opt/rh/devtoolset-7/enable
  1. 编译测试安装 QuarkDB
1
2
3
4
mkdir build && cd build
cmake ..
make
./test/quarkdb-tests

搭建 QuarkDB 集群

初始化数据库文件夹

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

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

1
2
3
4
5
for i in 1 2 3;do
ssh qdb-${i} "sudo quarkdb-create --path /var/lib/quarkdb/node-$i --clusterID 0c01a140-b3ff-11e8-86bb-9cb6d0e634f1 --nodes qdb-1:7777,qdb-2:7777,qdb-3:7777"
ssh qdb-${i} "sudo mkdir -p /var/log/quarkdb/ && sudo chown -R xrootd:xrootd /var/log/quarkdb"
ssh qdb-${i} "sudo mkdir -p /var/spool/quarkdb/ && sudo chown -R xrootd:xrootd /var/log/quarkdb"
done

每个节点上的命令都要保持 --clusterID--nodes 一直.

修改数据库文件夹权限:

1
2
3
for i in 1 2 3;do
ssh qdb-$i "sudo chown -R xrootd:xrootd /var/lib/quarkdb/node-$i"
done

配置 QuarkDB 实例

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

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

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

1
2
3
4
5
6
7
8
9
10
11
for i in 1 2 3;do
cat << EOF > xrootd-quarkdb.cfg
xrd.port 7777
xrd.protocol redis:7777 libXrdQuarkDB.so
redis.mode raft
redis.database /var/lib/quarkdb/node-$i
redis.myself qdb-$i:7777
EOF
cat xrootd-quarkdb.cfg | ssh qdb-$i "sudo tee /etc/xrootd/xrootd-quarkdb.cfg"
ssh qdb-$i sudo systemctl enable --now xrootd@quarkdb
done

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
5
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:7777 qdb-2:7777 qdb-3:7777
...
$ sudo systemctl enable --now xrootd@quarkdb.service
  1. leader 节点上使用 raft_add_observer 命令添加新节点为 observer
1
$ redis-cli -h leader -p 7777 raft_add_observer qdb-4:7777
  1. 在新节点成为 observer 并上线后,提升其为 follower
1
2
$ redis-cli -h leader -p 7777 raft_info
$ redis-cli -h leader -p 7777 raft_promote_observer qdb-4:7777

移除节点

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

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

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

密码认证

默认的 QuarkDB 是可以接受所有连接的, 这很不安全。 我们可以为 QuarkDB 启用密码认证。 在原有的配置文件中加入如下一行:

1
redis.password_file /etc/xrootd/quarkdb.passwd

其中 /etc/xrootd/quarkdb.passwd 是密码文件,主属需要设置为 xrootd:xrootd, 权限为 400。或者加入下面一行:

1
redis.password your-quarkdb-password

选项后面接的就是认证密码。