我正在了解ZooKeeper,并正在寻找备份存储在ZooKeeper中的数据的选项。ZooKeeper写入两个数据文件,快照和事务日志。人们经常提到快照是“模糊的”,需要在它们上重播事务日志以获取最新状态。
对于观察者,没有事务日志持久化到磁盘上。如果我要获取由观察者(或没有事务日志的领导者/跟随者)编写的快照,并将其放入新的独立的ZooKeeper中,则可以保证ZooKeeper的状态与将快照写入磁盘时的状态相同?
换句话说,要将ZooKeeper备份到其当前状态,您需要快照和事务日志。如果我只满意备份快照的时间,那么仅快照就足够了吗?
否。快照文件不足以保证返回到先前的状态。实际上,快照文件在任何时间点甚至都不能代表树的状态。
从O'Reilly ZooKeeper的书中:
让我们来看一个例子来说明这一点。假设数据树只有两个znode:/ z和/ z'。最初,/ z和/ z'的数据均为整数1。现在考虑以下步骤序列:
启动快照。
序列化并将/ z = 1写入快照。
将/ z的数据设置为2(事务T)。
将/ z'的数据设置为2(事务T?)。
序列化并将/ z'= 2写入快照。
该快照包含/ z = 1和/ z'=2。但是,从未有两个znode的值像这样的时间点。但是,这不是问题,因为服务器重播事务。它用快照启动时已提交的最后一个事务标记每个快照,称为TS。如果服务器最终加载快照,它将在TS之后重播事务日志中的所有事务。在这种情况下,它们是T和T?。重播T和T之后?在快照之上,服务器获得/ z = 2和/ z'= 2,这是有效状态。
通过ZooKeeper数据结构,您可能会发现模糊快照是可以接受的,但是如果您要保证有效的树,请同时获取快照和事务日志。