bigywater.tech
ZooKeeper · 59

ZooKeeper 数据备份与恢复

ZooKeeper 怎么备份?可以在线复制数据目录吗?只备份快照够不够?用旧备份恢复一个节点会不会回滚整个集群?这篇逐个验证。

5 / 5
在线复制数据目录后副本都能正常启动
3505 → 2983
只用快照恢复丢掉的写入
不回滚
旧备份恢复的 follower 会被 leader 追平

在线备份

实测 · 本机执行输出
   次       复制时源节点 znode 数     副本启动   副本 znode 数   副本 ≤ 源
   1                  458       成功          462        是
   2                 1045       成功         1049        是
   3                 1622       成功         1626        是
   4                 2223       成功         2245        是
   5                 2836       成功         2856        是

这里复制的是 dataDir(含 version-2 下的快照和事务日志)。副本的 znode 数大于等于「复制开始时」的数,是因为复制期间写入还在继续。

只备份快照

实测 · 本机执行输出
  源节点 znode 数 3505;只用快照 snapshot.ba3 恢复:znode 数 2983(快照之后的写入没有了)

旧备份恢复一个节点

实测 · 本机执行输出
  用 300 个写入之前的旧备份恢复 z59c-1 后:Mode follower,znode 数 405(leader 上 405),追上用的是 ['DIFF']

注意这只是「恢复一个节点」。如果所有节点都用旧备份覆盖(整个集群回滚到备份时刻),备份之后的写入就丢了——那是灾难恢复,不是节点恢复,本文没有测整个集群的回滚。

分步演示

备份与恢复
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。单机在线复制 5 次(写入线程持续写);集群恢复用 3 节点伪集群
    • 没有验证:整个集群从备份重建(epoch 与 myid 文件的处理)、跨版本恢复、备份文件的一致性校验工具、对象存储上的备份流程
    京ICP备2026067502号-1京公网安备11010502063487号