16.1 使用 ZFS 复制

为了支持高可用性环境,提供当前活动机器和热备份信息的即时副本是 HA 解决方案的关键部分。这个问题有很多解决方案,例如第 17 章,复制

ZFS 文件系统提供创建文件系统内容快照、将快照传输到另一台机器以及提取快照以重新创建文件系统的功能。您可以随时创建快照,并且可以创建任意数量的快照。通过不断创建、传输和恢复快照,您可以以类似于 DRBD 的方式在一台或多台机器之间提供同步。

以下示例显示了一个简单的 Solaris 系统,该系统使用单个 ZFS 池运行,安装在/scratchpool

Filesystem             size   used  avail capacity  Mounted on
/dev/dsk/c0d0s0        4.6G   3.7G   886M    82%    /
/devices                 0K     0K     0K     0%    /devices
ctfs                     0K     0K     0K     0%    /system/contract
proc                     0K     0K     0K     0%    /proc
mnttab                   0K     0K     0K     0%    /etc/mnttab
swap                   1.4G   892K   1.4G     1%    /etc/svc/volatile
objfs                    0K     0K     0K     0%    /system/object
/usr/lib/libc/libc_hwcap1.so.1
                       4.6G   3.7G   886M    82%    /lib/libc.so.1
fd                       0K     0K     0K     0%    /dev/fd
swap                   1.4G    40K   1.4G     1%    /tmp
swap                   1.4G    28K   1.4G     1%    /var/run
/dev/dsk/c0d0s7         26G   913M    25G     4%    /export/home
scratchpool             16G    24K    16G     1%    /scratchpool

MySQL 数据存储在 /scratchpool. 为了帮助演示一些基本的复制功能,还存储了其他项目/scratchpool

total 17
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 snapshot,指定池和快照名称:

#> zfs snapshot scratchpool@snap1

要列出已拍摄的快照:

#> zfs list -t snapshot
NAME                USED  AVAIL  REFER  MOUNTPOINT
scratchpool@snap1      0      -  24.5K  -
scratchpool@snap2      0      -  24.5K  -

快照本身存储在文件系统元数据中,并且由于创建快照的方式不同,保存它们所需的空间会随着时间的推移而变化。快照的初始创建非常快,因为 ZFS 不是获取保存整个快照所需的数据和元数据的完整副本,而是仅记录创建快照时的时间点和元数据。

随着对原始文件系统进行更多更改,快照的大小会增加,因为需要更多空间来保存旧块的记录。如果您创建大量快照,比如每天一个,然后删除本周早些时候的快照,则较新快照的大小也可能会增加,因为构成较新状态的更改必须包含在较新状态中快照,而不是分散在组成一周的七个快照中。

您不能直接备份快照,因为它们存在于文件系统元数据中,而不是作为常规文件。要将快照转换为可以复制到另一个文件系统、磁带等的格式,您可以使用zfs send命令创建快照的流版本。

例如,将快照写入文件:

#> zfs send scratchpool@snap1 >/backup/scratchpool-snap1

或磁带:

#> zfs send scratchpool@snap1 >/dev/rmt/0

您还可以使用以下命令写出两个快照之间的增量更改zfs send

#> zfs send scratchpool@snap1 scratchpool@snap2 >/backup/scratchpool-changes

要恢复快照,您可以使用zfs recv,它将快照信息应用于新文件系统或现有文件系统。