各位新朋友~记得先点蓝字关注我哦~
快照的基础概念
1.1 快照的定义
全球网络存储工业协会(Storage Networking Industry Association,SNIA)对快照(snapshot)的定义:
(1)快照
已定义数据集的时间点副本。
克隆和快照是完整副本。根据系统的不同,快照可以是文件,LUN,文件系统或系统支持的任何其他类型的容器的快照。
【英文原文】:Snapshot
A point in time copy of a defined collection of data.
Clones and snapshots are full copies.Depending on the system, snapshots may be of files, LUNs, file systems, or any other type of container supported by the system.
(2)增量快照
通过仅存储与数据的现有完整副本不同的那些数据块,可即时保留数据状态的一种时间点副本。
【英文原文】:Delta Snapshot
A type of point in time copy that preserves the state of data at an instant in time, by storing only those blocks that are different from an already existing full copy of the data.
1.2 快照的名词

1.3 快照的主要分类
快照按照实现的执行主体不同,主要可以分为以下7种类型:
基于文件系统的快照
基于逻辑卷管理器的快照
基于NAS的快照
基于磁盘阵列的快照
基于主机虚拟化的快照
基于存储虚拟化的快照
基于数据库的快照
快照的主要技术
目前,各家厂商所采用的快照实现技术也各不相同,根据SNIA对快照技术的分类主要有全量快照和增量快照两类:
全量复制:包含分离镜像(split mirror)
增量复制:包含写时复制(CoW:Copy On Write)和写时重定向(RoW:Redirect On Write);
接下来,就这三个主要的快照技术分别进行技术实现原理和回滚原理进行详细介绍。
2.1 分离镜像(split mirror)
镜像分离快照技术在快照时间点到来之前,首先要为源数据卷创建并维护一个完整的物理镜像卷:同一数据的两个副本分别保存在由源数据卷和镜像卷组成的镜像对上。在快照时间点到来时,镜像操作被停止,镜像卷转化为快照卷,获得一份数据快照。

图1 分离镜像关系
快照卷在完成数据备份等应用后,将与源数据卷重新同步,重新成为镜像卷。因此对于要同时保留多个连续时间点快照的源数据卷,必须预先为其创建多个镜像卷,当第一个镜像卷被转化为快照卷作为数据备份后,初始创建的第二个镜像卷立即与源数据卷同步,与源数据卷成为新的镜像对。
镜像分裂快照操作的时间非常短,仅仅是断开镜像卷对所需的时间,通常只有几毫秒,这样小的备份窗口几乎不会对上层应用造成影响,但是这种快照技术缺乏灵活性,无法在任意时间点为任意的数据卷建立快照。另外,它需要一个或者多个与源数据卷容量相同的镜像卷,同步镜像时还会降低存储系统的整体性能。
分离镜像特征总结:
空间占用:每一个快照需要与源数据(卷)相同的存储空间;
创建过程:每一个快照都需要完全的数据同步;
系统影响:源数据的读操作不受影响,但写操作受数据同步影响;
2.2 写时复制(Copy On Write)
写时复制(Copy On Write,简称CoW),有时也被称为首次写时复制(Copy On First Write,简称CoFW),这种方式通常也被称为“元数据(源数据指针表)”复制。即当改写源数据块上的原始数据时,首先将原始数据复制到新数据块中,然后再进行改写。当你还原快照需要引用原始数据时,快照软件将原始数据原有的指针映射到新数据块上。其具体实现过程如下:

图2 Cow实现原理
具体的实现过程:源文件系统初始状态,数据不断地被读取或写入,实际数据块(或文件块,如A、B、C、D)以及元数据链也在不断变化。之后某时刻,系统被触发了一份快照。系统将所有写IO暂挂,然后立即开始将整个文件系统的元数据复制一份存放,复制完成后立即解除暂挂。被复制出来的元数据以及其指向底层数据块是相同的;如图3所示:

图3 创建快照
之后某时刻,更改当前源数据中的数据C为C’,属于首次覆盖写,根据规则,需要将数据C复制出来,然后再写入数据C’。之后再快照元数据中将原来指向数据C的指针该为指向被复制出来的数据C的新地址上。如图4所示:

图 4 快照创建后首次写入
再之后某时刻A被覆盖为A’,系统同样将A复制出来并改变元数据链中的指针。而数据C’被更改为C”时,因为不是首次覆盖写,所以直接覆盖,而不做后台复制工作。如图5所示:

图 5 快照创建后再次写入
此时,写入了新的数据,即追加产生了一个新分配的数据E,由于快照时刻没有这个数据,所以后台不会进行复制操作,也不会指向新增的数据E,快照系统也不会做任何操作。如图6所示:

图 6 快照创建后数据追加写入
当源数据都被覆盖了写了一遍后,即图4中所显示数据B和D均被更新后,系统内将有两份完整的数据集,一份是当前的最新活动数据,另一份是所对应的历史快照时的数据版本。如图7所示:

图 7 快照创建后数据完整更新后
创建多个快照也一样,例如在图5的基础上创建第二个快照后修改数据E为E’,此时的快照指向关系如图8所示:

图8 创建第2个快照后的数据复制
回看 COW 的过程,COW 在创建快照时,并不会发生物理的数据复制动作,仅是复制了原始数据所在的源数据块的物理位置元数据。因此,COW 快照创建非常快,可以瞬间完成。在创建了快照之后,快照软件会监控跟踪原始数据的变化(即对源数据块的写操作),一旦源数据块中的原始数据被改写,则会将源数据块上的数据复制到新数据块中,然后将新数据写入到源数据块中覆盖原始数据。其中所有的源数据块就组成了所谓的源数据卷,而新数据块组成了快照卷。因此, COW。
写时复制(COW)特征总结:
l 源数据状态:源数据永远保持最新;
l 读写路径影响:会在一定程度上降低源数据卷的写性能,因为每次改写新数据,实际上都进行了两次写操作;
2.3 写时重定向(Redirect On Write)
写时重定向(Redirect On Write,简称RoW),有时也被称为首次写时重定向(Redirect On First Write,简称RoFW),其实现原理与 CoW 非常相似,区别在于RoW对原始数据卷的首次写操作,会将新数据重定向到预留的快照卷中,而非CoW一般会使用新数据将原始数据覆盖。其具体实现过程如图9所示:

