ZooKeeper 快照文件是否足以恢复状态?

Is a ZooKeeper snapshot file enough to restore state?

我正在了解 ZooKeeper 并查看备份存储在 ZooKeeper 中的数据的选项。 ZooKeeper 写入两个数据文件,快照和事务日志。人们经常提到快照是 "fuzzy" 并且需要重播事务日志以获得最新状态。

在观察者的情况下,没有事务日志保存到磁盘。如果我要拍摄由观察者(或 leader/follower 没有事务日志)写入的快照,并将其放入新的独立 ZooKeeper 中,ZooKeeper 的状态是否能保证与写入快照时的状态相同到磁盘?

换句话说,要将 ZooKeeper 备份到当前状态,您需要快照和事务日志。如果我只满足于备份到拍摄快照的时间,那么仅快照就足够了吗?

没有。快照文件不足以保证 return 到以前的状态。事实上,快照文件甚至可能不代表树在任何时间点的状态。

来自 O'Reilly ZooKeeper 一书:

让我们通过一个例子来说明这一点。假设一个数据树只有两个 znode:/z 和 /z'。最初,/z 和 /z' 的数据都是整数 1 现在考虑以下步骤序列:

  1. 开始快照。
  2. 序列化并将 /z = 1 写入快照。
  3. 将/z的数据设置为2(事务T)。
  4. 将/z'的数据设置为2(事务Tʹ)。
  5. 序列化并将 /z' = 2 写入快照。

此快照包含 /z = 1 和 /z' = 2。但是,从来没有一个时间点两个 znode 的值都是这样的。不过这不是问题,因为服务器会重放事务。它用快照开始时已提交的最后一个事务标记每个快照——称之为 TS。如果服务器最终加载快照,它会重放事务日志中 TS 之后的所有事务。在这种情况下,它们是 T 和 T'。在快照之上重播T和Tʹ后,服务器获得/z = 2和/z' = 2,这是一个有效的状态。

您可能会发现您的 ZooKeeper 数据结构可以接受模糊快照,但如果您想保证树的有效性,请同时获取快照和事务日志。