当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/426472.html

相关文章:

  • 数根(字符串数根公式)
  • C语言之文件操作上卷(二十一)(逆行人生-2024)
  • 【微服务架构实战】结合实际案例进行微服务架构的设计与实现
  • 为什么要有二级指针
  • 如何保证数据不丢失?(死信队列)
  • 树莓派开发笔记01-树莓派的系统烧录以及初次开机配置
  • 微信答题小程序产品研发-后端开发
  • 回溯算法——LeetCode37 解数独
  • 【CPP】继承语法详解与菱形继承
  • 数据结构(6.2_1)——领接矩阵法
  • 诈骗未成功是否构成犯罪?
  • 网络协议栈应用层的意义(内含思维导图和解析图通俗易懂超易理解)
  • 【NXP-MCXA153】i2c驱动移植
  • C++(11)类语法分析(2)
  • 数字验证每日十问--(3)
  • 22.给定 n 对括号,实现一个算法生成所有可能的正确匹配的括号组合
  • 检测到目标URL存在http host头攻击漏洞
  • C++奇迹之旅:手写vector模拟实现与你探索vector 容器的核心机制与使用技巧
  • 018、钩子函数 mounted和beforeDestroy、父组件向子组件传递参数 props 的使用
  • xlnt在Windows中的dll,lib生成
  • 【网络】私有IP和公网IP的转换——NAT技术
  • java 面试 PDF 资料整理
  • 初步认识Linux系统
  • JavaScript AI 编程助手
  • 达梦数据库的系统视图v$datafile
  • Triton/window安装: triton-2.0.0-cp310-cp310-win_amd64.whl文件
  • 应急响应-DDOS-典型案例
  • JAVA学习之知识补充(下)
  • qt生成一幅纯马赛克图像
  • python循环——九九乘法表(更加轻松的理解循环结构)