ZFS系列(十一)发送与接收文件系统

通过前面一篇文章,你对快照特性已经很了解了,现在让我们把视线转移到ZFS的另一个明珠上,即它的从一个主机往另一个主机发送和接受整个文件系统的能力。这是非常了不起的功能,我不清楚其他文件系统在不借助第三方工具(比如”dd”和”nc”)是不是可以做到这一点。

ZFS发送

发送一个ZFS文件系统,意味着对一个数据集做快照,然后发送这个快照。这样确保了在发送数据时始终保持一致,这是ZFS的关键所在。默认情况下,我们将数据发送到一个文件。然后,我们可以将该文件移动到离线备份、另一个存储服务器或者其他任何地方。ZFS发送相对于“dd”的优点是,您不需要使文件系统离线来获取数据。在我看来,这是非常棒的特性。
要将文件系统发送到文件,首先必须制作数据集的快照。创建快照后,可以发送快照。这会产生一个输出流,把该输出流必须重定向到一个文件即可。命令如下:

1
2
# zfs snapshot tank/test@tuesday
# zfs send tank/test@tuesday > /backup/test-tuesday.img

现在,你的大脑应该在思考。您可以使用一整套Unix实用程序来操作数据。所以,与其存储原始数据,不如使用“xz”工具压缩它?确实可以这样:

1
# zfs send tank/test@tuesday | xz > /backup/test-tuesday.img.xz

想要加密?你可以使用OpenSSL或GnuPG:

1
# zfs send tank/test@tuesday | xz | openssl enc -aes-256-cbc -a -salt > /backup/test-tuesday.img.xz.asc

ZFS接收

接收ZFS文件系统是另一方面。在有数据流的地方,可以将数据导入到完整的可写文件系统中。如果不能对文件中的数据进行任何操作,那么将文件系统发送到映像文件就没有多大意义了。

就像“zfs send”对流进行操作一样,“zfs receive”也进行同样的操作。那么,假设我们想要接收“/backup/test-tuesday.img“文件系统。我们可以将它接收到任何存储池,它将创建必要的数据集。

1
# zfs receive tank/test2 < /backup/test-tuesday.img

当然,在我们的发送示例中,我压缩并加密了发送的文件系统。所以,为了反转这个过程,我以相反的顺序执行命令:

1
# openssl enc -d -aes-256-cbc -a -in /storage/temp/testzone.gz.ssl | unxz | zfs receive tank/test2

“zfs recv”命令可以作为快捷方式使用。

发送命令与接收命令结合

“zfs发送”和“zfs接收”都对输入和输出流进行操作。因此,将一个文件系统发送到另一个文件系统是有意义的。当然,我们可以在本地这样做:

1
# zfs send tank/test@tuesday | zfs receive pool/test

这是完全可以接受的,但是在同一个存储服务器上保留文件系统的多个副本并没有太大意义。相反,将文件系统发送到远程机器会更有意义。你可以用OpenSSH简单地做到这一点:

1
# zfs send tank/test@tuesday | ssh user@server.example.com "zfs receive pool/test"

看看这个命令是多么的简单。您从快照中获取实时的、运行的和一致的数据,并将该数据发送到另一个服务器。这对于离线存储备份来说是史诗级的。在您的ZFS存储服务器上,您将经常运行数据集的快照,然后,启动一个夜间cron作业,您可以使用“zfs receive”将最新的快照“zfs send”到一个离线存储服务器。由于运行的是一个安全、严密的系统,所以需要使用OpenSSL和XZ加密数据,非常简单便捷。

总结

我禁不住再次强调发送和接收ZFS文件系统的简单性。这是使ZFS成为存储市场的有力竞争者的最大的特性之一。利用这个特性结合crontab,就可以使用ZFS发送和接收对数据进行离线备份。您可以发送文件系统而不卸载它们。您可以在接收端更改数据集属性。所有数据都保持一致,您还可以将它与其他Unix工具结合使用(如上文介绍的压缩工具和加密工具等)。

参考资料

https://pthree.org/2012/12/20/zfs-administration-part-xiii-sending-and-receiving-filesystems/

如果你觉得本文对你有帮助,欢迎打赏