![快速同步 zfs 池](https://linux22.com/image/692788/%E5%BF%AB%E9%80%9F%E5%90%8C%E6%AD%A5%20zfs%20%E6%B1%A0.png)
我的服务器将增量备份保存在 zfs 卷上。由于数据非常相似,我可以显著减少增长 - 每天大约有 500GB 的“新数据”,但池每天仅增长约 5-10GB,其余数据存储在重复数据删除/压缩中。
我想将备份复制到加密的 USB 磁盘,出于这个原因,我也将其设置为 zfs 卷。当我使用 rsync 或 zfs send/recieve 同步备份时,似乎所有数据都再次传输(只是作为重复数据删除存储在 USB 驱动器上)。因此,备份目前需要超过 24 小时,这使得每日备份变得不可能。
有没有办法可以更快地备份?
答案1
Michael Hampton 的建议非常准确,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.
根据我的亲身经历,我给出一些建议:
- 删除最后一个快照意味着您需要重新开始,因此请小心,先检查脚本中的成功返回值。
- 您可以对快照进行编号或使用
date
- 编号更容易,但如果您查看日志和/或频繁拍摄快照,日期会更好。 - 在尝试使用选项并尝试
-nv
模拟时,请注意,这对于 send 有效,但对于 recv 会失败,因为没有任何内容可接收。这在手册或错误消息中都不是显而易见的。 - 快照会占用空间,直到被销毁,并“锁定”您已删除的空间。如果您经常备份,这不是问题。如果您使用多个目标磁盘/池和/或很少备份,您可能会遇到磁盘空间限制。illumos/OpenZFS 中有此功能
bookmarks
,可以解决这个问题。不幸的是,它目前仅支持单个快照,而不是递归,因此您必须自己添加递归代码。 - 如果你不想使用/编写自己的,可以使用 Github 上的众多版本之一。我认为
znapzend
它是其中最成熟的一个。