我目前有两台服务器都有完全相同的硬件,磁盘等
一台服务器(server1)将成为“主”服务器。 它基本上是一个raidz2服务器,有人连接到它的SMB共享。
另一台服务器(server2)的configuration与server1(raidz2)相同,但仅用于备份server1。 这意味着当我们从服务器1中失去磁盘故障,火灾,水损坏等等时,我们将会进行异地备份。
我试图找出最好的办法做到server2的备份。
起初,我在想像rsync这样的东西。 这在cron中是微不足道的,我可以每周去一次。
或者,我正在想着zfs send / recv。 我的理解是,ZFS可以做“快照”,所以我认为如果能够创build快照/增量备份而不会损失太多空间,这将是非常好的。 我觉得这可能会更难实施/容易出错。
正如我之前所说,两台服务器在硬件和raidz2布局方面configuration相同。 你们都会为我目前的情况推荐些什么?
ZFS非常有弹性。 运送文件系统的最基本的例子是:
# zfs snapshot tank/test@tuesday # zfs send tank/test@tuesday | ssh [email protected] "zfs receive pool/test"
注意发送之前的快照(并发送快照)。
您可以将其包装到脚本中,以便在将本地快照发送到远程后删除本地快照 – 如果您有足够的磁盘空间,也可以保留它。 保留之前的备份服务器上的快照。
来源和强烈推荐阅读: https : //pthree.org/2012/12/20/zfs-administration-part-xiii-sending-and-receiving-filesystems/
我会使用增量ZFS发送/接收。 它应该比rsync更有效率,因为ZFS知道自从上一个快照以来已经发生了什么变化,而不需要探索整个文件系统。
假设你想完全备份一个文件系统名字datapool/fs 。
您首先创build一个池来将您的备份存储在目标服务器上,并在源池上创build一个recursion快照:
dest # zpool create datapool ... source # zfs snapshot -r datapool/fs@snap1
那么您将整个数据作为初始备份发送:
source # zfs send -R datapool/fs@snap1 | ssh dest zfs receive datapool/fs
下个星期(或任何你喜欢的时期),你在源池上创build第二个快照,并在目的地上递增发送。 那个时候,ZFS足够聪明,只能发送一周内发生的变化(删除,创build和修改文件)。 当一个文件被修改时,它不是作为一个整体被发送,而是只有被修改的块被发送和更新。
source # zfs snapshot -r datapool/fs@snap2 source # zfs send -ri snap1 datapool/fs@snap2 | ssh dest zfs receive -F datapool/fs
重复该操作,每次备份时递增快照号码。
当您不再需要这些服务器时,请删除这些服务器上未使用的旧快照。
如果你有带宽限制,你可以即时压缩/解压缩数据,例如在pipe道中插入gzip / zip命令或启用ssh压缩。
source # zfs send -ri snap1 datapool/fs@snap2 | gzip | ssh dest "gunzip | zfs receive -F datapool/fs"
您也可以利用mbuffer获得更稳定的带宽使用,如本页所述 :
dest # mbuffer -s 128k -m 1G -I 9090 | zfs receive datapool/fs source # zfs send -i snap2 datapool/fs@snap3 | mbuffer -s 128k -m 1G -O wxyz:9090
注: zfs -r标志在非Solaris ZFS实现中不可用,请参阅http://lists.freebsd.org/pipermail/freebsd-fs/2012-September/015074.html 。 在这种情况下,请不要在目标上使用-F标志,而是显式回滚数据集。 如果在源上创build了新的数据集,则在进行快照+增量发送/接收之前,先独立发送它们。
当然,如果只有一个文件系统没有基础数据集层次结构进行备份,或者如果要执行独立备份,则增量备份更容易实现,并且应该与ZFS实现一样工作:
T0:
zfs snapshot datapool/fs@snap1 zfs send datapool/fs@snap1 | ssh dest zfs receive datapool/fs
T1:
zfs snapshot datapool/fs@snap2 zfs send -i snap1 datapool/fs@snap2 | ssh dest zfs receive -F datapool/fs
使用zfs发送/接收向远程发送1 TB时遇到问题。 我决定打破单一的1TB文件系统,以包含几个孩子。 现在networking出现故障后,最糟糕的情况是只有一个孩子需要重新发送。 我使用我的脚本来照顾recursion发送,并保持远程同步: https : //github.com/dareni/shellscripts/blob/master/zfsDup.sh
我希望这个脚本可以用于其他人。
示例输出:
# zfsDup.sh shelltests Test: array_add() Test: array_clear() Test: array_iterator() Test: nameValidation() Test: isValidSnapshot() Test: getSnapshotFilesystems() Test: getSnapshotData() Test: getRemoteDestination() Test: printElapsed() Test: convertToBytes() Shell tests completed, check the output for errors. # zfsDup.sh zfstests Start zfs tests. Test: new parent file system. Test: new child file system. Test: simulate a failed send of the child filesystem. Test: duplicate and check the child@2 snapshot is resent. Test: snapshot existing files with updated child data. Test: simulate a fail send os child@3 Test: snapshot test1. Test: snapshot test2. Test: snapshot test3. Snapshot tests completed ok. Test: remote host free space. Test: new remote FS with no quota. Test: incremental remote FS update with no quota. Cleaning up zroot/tmp/zfsDupTest/dest zroot/tmp/zfsDupTest/source Test execution time: 89secs ZFS tests completed, check the output for errors. # zfs list -t all -r ztest NAME USED AVAIL REFER MOUNTPOINT ztest 344K 448M 19K /ztest ztest@1 9K - 19K - ztest@6 9K - 19K - ztest/backup 112K 448M 19K /ztest/backup ztest/backup@1 9K - 19K - ztest/backup@2 0 - 19K - ztest/backup@3 0 - 19K - ztest/backup@4 9K - 19K - ztest/backup@5 0 - 19K - ztest/backup@6 0 - 19K - ztest/backup/data 57.5K 448M 20.5K /ztest/backup/data ztest/backup/data@1 0 - 19.5K - ztest/backup/data@2 0 - 19.5K - ztest/backup/data@3 9K - 19.5K - ztest/backup/data@4 9K - 19.5K - ztest/backup/data@5 0 - 20.5K - ztest/backup/data@6 0 - 20.5K - # zfs list -t all -r zroot/tmp NAME USED AVAIL REFER MOUNTPOINT zroot/tmp 38K 443M 19K /tmp zroot/tmp/zfsDupTest 19K 443M 19K /tmp/zfsDupTest # zfsDup.sh ztest zroot/tmp root@localhost ================================================================================ Starting duplication 20151001 16:10:56 ... [email protected] ztest/[email protected] ztest/backup/[email protected] Duplication complete 20151001 16:11:04. ================================================================================ # zfsDup.sh ztest zroot/tmp root@localhost ================================================================================ Starting duplication 20151001 16:11:25 ... [email protected] to date ztest/[email protected] to date ztest/backup/[email protected] to date Duplication complete 20151001 16:11:29. ================================================================================ # zfs snapshot -r ztest@7 # zfsDup.sh ztest zroot/tmp root@localhost ================================================================================ Starting duplication 20151001 16:12:25 ... [email protected] ztest/[email protected] ztest/backup/[email protected] Duplication complete 20151001 16:12:33. ================================================================================ # zfs list -t all -r zroot/tmp NAME USED AVAIL REFER MOUNTPOINT zroot/tmp 124K 442M 19K /tmp zroot/tmp/zfsDupTest 19K 442M 19K /tmp/zfsDupTest zroot/tmp/ztest 86K 442M 19K /tmp/ztest zroot/tmp/ztest@6 9K - 19K - zroot/tmp/ztest@7 0 - 19K - zroot/tmp/ztest/backup 58K 442M 19K /tmp/ztest/backup zroot/tmp/ztest/backup@6 9K - 19K - zroot/tmp/ztest/backup@7 0 - 19K - zroot/tmp/ztest/backup/data 30K 442M 20K /tmp/ztest/backup/data zroot/tmp/ztest/backup/data@6 10K - 20K - zroot/tmp/ztest/backup/data@7 0 - 20K -
有一个很好的工具来pipe理发送/ recv的东西,并整合进度条
它位于sysutils / zxfer或github下的freebsd ports树中
您还可以使用像sysutils / zfstools或sysutils / zfsnap这样的工具来自动创build快照,这些快照将通过zxfer同步到远程计算机
在官方的FreeBSD手册中有更多关于zfs send / recv过程的文档
您也可以将发送/接收pipe理为例如bzip2和rsync 。 正如这篇博客文章所指出的,奴隶必须“只读”设置。