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

Wil*_*tin 4 apache-zookeeper

我正在了解ZooKeeper,并正在寻找备份存储在ZooKeeper中的数据的选项。ZooKeeper写入两个数据文件,快照和事务日志。人们经常提到快照是“模糊的”,需要在它们上重播事务日志以获取最新状态。

对于观察者,没有事务日志持久化到磁盘上。如果我要获取由观察者(或没有事务日志的领导者/跟随者)编写的快照,并将其放入新的独立的ZooKeeper中,则可以保证ZooKeeper的状态与将快照写入磁盘时的状态相同?

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

Wil*_*tin 5

否。快照文件不足以保证返回到先前的状态。实际上,快照文件在任何时间点甚至都不能代表树的状态。

从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数据结构,您可能会发现模糊快照是可以接受的,但是如果您要保证有效的树,请同时获取快照和事务日志。