一、存储快照概念

全球网络存储工业协会SNIA(StorageNetworking Industry Association)对快照(Snapshot)的定义是:关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点(拷贝开始的时间点)的映像。快照可以是其所表示的数据的一个副本,也可以是数据的一个复制品。

快照的作用主要是能够进行在线数据备份与恢复

① 当存储设备发生应用故障或者文件损坏时可以进行快速的数据恢复,将数据恢复某个可用的时间点的状态。

② 为存储用户提供了另外一个数据访问通道,当原数据进行在线应用处理时,用户可以访问快照数据,还可以利用快照进行测试等工作。

所有存储系统,不论高中低端,只要应用于在线系统,那么快照就成为一个不可或缺的功能。

二、快照实现原理(技术)

当前实现快照有主要有两种技术,一种是写时复制(Copy-On-Write,COW),另一种是写时重定向(Redirect-On-Write,ROW)

相关概念介绍:

源卷:进行快照操作的源数据卷。

写时复制(COW)

在数据第一次写入到某个存储位置时,首先将原有的内容读取出来,写到另一位置处(为快照保留的存储空间,即快照空间),然后再将数据写入到存储设备中。而下次针对这一位置的写操作将不再执行写时复制操作。

这种实现方式在第一次写入某个存储位置时需要完成一个读操作(读源位置的数据),两个写操作(写原位置与写快照空间),如果写入频繁,那么这种方式将非常消耗IO时间。

所以写时复制适用场景通常为读操作多,写操作少的卷或数据更改局域于某一范围内的卷(原因:同一份数据的多次写操作只会发生一次写时复制)。

写时复制原理:

  • 每个源数据卷都具有一张数据指针表(元数据),简称源数据指针表,表记录就是指向相应源数据块的地址指针。
  • 在创建快照时,存储子系统会建立源数据指针表的一个副本(元数据拷贝),作为快照卷的数据指针表,简称快照数据指针表。
  • 在创建快照之后,这个快照就相当于一个可供上层应用访问的存储逻辑副本,快照卷与源数据卷通过各自的指针表共享同一份物理数据。
  • 当源数据卷中任意数据将要被改写时,COW会在原始数据修改之前进行拷贝到快照卷中,然后将新数据写入到源数据块中覆盖原始数据,并且将原始数据在快照卷中的新地址更新到快照数据指针表记录中,使快照时间点后更新的数据不会出现在快照卷中。

 创建快照

内存快照 java 内存快照有什么用_重定向

写源数据块

内存快照 java 内存快照有什么用_重定向_02

优缺点:

优点:COW 在进行快照操作之前,不会占用任何的存储资源,也不会影响系统性能。

缺点:

  1. 降低源数据卷的写性能。当修改源数据时,会发生三次读写操作:
  1. 读取源数据。
  2. 将源数据写入快照卷中。
  3. 将新数据写入源数据卷中。

如果主机写入数据频繁,那么这种方式将非常消耗I/O。

  1. 无法得到完整的物理副本。快照卷仅仅保存了源数据卷的部分原始数据。
  2. 拷贝到快照卷中的数据量超过了保留空间,快照就将失效。

写时重定向(ROW)

读写操作重新定向到另一个存储空间中。在一个快照生成期间,所有的写操作将被重定向到另一个介质,而读操作是否需要读重定向,则需要根据读取的位置是否有过自上次快照以来的写重定向,必须对有过写重定向的位置进行读重定向,否则不需要进行读定向。当要创建一个快照时,则将自上次快照以来所有的重定向写数据所对应在源介质中的数据复制出来生成这个时间点的快照,然后再将这些重定向写数据写回到源介质中的相应位置上,从而完成一个快照生成过程。

内存快照 java 内存快照有什么用_数据_03

内存快照 java 内存快照有什么用_重定向_04

可以看出在创建快照时,源数据卷状态会由读写变成只读。源卷存放的是上一个快照点的旧数据,新数据最终存放在快照卷中。快照卷数据指针表和其对应得数据没有改变。如果做多次快照,就会产生一个快照链,写操作全都会落到最末端的快照卷中。

这个会出现一个问题。如果一共做了 10 次快照,那么在恢复到最新的快照点时,则需要通过合并 10 个快照卷来得到一个完整的最新快照点数据;如果是恢复到第 8 次快找时间点,那么就需要将前 8 次的快照卷合并成为一个完整的快照点数据。从这里可以看出 ROW 的主要缺点是没有一个完整的快照卷,其快照之间的关系是链式的,如果快照层级越多,进行快照恢复时的系统开销会比较大。但 RoW 的优势在于其解决了 CoW 快照写两次的问题。

内存快照 java 内存快照有什么用_linux_05

 优缺点:

优点:不会降低源数据卷的写性能。源数据卷创建快照后的写操作会被重定向,所有的写 I/O 都被重定向到新卷中,而所有快照卷数据(旧数据)均保留在只读的源数据卷中。因此更新源数据只需要一个写操作,解决了 COW 写两次的性能问题。对于分布式系统来说,正是由于数据的分散,进而提供了并发读的机会。所以在分布式存储上,ROW的连续读写性能比COW好。

劣势:

  1. 没有一个完整的快照卷。ROW 的快照卷数据映射表保存的是源数据卷的原始副本,而源数据卷数据指针表保存的则是更新后的副本。因此,当创建了多个快照时,会产生一个快照链,使原始数据的访问快照卷和源数据卷数据的追踪以及快照的删除将变得异常复杂。在恢复快照时会不断地合并快照文件,造成较大的系统开销。
  2. 单机读性能下降。由于采用了重定向写,使得原本连续的数据分散到了磁盘中,连续写变成了随机写,造成读性能下降。