图 9 RoW实现原理
具体的实现过程:源文件系统初始状态,数据不断地被读取或写入,实际数据块(或文件块,如A、B、C、D)以及元数据链也在不断变化。之后某时刻,系统被触发了一份快照。系统将所有写IO暂挂,然后立即开始将整个文件系统的元数据复制一份存放,复制完成后立即解除暂挂。被复制出来的元数据以及其指向底层数据块是相同的;如图10所示:

图 10 创建快照
之后某时刻,更改当前源数据中的数据C为C’,属于首次覆盖写,根据RoW规则,直接将数据C’重定向写入某个剩余空间内,随后将当前活动数据的元数据链中原本指向数据C的指针改为指向被重定向写出去的数据C’的新地址上。如图11所示:

图11 快照创建后首次写入
同理,之后某时刻A被覆盖为A’,系统同样将A’重定向写出,并修改当前活动元数据中的指针。同时C’变成C”,由于重定向过一次,所以直接覆盖C’,无须任何处理。如图12所示:

图12 快照创建后再次写入
紧接着,写入了新的数据,即追加产生了一个新的数据E,由于快照那一刻没有改数据块,所以系统不做后台重定向动作,快照系统不做任何处理,仅指向活动元数据。如图13所示:

图13 快照创建后数据追加写入
当源数据都被覆盖了写了一遍后,即图12中所显示数据B和D均被更新后,系统内将有两份完整的数据集,一份是当前的最新活动数据,另一份是所对应的历史快照时的数据版本。如图14所示:

图 14 快照创建后数据完整更新后
如果要创建多个快照,例如在图12的基础上创建第二个快照后修改数据E为E’,此时的快照指向关系如图15所示:

图15 创建第2个快照后的重定向
回过来看看,RoW快照方式在创建快照之后,也就是在快照时间点之后,如果发生了写操作,那么新数据会直接被写入到剩余存储空间中,然后更新指针。可以看出,RoW 与 CoW 最大的不同就是:CoW 的快照卷存放的是原始数据,而 RoW 的快照卷存放的是新数据。因为 RoW 这种设定,所以其多个快照之间的关系必定是链式的,因为最新一次快照的原始数据很可能就存放在了上一次快照时创建的快照卷中。因此如果做了多次快照,就产生了一个快照链,此时由于源数据指针被完全更新,最新的数据会变得非常离散,此时会对最新数据的连续性读写性能产生较大的影响。
写时重定向(ROW)特征总结:
l 源数据状态:源数据在快照点时将被冻结,写入将被挂起;
l 读写路径影响:快照创建完后,数据写路径不受影响;源数据的读路径受到潜在影响(性能上);
快照的回滚方式
快照的回滚是不可逆的操作,因此在开始回滚前,务必确认操作的必要性和合规性。回滚的具体实现路径根据所采用的快照技术不同而不同。
3.1 分离镜像的快照回滚
分离镜像的快照由于其每个快照都是全量的数据,因此只需要将当前的活动数据直接回滚到指定时间点的快照即可。如图16所示:

图16 分离镜像的快照回滚
3.2 写时复制的快照回滚
写时复制(CoW)方式所产生的快照,前面我们也提到了属于增量快照的实现方式,因此在回滚到多个时间点前的快照时,需要从当前的活动数据开始逐一进行回滚,直至要回滚到的指定时间点的快照。如图17所示:

图17 CoW的快照回滚
3.3 写时重定向的快照回滚
写时重定向(RoW)方式所产生的快照,也属于增量快照的实现方式,但因其快照之间的关系是链式的,没有一个完整的快照卷,因此也需要在回滚到指定的时间点时,需要将该时间点前的所有快照合并成为一个完整的快照点数据。因此与CoW方式不同的,RoW整个回滚动作流需要先合并,再回滚。如图18所示:

图18 RoW的快照回滚
快照的应用场景
快照可在诸多场景中心进行使用,例如:
还原点:将快照点作为一个数据还原点,当数据被删除或者误操作时,可以回退到之前的时间点。
数据源:快照也可以当做数据源来使用,因为快照可以是其所表示数据的一个副本或者复制品,所以,快照也可以当然数据源来使用。例如作为备份的源、作为数据挖掘的源、作为保存应用程序状态的检查点,甚至就是作为单纯的数据复制的一种手段等。
应用测试:用户可以使用快照产生的虚拟硬盘的数据对新的应用或者新的操作系统版本进行测试,这样可以避免对生产数据造成损害,也不会影响到目前正在运行的应用。
美创运维中心数据库服务团队拥有Oracle ACE 1人、OCM 10余人、数十名Oracle OCP、MySQL OCP、红帽RHCA、中间件weblogic、tuxedo认证、达梦工程师 ,著有《Oracle DBA实战攻略》,《Oracle数据库性能优化方法和最佳实践》,《Oracle内核技术揭秘》等多本数据运维优化书籍。目前运维各类数据库合计2000余套,精通Oracle、MySQL、SQLServer、DB2、PostgreSQL、达梦等主流商业和开源数据库。并成为首批国内达梦战略合作伙伴之一,拥有海量经验和完善的人员培养体系。并同时提供超融合,私有云整体解决方案。






