一些背景。
我在用着中瑞普相互复制两台服务器,每台服务器包含一个 ZFS 池,其中包含两个数据集作为复制主服务器,以及两个集作为复制目标。主集包含本地服务器的系统和 VirtualBox-VM,复制目标与另一台服务器相同。
此外,我正在使用 将每个服务器的所有主集备份到某些 NAS。NASrsync
非常慢,备份需要几个小时才能成功,因此实施的方法是暂停虚拟机,创建一个快照,恢复虚拟机并rsync
从创建的快照运行。重要的是,手动创建的快照没有遵循 ZREP 命名约定,并且在rsync
再次完成后直接被销毁。起初,ZREP 继续并发运行,由 启动cron
。
问题。
但有时 ZREP 会陷入某种状态无法再同步。为了解决这个问题,一位同事告诉我,他需要删除快照并按照流程重新初始化 ZREP。最后,通过不再让 ZREP 与rsync
我们自己的快照并行运行,这个问题得到了解决。
遗憾的是,我不清楚该错误的具体细节,而且同事也不再联系我,但从他的描述来看,似乎在查找复制主服务器和目标服务器之间的快照的共同祖先以进行增量同步时出现了问题。我认为错误消息如下:
cannot receive incremental stream: most recent snapshot of zfs-pool/vbox/tori does not match incremental source
cannot open 'zfs-pool/vbox/tori@zrep_0001b7': dataset does not exist
我对增量发送/接收工作原理的理解。
据我了解文档和其他 问题,为了成功地增量发送快照,发送主服务器和接收目标需要共享用作参数 1 的一个快照,zfs send
并且该快照还需要是接收目标上的当前快照。
第二个参数是任意较新的快照,ZFS 使用它来计算主服务器和目标服务器共有的一个快照的差异,并将这些差异发送到复制目标。由于两者共享参数 1 指定的相同快照,因此这些差异对目标服务器有意义,可以按原样应用。
在我看来,参数-i
vs.-I
要么导致发送一个逻辑快照,其中包含主端的所有计算增量数据,要么发送包含其增量更改的所有中间快照。因此,例如,-i
始终导致目标上出现一个新快照,而-I
可能导致出现 N 个其他快照。
在参数 1 和 2 之间创建和销毁中间快照应该zfs send -i
不会有任何问题,因为 ZFS 始终只计算这两个提供的参数之间的差异,而不关心任何其他中间快照。对于 ZREP,这在理论上意味着只要我不干扰 ZREP 管理的快照,那么在其操作期间是否创建其他快照都不会产生任何影响。这仅仅是因为特殊的 ZREP 快照始终可用,由 ZREP 管理并用于计算复制的差异。所以从理论上讲,额外创建快照rsync
和备份根本不是问题。
这些假设正确吗?
与 ZREP 无关的问题。
一般来说,忽略一些中间快照,增量发送 ZFS 快照是否安全?或者是否有必要将创建的所有中间快照发送到复制目标,以避免网络不同步等?事情如何依赖于-i
vs. -I
?
答案1
是的,您仍然可以获得其间的所有数据,但您无法倒回到其间。
如果您有快照 1、2 和 3,而远程池只有快照 1,则可以给它快照 3 并跳过 2.. 它只是无法回滚到“2”状态。但数据仍会存在。
快照描述了当时的情况。因此,如果远程池中缺少快照“2”,则相当于您从未在那个时间点拍摄过快照。它实际上不知道“2”快照以及当时的内容。
如果您改变主意,则需要删除远程池上的快照“3”,然后才能再次发送“2”,然后发送“3”。
https://www.reddit.com/r/zfs/comments/cfzdb3/is_it_safe_to_send_zfssnapshots_incrementally/euensuy/