快速同步zfs池

我的服务器将增量备份保存在zfs卷上。 由于数据非常相似,我可以显着减less增长 – 每天大约有500GB的“新数据”,但是池的增长量只有5-10GB /天,其余的则存储在重复数据删除/压缩中。

我想将备份复制到encryption的usb磁盘,因为这个原因,我也将其设置为zfs卷。 当我使用rsync或zfs同步备份发送/接收时,似乎所有数据都被再次传输(只是作为在USB驱动器上的重复数据)。 由于这个原因,目前的备份时间超过了24小时,这使得日常备份成为不可能。

有没有办法更快地备份?

迈克尔·汉普顿(Michael Hampton)的build议非常明确,Solaris手册页非常好,但对于初学者来说,这个概念并不容易掌握。 我将概述我编写脚本时遇到的问题。


本质上,你像往常一样做一个快照x和一个完整的send/recv

 # Initial send, destroy all filesystems on the destination # pool which are not present on the source pool. zfs snapshot pool0@snap0 zfs send -R pool0@snap0 | zfs recv -Fdu pool1 

之后,你做快照x+1并递增发送。 您可以删除源上的旧捕捉,但需要保留最后一个(最近一个),以便计算差异。 如果您丢失/销毁源代码上的最后一个快照,您将不得不重新开始一个完整的初始发送!

 # incremental send, destroy all filesystems on the destination # pool which are not present on the source pool. Afterwards, old # snapshots can be destroyed. zfs snapshot pool0@snap1 zfs send -R -I pool0@snap0 pool0@snap1 | zfs recv -Fdu pool1 zfs destroy pool0@snap0 # Afterwards, repeat and replace snap1 with snap2 and snap0 with snap1 etc. 

一些来自我自己的经验的build议:

  • 删除最后一个快照意味着您需要重新开始,所以要小心,首先检查脚本中的成功返回值。
  • 您可以对快照进行编号或使用date – 编号更容易,但如果您查看日志和/或频繁执行快照,date会更好。
  • 当试验选项并尝试-nv模拟时,请注意这适用于发送,但是会因recv而失败,因为没有任何东西可以接收。 这从手册或错误消息中不明显。
  • 快照将占用空间,直到它们被销毁,并“locking”您删除的空间。 如果您经常备份,这不是问题。 如果您很less使用多个目标磁盘/池和/或备份,则可能会遇到磁盘空间限制。 在Illumos / OpenZFS中存在bookmarksfunction,这可以解决这个问题。 不幸的是,它目前只支持单个快照而不是recursion,所以你必须自己添加recursion代码。
  • 如果你不想使用/写你自己的,使用Github上的许多人之一。 我认为znapzend是其中最成熟的一个。