搭建并运行管理 QuarkDB 集群
QuarkDB 是一个由 Cern
的 IT-ST
部门开发的高可用的 键-值
存储的内存数据库, 其实现了 redis
命令集的一个小的子集. QuarkDB 建立在 rocksdb 之上, rocksdb
则是一个强一致性的嵌入式的 键-值
存储系统. QuarkDB
的高可用性是由多副本节点和 raft 分布一致性算法保证的.
Table of Contents
下图是 CERN 给出的 EOS 未来 NS 的设计,使用 QuarkDB 作为 EOS 的元数据存储服务器:
下面就简要介绍一下如何搭建一个 QuarkDB 集群。
安装 QuarkDB
通过源安装
安装 QuarkDB 最简单的方式就是从源里进行安装. 如果运行的是 CentOS 7
, 将如下内容保存到 quarkdb.repo
, 放在 /etc/yum.repos.d
下.
1 | [quarkdb-stable] |
然后通过如下命令安装
1 | sudo yum install -y quarkdb quarkdb-debuginfo |
通过源码编译安装
- 下载源码包
1 | git clone https://gitlab.cern.ch/eos/quarkdb.git && cd quarkdb |
- 安装依赖包
1 | sudo yum install -y expect jemalloc libzstd xrootd xrootd-client-libs xrootd-libs xrootd-selinux xrootd-server xrootd-server-libs |
- 安装
devtoolset-7
1 | yum install centos-release-scl && yum install devtoolset-7 && source /opt/rh/devtoolset-7/enable |
- 编译测试安装
QuarkDB
1 | mkdir build && cd build |
搭建 QuarkDB 集群
初始化数据库文件夹
假定我们在 qdb-1:7777
, qdb-2:7777
, qdb-3:7777
三台机器上部署 QuarkDB
集群, 确定集群的名字 --clusterID
可由 uuid
产生, 比如 0c01a140-b3ff-11e8-86bb-9cb6d0e634f1
, 一个唯一的 clusterID
能够避免集群节点误与其他集群交流.
首先,我们要在每一个节点上初始化数据库文件夹. 在每一个节点上运行如下命令:
1 | for i in 1 2 3;do |
每个节点上的命令都要保持 --clusterID
和 --nodes
一直.
修改数据库文件夹权限:
1 | for i in 1 2 3;do |
配置 QuarkDB 实例
QuarkDB 使用 XrootD
作为通信后端, 所以其配置跟 EOS
等类似. 每个节点上的配置文件如下( raft
模式)
1 | xrd.port 7777 |
将其保存到 /etc/xrootd/xrootd-quarkdb.cfg
, 然后通过 systemd 启动 quarkdb 实例
1 | for i in 1 2 3;do |
log 文件是 /var/log/xrootd/quarkdb/xrootd.log
.
运行 QuarkDB 集群
为了能正常运行 QuarkDB 集群, 必须有大多数(或法定数(quorum)) 的节点正常可使用, 例如 3个至少有2个, 5个至少有3个,7个至少有4个.
启动集群中大部分节点后, 如果正常的话, 这些节点会进行选举,一个变成 leader
, 其他变成 followers
.
在任一节点上使用 redis-cli -p 7777
进入与集群交互界面, 使用 raft-info
和 quarkdb-info
可以查看节点信息.
验证节点是否正常工作.
1 | qdb-1.example.com:7777> set mykey myval |
管理 QuarkDB 集群
增加节点
- 在新节点上运行创建集群的命令,
--nodes
选项中不要有新的节点,
1 | $ sudo quarkdb-create --path /var/lib/quarkdb/node-4 --clusterID 0c01a140-b3ff-11e8-86bb-9cb6d0e634f1 |
- 在
leader
节点上使用raft_add_observer
命令添加新节点为observer
1 | $ redis-cli -h leader -p 7777 raft_add_observer qdb-4:7777 |
- 在新节点成为
observer
并上线后,提升其为follower
:
1 | $ redis-cli -h leader -p 7777 raft_info |
移除节点
假设我们要移除 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 |
选项后面接的就是认证密码。