在实际生产系统上存储的数据,都是基于某种文件系统的形式组织、存放起来的。对一些关键的数据,就需要备份。通常,有两种方式:
1.基于Linux/unix下的tar/cpio等工具
虽然它也能实现备份,但不足之处在于有IO写入的情况下,可能无法保证文件系统的integrity (完整性).
2. frozen-image
虽然备份的时候停下业务、卸载 文件系统就可以了,但是系统管理员一般不愿意停下业务、或者卸载文件系统,因此stable snapshot技术出现了。(snapshot/frozen-image/point-in-time都是指文件系统中的stable image).根据重启之后,数据是否还一直,snapshot可以分为non persistent snapshot 和persistent snapshot。
下面基于VxFS文件想,介绍一下snapshot的使用示例:
#vxassist make fs1 100m
#mkfs -F vxfs /dev/vx/rdsk/fs1 100m
version 4 layout
204800 sectors, 102400 blocks of size 1024, log size 1024 blocks
unlimited inodes, largefiles not supported
102400 data blocks, 101280 free data blocks
4 allocation units of 32768 blocks, 32768 data blocks
last allocation unit has 4096 data blocks
#mount -F vxfs /dev/vx/dsk/fs1 /fs1
#echo hello > /fs1/fileA
#echo goodbye > /fs1/fileB
#mkdir /snap
#vxassist make snap 10m
#mount -F vxfs -osnapof=/fs1,snapsize=20480 /dev/vx/dsk/snap /snap #建立快照
#df -k
...
/dev/vx/dsk/fs1 102400 1135 94943 2% /fs1
/dev/vx/dsk/snap 102400 1135 94936 2% /snap
...
#ls -l /fs1
total 4
-rw-r--r-- 1 root other 6 Jun 7 11:17 fileA
-rw-r--r-- 1 root other 8 Jun 7 11:17 fileB
drwxr-xr-x 2 root root 96 Jun 7 11:15 lost+found
#ls -l /snap
total 4
-rw-r--r-- 1 root other 6 Jun 7 11:17 fileA
-rw-r--r-- 1 root other 8 Jun 7 11:17 fileB
drwxr-xr-x 2 root root 96 Jun 7 11:15 lost+found
#cat /fs1/fileA
hello
#cat /snap/fileA
hello
#rm /fs1/fileA
# cat /snap/fileA
hello
#df -k
...
/dev/vx/dsk/fs1 102400 1134 94944 2% /fs1
/dev/vx/dsk/snap 102400 1135 94936 2% /snap
然后,用户可以利用快照进行备份,在VxFS中可以利用fscat(类似于linux中的dd命令):
#vxassist make fs1 10m
#vxassist make fs1-copy 10m
#vxassist make snap 5m
#mkfs -F vxfs /dev/vx/rdsk/fs1 10m
version 4 layout
20480 sectors, 10240 blocks of size 1024, log size 1024 blocks
unlimited inodes, largefiles not supported
10240 data blocks, 9144 free data blocks
1 allocation units of 32768 blocks, 32768 data blocks
last allocation unit has 10240 data blocks
#mount -F vxfs /dev/vx/dsk/fs1 /fs1
#echo hello > /fs1/hello
#echo goodbye > /fs1/goodbye
#mount -F vxfs -osnapof=/fs1,snapsize=10240 /dev/vx/dsk/snap /snap
#rm /fs1/hello
#rm /fs1/goodbye
#fscat /dev/vx/dsk/snap > /dev/vx/rdsk/fs1-copy #场景快照snap的备份,文件系统名称是fs1-copy
删除fs1/hello和fs1/goodbye之后,snap文件中的super block中的dirty位被设置起来,因此后面他的备份文件系统fs1-copy中的dirty-bit也处于置位状态,在fs1-copy被挂载的时候就会重放出之前的文件:
# fsck -F vxfs /dev/vx/rdsk/fs1-copy
log replay in progress
replay complete - marking super-block as CLEAN
#mount -F vxfs /dev/vx/dsk/fs1-copy /fs2
#ls -l /fs2
total 4
-rw-r--r-- 1 root other 8 Jun 7 11:37 goodbye
-rw-r--r-- 1 root other 6 Jun 7 11:37 hello
drwxr-xr-x 2 root root 96 Jun 7 11:37 lost+found
#cat /fs2/hello
hello
#cat /fs2/goodbye
goodbye
VxFS中snapshot的实现
在VxFS里,这些snapshot只是在文件系统被挂载或运行的时候,里面的数据才会存在,因此是non-persistent的。为了改进这个问题,VxFS引入了checkpoints的概念。两者的区别如下表:
Non-persistent snapshot 只有只读属性的原因是,它的bitmap只记录了变化的block,如果读的话,现有的数据结构(设计)无法支持。
VxFS中checkpoints的用法示例:
#mkfs -F vxfs /dev/vx/rdsk/fs1 100m
version 4 layout
204800 sectors, 102400 blocks of size 1024, log size 1024 blocks
unlimited inodes, largefiles not supported
102400 data blocks, 101280 free data blocks
4 allocation units of 32768 blocks, 32768 data blocks
last allocation unit has 4096 data blocks
#mount -F vxfs /dev/vx/dsk/fs1 /fs1
#echo hello > /fs1/hello
#echo goodbye > /fs1/goodbye
#ls -l /fs1
total 4
-rw-r--r-- 1 root other 8 Jun 9 11:05 goodbye
-rw-r--r-- 1 root other 6 Jun 9 11:05 hello
drwxr-xr-x 2 root root 96 Jun 9 11:04 lost+found
#fsckptadm create ckpt1 /fs1 #创建checkponts1
#rm /fs1/goodbye
#echo "hello again" > /fs1/hello
#fsckptadm create ckpt2 /fs1 #创建checkponts2
#fsckptadm list /fs1
/fs1
ckpt2:
ctime = Sun Jun 9 11:06:55 2002
mtme = Sun Jun 9 11:06:55 2002
flags = none
ckpt1:
ctime = Sun Jun 9 11:05:48 2002
mtime = Sun Jun 9 11:05:48 2002
flags = none
#mkdir /ckpt1
#mkdir /ckpt2
#mount -F vxfs -ockpt=ckpt1 /dev/vx/dsk/fs1:ckpt1 /ckpt1
#mount -F vxfs -ockpt=ckpt2 /dev/vx/dsk/fs1:ckpt2 /ckpt2
#ls -l /fs1
total 2
-rw-r--r-- 1 root other 12 Jun 9 11:06 hello
drwxr-xr-x 2 root root 96 Jun 9 11:04 lost+found
#ls -l /ckpt1
total 4
-rw-r--r-- 1 root other 8 Jun 9 11:05 goodbye
-rw-r--r-- 1 root other 6 Jun 9 11:05 hello
drwxr-xr-x 2 root root 96 Jun 9 11:04 lost+found
#ls -l /ckpt2
total 0
-rw-r--r-- 1 root other 12 Jun 9 11:06 hello
drwxr-xr-x 2 root root 96 Jun 9 11:04 lost+found
VxFS中checkpoints的实现:(复制indoe/file descriptor)
VxFS storage checkpoints are heavily tied to the implementation of VxFS. The
sectionVxFS Disk Layout Version 5, in Chapter 9, describes the various
components of the VxFS disk layout. VxFS mountable entities are called filesets.
Each fileset has its own inode list including an inode for the root of the fileset,
allowing it to be mounted separately from other filesets. By providing linkage
between the two filesets, VxFS uses this mechanism to construct a chain of
checkpoints, as shown in Figure 12.4.
This linkage is called a clone chain. At the head of the clone chain is the primary
fileset. When a filesystem is created with mkfs, only the primary fileset is created.
When a checkpoint is created, the following events occur:
■ A new fileset header entry is created and linked into the clone chain. The
primary fileset will point downstream to the new checkpoint, and the new
checkpoint will point downstream to the next most recent checkpoint.
Upstream linkages will be set in the reverse direction. The downstream
pointer of the oldest checkpoint will be NULL to indicate that it is the
oldest fileset in the clone chain.
■ An inode list is created. Each inode in the new checkpoint is an exact copy
of the inode in the primary fileset with the exception of the block map.
When the checkpoint is created, inodes are said to be fully overlayed. In
order to read any data from the inode, the filesystem must walk up the
clone chain to read the blocks from the inode upstream.
■ The in-core fileset structures are modified to take into account the new
checkpoint. This is mainly to link the new fileset into the clone chain.
下面是主要的数据结构关联图: