为了支持高可用性环境,提供当前活动机器和热备份信息的即时副本是 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
,它将快照信息应用于新文件系统或现有文件系统。