数据库的备份与恢复对数据安全是极为重要的, 特别是对于存储 EOS 元数据的 QuarkDB 数据库。 虽然 QuarkDB 集群有多副本保证元数据的安全, 但按时备份 QuarkDB 集群仍是一个良好的习惯。


Table of Contents

  1. 创建 QuarkDB 快照
  2. 备份 QuarkDB 快照
  3. 恢复 QuarkDB 数据

假定我们的 QuarkDB 数据文件夹是 /var/lib/quarkdb/, 那我们如何来备份它呢?直接复制运行中的 QuarkDB 节点的 /var/lib/quarkdb 到一个备份文件夹是不行的。 因为从开始备份到结束备份期间,QuarkDB 集群很可能会进行写入, 基础的 SST 文件很可能会改变, 这将导致在备份中文件是损坏的。

创建 QuarkDB 快照

QuarkDB 提供了一个 raft-checkpoint 命令, 可以创建一个当前集群的快照,包含了状态机和日志,通过它,我们可以很方便地创建另一个 QuarkDB 实例:

1
127.0.0.1:7777> raft-checkpoint /path/to/backup

需要注意的是, /path/to/backup 要与 /var/lib/quarkdb 处于同一个物理文件系统中, 这将允许对 SST 文件做硬链接,从而创建快照的时间非常短, 即使 DB 有半TB,也只会耗时几秒钟,同时也不占额外的空间。

备份 QuarkDB 快照

在做完快照后, 就可以通过 rsync 等将 快照备份到另外的节点上去。

1
$ rsync -Paz /path/to/backup backup-node:/quarkdb/backup/dir

备份完成后, 记得将 /path/to/backup 删除掉。 否则随着 QuarkDB 持续写入, /var/lib/quarkdb/path/to/backup 会很快分叉, /path/to/backup 也会很快开始占用额外空间。

恢复 QuarkDB 数据

如果 EOS 或 QuarkDB 集群出了问题, 需要恢复数据, 我们可以重新启动一个 QuarkDB 节点或集群, 导入备份的 QuarkDB 快照, 将 EOS 集群指向新的 QDB 集群即可。 可参考 配置 EOS 使用 QuarkDB 作为 NS