1 快照
1.1 动机
在上一篇《备份》里提到,热备份就是在执行操作时,服务器需要正常处理来自用户或应用对数据的更新,这样能够保证数据7*24小时可用(在很多服务里这是必要的)。
而热备份的困难就是如何保证数据的一致性,比如有两个数据块,在第一个时刻,他们是 A 1 B 1 A_1B_1 A1B1,此时备份了数据块 A 1 A_1 A1,在下一个时刻,它们被修改成了下一个版本 A 2 B 2 A_2B_2 A2B2,此时备份了下一个数据块 B 2 B_2 B2,得到的备份数据就是 A 1 B 2 A_1B_2 A1B2,并不能组成一个一致的数据。
解决备份时的数据一致问题有几个方向:
- 备份时不允许服务更新数据:不满足7*24小时可用
- 跳过打开文件:服务正在访问的文件通常也是很重要的需要备份的,不应该跳过的
- 区别对待备份IO和应用程序的正常访问IO:通过拆分成不同的IO路径来让它们互不影响,从而解决一致性问题
快照(Snapshot) 就是出于动机3被引入的,通过对一个数据对象进行逻辑复制 ,形成完全可用的数据副本,进而拆分应用程序的正常IO可以写到之前的上去,不影响逻辑复制出来的快照卷。
1.2 操作
- 准备快照:为了解决快照一致性,基本都需要停IO+刷新缓存
- 创建快照(create snapshot):形成此时此刻源卷的数据映像
- 删除快照(delete snapshot):删除某个数据映像
- 恢复(restore):用快照的数据恢复源卷数据
2 写前复制(Copy-on-Write)
2.1 原理
也叫写时复制 、首写复制(Copy on First Write),第一次对源卷进行写入操作时,把数据搬到快照卷里,然后再修改源卷的数据。
此后,更新操作都会直接更新源卷里的数据。读源卷时从源卷读,读快照卷时,如果快照卷里那个位置有被copy过来的数据就直接读快照卷,否则就fallback回源卷读取。
为了解决"怎么知道快照卷里对应位置的数据是不是copy过来了"这件事,可以引入一个快照映射表 ,所有on first write的copy动作都记录在这个表里,只要查表miss了就回源卷读取。
删除快照:直接删除快照卷和快照映射表
数据回滚:扫一遍快照映射表,把快照卷中的数据写回到源卷里去,就能将源卷恢复到该快照所记录的状态了
2.2 优缺点
优点:不影响源卷,删除快照卷很简单
缺点:首次写入时需要先拷贝数据再写源卷,需要一次read两次write
3 写时转向(Redirect-on-Write)
3.1 原理
也叫写时重定向,相比于CoW是在首写的时候copy数据到快照卷,源卷的数据还是在源卷的位置上。RoW则是相反,快照一旦生成这些数据块就放在那不动了,如果有对数据的修改,那么就把修改的数据写到新的位置上去,然后让源卷指向这个新的数据位置。
3.2 优缺点
优点:首写只需要一次重定向write
缺点:因为源卷指向的数据和快照卷的数据交错,所以删除快照时候,需要把数据(链接)调整回源卷,因此删除快照操作相对更复杂一点
3.3 案例
WAFL(Write Anywhere File Layout)文件系统就是用了RoW的典型例子,在打快照时只要建一个新的逻辑根指向源卷的数据,在对源卷有更改时就把写入操作redirect到新的位置,不动快照指向的那些数据。由于WAFL是多级链接结构,真正的数据块在最下面,所以每次write redirect都会递归地建立这条path上的所有node:
另一个用RoW做快照的经典例子是Hyper-V的differencing vhdx,也是写时转向到新的vhdx文件里:
4 拆分镜像(Split-Mirror)
4.1 原理
类似于RAID1的镜像盘,持续维护完整的两份源卷数据,对源卷的写入会复制给镜像卷,保证镜像卷的数据和源卷相同。当快照操作来临时,只要停止镜像复制操作,镜像卷就立即成为了此时刻的快照卷。
删除快照:快照卷完成数据备份后要删除快照,只要直接与源卷同步数据,同步好之后可以继续作为镜像卷使用
数据回滚:直接拿快照卷作为服务的底层数据即可
4.2 优缺点
优点:数据恢复、复制和归档简单。快照卷和源卷独立存在,所以一方的数据丢失,另一方仍然可用
缺点:
- 想要支持几个快照就需要几倍的存储空间
- 不能随时创建快照,比如如果没有创建镜像卷、或者镜像卷正处于数据同步过程中,都不能创建
- 为了支持快照操作,需要持续的镜像复制操作,增大了系统开销
4.3 案例
EMC的TimeFinder引入了一种业务持续卷(Business Continuance Volume,BCV),和主存储设备绑定成BCV Pair之后就作为主存储设备的镜像卷,持续将主存储设备的数据复制过来。
需要打快照时,就分裂BCV Pair,分裂后BCV上的就是主存储设备的快照数据。
需要删除快照时,就重建BCV Pair,这会丢弃在分裂后对BCV的修改,并将分裂后对主存储设备的修改应用到BCV上,使BCV快速成为镜像卷。
需要restore时,也是重新绑定BCV Pair,但是将BCV的数据写入主存储设备即可。
参考阅读
《存储技术原理分析》1.2.2