【存储学习笔记】4:快照(Snapshot)技术的实现方式

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,并不能组成一个一致的数据。

解决备份时的数据一致问题有几个方向:

  1. 备份时不允许服务更新数据:不满足7*24小时可用
  2. 跳过打开文件:服务正在访问的文件通常也是很重要的需要备份的,不应该跳过的
  3. 区别对待备份IO和应用程序的正常访问IO:通过拆分成不同的IO路径来让它们互不影响,从而解决一致性问题

快照(Snapshot) 就是出于动机3被引入的,通过对一个数据对象进行逻辑复制 ,形成完全可用的数据副本,进而拆分应用程序的正常IO可以写到之前的上去,不影响逻辑复制出来的快照卷。

1.2 操作

  1. 准备快照:为了解决快照一致性,基本都需要停IO+刷新缓存
  2. 创建快照(create snapshot):形成此时此刻源卷的数据映像
  3. 删除快照(delete snapshot):删除某个数据映像
  4. 恢复(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

What is Storage Snapshot Technology?

相关推荐
伊织code4 天前
MinIO - macOS上配置、Python调用
python·macos·minio·存储·
木二7 天前
006.MinIO基础使用
kubernetes·存储·分布式存储
Mr.Cssust17 天前
基于FPGA实现SD卡的数据读写(SD NAND FLASH)
嵌入式·verilog·fpga·芯片·sd·存储·flash
Tassel_YUE17 天前
存储实验:基于华为存储实现存储双活(HyperMetro特性)
运维·服务器·数据库·经验分享·华为·存储·实验
UsamaBinLaden18 天前
Apache CloudStack Official Document 翻译节选(十一)
apache·虚拟化·cloudstack·云存储·云计算平台·nfs共享存储
tebukaopu14822 天前
elasticsearch快照存储到linux本地路径或分布式存储系统mioio
linux·elasticsearch·快照
Akamai中国23 天前
揭示灵活分布式云平台的速效降本之道
服务器·分布式·云原生·云计算·云服务·云存储·akamai
Tassel_YUE1 个月前
存储实验:华为异构存储在线接管与在线数据迁移(Smart Virtualization & Smart Migration 特性)
华为·存储·技术分享·实验·在线迁移
佛州小李哥1 个月前
零基础5分钟上手亚马逊云科技核心云开发知识- 跨服务器文件共享存储
科技·架构·云计算·开发·aws·存储·亚马逊云科技