【存储学习笔记】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?

相关推荐
栀夏6135 天前
Ceph 学习指南 集群部署【 cephadm 】
中间件·存储
petaexpress9 天前
云存储的费用是多少?2024年最新价格表
运维·服务器·云存储·云存储的费用是多少·云存储的费用是多少最新·云存储费用
u01093626510 天前
Linux系统块存储子系统分析记录
linux·存储·1024程序员节·块i/o
云中小筑19 天前
SD2.0 Specification之命令(Commands)
sd·存储·sd协议·嵌入式存储·sd命令·sd介绍
向宇it25 天前
【unity框架开发12】从零手搓unity存档存储数据持久化系统,实现对存档的创建,获取,保存,加载,删除,缓存,加密,支持多存档
开发语言·unity·缓存·游戏引擎·持久化·存储·存档
小南家的青蛙1 个月前
ElasticSearch之集群中的节点
elasticsearch·存储
Ciderw1 个月前
SPDK从安装到运行hello_world示例程序
架构·nvme·存储·spdk
云中小筑1 个月前
SD2.0 Specification之大容量卡与标准容量卡的命令差异
sd·存储·sd协议·嵌入式存储
伊织code2 个月前
MinIO - macOS上配置、Python调用
python·macos·minio·存储·
木二2 个月前
006.MinIO基础使用
kubernetes·存储·分布式存储