MySQL 5.6 参考手册  / 第 16 章高可用性和可扩展性  / 16.1 使用 ZFS 复制  /  16.1.1 使用 ZFS 进行文件系统复制

16.1.1 使用 ZFS 进行文件系统复制

因为zfs sendzfs recv使用流来交换数据,您可以使用它们通过组合 zfs sendssh和 将信息从一个系统复制到另一个系统zfs recv

例如,要将 scratchpool文件系统的快照复制到新服务器上调用的新文件系统slavepool,您可以使用以下命令。此序列结合了 的快照 scratchpool、到副本机器的传输(使用带有登录凭据的ssh )以及使用zfs recv在副本机器上恢复快照:

#> zfs send scratchpool@snap1 |ssh id@host pfexec zfs recv -F slavepool

管道的第一部分zfs send scratchpool@snap1,流式传输快照。该 ssh命令及其在另一台服务器上执行的命令pfexec zfs recv -F slavepool接收流式快照数据并将其写入 slavepool。在本例中,我指定了 -F强制应用快照数据的选项,因此具有破坏性。这很好,因为我正在创建我的复制文件系统的第一个版本。

在副本机器上,复制的文件系统包含完全相同的内容:

#> ls -al /slavepool/
total 23
drwxr-xr-x   6 root     root           7 Nov  8 09:13 ./
drwxr-xr-x  29 root     root          34 Nov  9 07:06 ../
drwxr-xr-x  31 root     bin           50 Jul 21 07:32 DTT/
drwxr-xr-x   4 root     bin            5 Jul 21 07:32 SUNWmlib/
drwxr-xr-x  14 root     sys           16 Nov  5 09:56 SUNWspro/
drwxrwxrwx  19 1000     1000          40 Nov  6 19:16 emacs-22.1/

创建快照后,要再次同步文件系统,您可以创建一个新快照,然后使用 的增量快照功能zfs send将两个快照之间的更改再次发送到副本机器:

#> zfs send -i scratchpool@snapshot1 scratchpool@snapshot2 |ssh id@host pfexec zfs recv slavepool

仅当副本计算机上的文件系统根本未被修改时,此操作才会成功。您不能将增量更改应用于已更改的目标文件系统。在上面的示例中,该ls命令会通过更改元数据(例如文件或目录的上次访问时间)而导致问题。

要防止副本文件系统发生更改,请将副本上的文件系统设置为只读:

#> zfs set readonly=on slavepool

设置readonly意味着您不能通过正常方式更改副本上的文件系统,包括文件系统元数据。通常会更新元数据的操作(如我们的ls)静默执行其功能,而不会尝试更新文件系统状态。

本质上,副本文件系统不过是原始文件系统的静态副本。但是,即使配置为只读,文件系统也可以应用快照。将文件系统设置为只读,重新运行初始副本:

#> zfs send scratchpool@snap1 |ssh id@host pfexec zfs recv -F slavepool

现在您可以对原始文件系统进行更改并将它们复制到副本。