一、COW 写时拷贝快照技术
如上图, COW 首先会为每个源数据卷都创建一张数据指针表用于保存源数据卷(Base Volume)所有数据的物理指针, 在创建快照时, 存储系统会拷贝出一份源数据卷指针表的副本, 该副本作为快照卷数据指针表. 而且 COW 只有在创建快照时才会建立快照卷, 该快照卷只占用了相对少量的存储空间, 用于保存快照时间点之后源数据卷中被更新的数据. 具体的步骤如下:
· Step 1: 生成源数据卷数据指针表
· Step 2: 创建快照
· Step 3: 从源数据卷数据指针表拷贝出快照卷数据指针表
· Step 4: 生成快照卷
· Step 5: 源数据卷中的原始数接收到更新操作指令
· Step 6: 将源数据卷中的原始数据拷贝到快照卷中(预留空间), 下次针对这一位置的写操作将不再执行写时拷贝操作
· Step 7: 更新快照卷指针表
· Step 8: 更新源数据卷的原始数据
· Step 9: 不断的重复 Step 5~8, 直到执行下一次快照
通过上面的步骤可以看出, 写时拷贝的本意是: 更新源数据卷中的原始数据时, 将原始数据 Copy 到快照卷中. 当我们需要恢复快照时, 只需要按照快照指针表逐一进行寻址就能够完成了. 而且 COW 在使用上非常的灵活, 可以随时为任意源数据卷建立快照.
优势: COW 在进行快照操作之前, 不会占用任何的存储资源, 也不会影响系统性能. 创建快照时由于快照卷与源数据卷通过各自的指针表共享同一份物理数据, 而不需要进行全量拷贝所以快照创建速度非常快, 可以瞬间完成. COW 创建快照时产生的备份窗口长度与源数据卷的 Size 成线性比例, 一般为几秒钟, 相比全量快照要长, 但快照卷占用的存储空间却大大减少.
劣势: COW 因为创建快照后会的每次写入操作都需要先将源数据卷中的原始数据拷贝到快照卷中才能开始写入源数据卷, 所以会降低源数据卷的写性能. 而且很显然, 如果对同一源数据卷做了多次快照之后, 写性能将会更加低下. 再一个就是由于快照卷仅仅保存了源数据卷的部分原始数据, 因此无法得到完整的物理副本, 碰到需要完整物理副本的应用就无能为力了, 而且如果拷贝到快照卷中的数据量超过了保留空间, 快照就将失效.
应用场景: COW 快照技术在创建快照后的一次数据更新操作实际上需要一次读操作(读源数据卷的数据)和两次写操作(写源数据卷与写快照卷). 所以, COW 更适合于应用对存储设备读多写少的场景. 除此之外, 如果一个应用容易出现对存储设备的写入热点(只针对某个有限范围内的数据进行写操作), 也是较理想的选择. 因为其数据更改都局限在一个范围内, 对同一份数据的多次写操作只会出现一次写时复制操作.
二、ROW 写时重定向快照技术
如上图, Vd 表示源数据卷, Snap 表示快照卷, 当源数据卷创建一个快照时, Vd 与 snap 是一致的. 如果在创建快照之后, 对源数据卷的数据进行了更新操作的话, 并不会像 COW 似得直接修改源数据卷原始数据, 而是再开辟一个新的空间用于存放用于更新原始数据的新的数据. 具体步骤如下:
· Step 1: 创建快照
· Step 2: 将自上次快照以来所有的重定向写数据所对应在源数据卷中的数据复制出来生成这个时间点的快照, 然后再将这些重定向写数据写回到源数据卷中的相应位置.
· Step 3: 源数据卷中的原始数据接收到更新操作指令
· Step 4: 开辟一个新的数据存储卷(预留空间)
· Step 5: 将源数据卷数据指针表中被更新原始数据的指针重定向到新开辟的数据存储卷
· Step 6: 写入更新数据到新开辟的存储空间中
· Step 7: 重复 Step 3~6, 直到下一次执行快照
NOTE 1: 而读操作是否需要读重定向, 则根据读取数据的位置是否有过自上次快照以来的写重定向, 必须对有过写重定向的位置进行读重定向, 反之就不需要了.
从上述步骤可以看出, 写时重定向的本意是: 更新源数据卷中的原始数据时, 将源数据卷数据指针表中的被更新原始数据指针重定向到新的存储空间. 所以由此至终, 快照卷的数据指针表和其对应的数据是没有被改变过的. 恢复快照的时候, 只需要按照快照卷数据指针表来进行寻址就可以完成恢复了.
优势: 源数据卷创建快照后的写操作会被重定向, 所有的写 IO 都被重定向到新卷中, 而所有快照卷数据(旧数据)均保留在只读的源数据卷中. 这样做的好处是更新源数据卷只需要一次写操作, 解决了 COW 写两次的性能问题. 所以 ROW 最明显的优势就是不会降低源数据卷的写性能.
劣势: ROW 的快照卷数据指针表保存的是源数据卷的原始副本, 而源数据卷数据指针表保存的则是更新后的副本, 这导致在删除快照卷之前需要将快照卷数据指针表指向的数据同步至源数据卷中. 而且当创建了多个快照后, 会产生一个快照链, 使原始数据的访问、快照卷和源数据卷数据的追踪以及快照的删除将变得异常复杂. 例如: 一共执行了 10 次快照, 在快照恢复时, 要恢复到最新的快照点, 则需要合并10 个快照文件, 最终才能实现恢复. 所以 ROW 的主要缺点是没有一个完整的快照卷, 而是由多个不同时刻的快照卷来组成一个特定的快照时间点. 如果快照层级越多, 进行快照恢复时的系统开销会比较大. 除此之外, 因为源数据卷数据指针指向的数据会很快的被重定向分散, 所以 ROW 另一个主要缺点就是降低了读性能(局部空间原理).
应用场景: 在传统存储设备上, ROW 快照在多次读写后, 源数据卷的数据被分散, 对于连续读写的性能不如COW. 所以 ROW 比较适合 Write-Intensive(写密集) 类型的存储系统. 但是,在分布式存储设备上, ROW 的连续读写的性能会比 COW 更加好. 一般而言, 读写性能的瓶颈都在磁盘上. 而分布式存储的特性是数据越是分散到不同的存储设备中, 系统性能越高. 所以 ROW 的源数据卷重定向分散性反而带来了好处. 因此, ROW逐渐成为了业界的主流.