QuarkDB 被设计用来作为 EOS 下一代的 Namespace. 要使用 QuarkDB, EOS 版本必须是 4.4.0 以上. 目前 (2018.11.1) EOS 稳定版本是 4.3.12, github 上的版本则到了 4.4.10. 要安装 4.4.0 以上版本, 可以从 EOS 的 commit 源安装. 本文主要参考 Namespace in QuarkDB configuration.


目录

  1. 搭建一个 QuarkDB 集群
  2. 配置 EOS MGM 使用 QuarkDB
  3. 内存 NS 到 QuarkDB NS 的转化

搭建一个 QuarkDB 集群

为了使用 QuarkDB 作为 EOS MGM 的 namespace, 我们首先要搭建一个 QuarkDB 集群, 可以参考 搭建并运行管理 QuarkDB 集群) 安装好 QuarkDB 并搭建好一个有三个 quardb node 如 qdb-1:7777, qdb-2:7777, qdb-3:7777 的集群.

配置 EOS MGM 使用 QuarkDB

要将 MGM 服务与 QuarkDB 整合到一起, 我们要对 /etc/xrd.cf.mgm 做一些修改.

  1. 修改 mgm.nslib 指令, 导入 Namespace 的 QuarkDB 实现.

    1
    mgm.nslib /usr/lib64/libEosNsQuarkdb.so
  2. 列出 MGM 进程连接的 QuarkDB 集群的端点.

    1
    mgmofs.qdbcluster qdb-1:7777 qdb-2:7777 qdb-3:7777
  3. 如果 QuarkDB 启用了密码认证, 则要修改以下选项:

    1
    2
    mgmofs.cfgtype quarkdb
    mgmofs.qdbpassword_file /etc/qdb.passwd

其中 /etc/qdb.passwd 是 QuarDB 的密码文件.

  1. master 模式运行 MGM 服务.

    1
    2
    $ systemctl start eos@master
    $ systemctl start eos@mgm
  2. 如果一切正常, 可以看到如下一些进程.

    1
    2
    $ ps aux|grep xrootd
    ...

在生产环境下, 为了有更好的性能, 应该:

  1. QuarkDB 集群服务 和 MGM 服务运行在不同的节点上.
  2. 至少 QuarkDB 主进程的 /var/lib/quarkdb/ 文件夹应存储到 SSD 分区.

内存 NS 到 QuarkDB NS 的转化

使用 eos-log-compact 工具压缩 Changelog 文件:

1
2
$ eos-log-compact /var/eos/md/file.mdlog /var/eos/md/compacted_file.mdlog
$ eos-log-compact /var/eos/md/directory.mdlog /var/eos/md/compacted_directory.mdlog

压缩需要将 namespace 整体加载到内存中, 因此压缩 log 的机器必须有足够大的内存来保存 namespace 数据结构. 为了更好的性能, 建议 changelog 文件也应该存储在 SSD 分区.

为了加速初始的导入, QuarkDB 有一个特殊的 bulkload 配置模式, 在这种模式下, 我们期待只做的就是向后端写入, QuarkDB 中的数据压缩只发生在导入最后阶段. 因此减少了I/O次数,加速了整个过程.

使用 quarkdb-create 工具创建一个压缩用 QuarkDB 集群, 下面是一个 QuarkDB 配置文件的例子:

1
2
3
4
xrd.port 7777
xrd.protocol redis:7777 /usr/lib64/libXrdQuarkDB.so
redis.mode bulkload
redis.database /var/lib/quarkdb/convert/

启动 QuarkDB 集群后, 我们可以使用 eos-ns-convert 工具来进行实际的 namespace 转换过程:

1
$ eos-ns-convert /var/eos/md/compacted_file.mdlog /var/eos/md/compacted_directory localhost 7777

eos-ns-convert 必须使用压缩后的 changelog 文件作为输入.

bulkload 完成后, 就可以关掉 QuarkDB 实例, 然后使用 quarkdb-create 在不同的位置建一个新的 QuarkDB 目录, 列出组建 QuarkDB 集群的节点. 新建的 QuarkDB raft-journal 目录可以删除掉. 存储在 /var/lib/quarkdb/convert 的 raft 日志可以利用 cp/scp/rsync 等等复制到新的 QuarkDB 集群的所有实例上. 确保 QuarkDB 集群是运行在 raft 模式而不是 bulkload 模式. 复制完成后, QuarkDB 集群所有实例就可以启动了, 系统会很快达到一个主节点多个副本节点的稳定配置状态.