本帖最后由 QI 于 2019-10-30 09:10 编辑
存储快照有两种实现方式:COW(写时复制Copy-On-Write)、ROW(写重定向Redirect-On-Write),两种实现方法有区别,造成读写性能、应用场景有比较大的区别。
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, 直到执行下一次快照
下图是在快照后将‘z’写入块6
写时拷贝的本意是:更新源数据卷中的原始数据时,将原始数据 Copy 到快照卷中。当我们需要恢复快照时,只需要按照快照指针表逐一进行寻址合并(此处要计算快照指针和原卷);
优势:COW 在进行快照操作之前,不会占用资源和影响系统性能。创建快照时由于快照卷与源数据卷通过各自的指针表共享同一份物理数据,而不需要进行全量拷贝所以快照创建速度非常快,可以瞬间完成。
劣势:COW 因为创建快照后会的每次写入操作都需要先将源数据卷中的原始数据拷贝到快照卷中才能开始写入源数据卷, 所以会降低源数据卷的写性能。而且,如果对同一源数据卷做了多次快照之后,写性能将会更加低下。再一个就是由于快照卷仅仅保存了源数据卷的部分原始数据,因此无法得到完整的物理副本,碰到需要完整物理副本的应用就无能为力了,而且如果拷贝到快照卷中的数据量超过了保留空间,快照就将失效。
应用场景:COW 快照技术在创建快照后的一次数据更新操作实际上需要一次读操作(读源数据卷的数据)和两次写操作(写源数据卷与写快照卷)。所以,COW 更适合于应用对存储设备读多写少的场景。
ROW当源数据卷创建一个快照时,源数据卷与快照卷是一致的。如果在创建快照之后, 对源数据卷的数据进行了更新操作的话,不会像 COW 似得直接修改源数据卷原始数据,而是再开辟一个新的空间用于存放用于更新原始数据的新的数据。具体步骤如下:
Step 1: 创建快照
Step 2: 将自上次快照以来所有的重定向写数据所对应在源数据卷中的数据复制出来生成这个时间点的快照, 然后再将这些重定向写数据写回到源数据卷中的相应位置
Step 3: 源数据卷中的原始数据接收到更新操作指令
Step 4: 开辟一个新的数据存储卷(预留空间)
Step 5: 将源数据卷数据指针表中被更新原始数据的指针重定向到新开辟的数据存储卷
Step 6: 写入更新数据到新开辟的存储空间中
Step 7: 重复 Step 3~6, 直到下一次执行快照
下图是在快照后将‘z’写入块6
写时重定向的本意是:更新源数据卷中的原始数据时,将源数据卷数据指针表中的被更新原始数据指针重定向到新的存储空间。所以由此至终,快照卷的数据指针表和其对应的数据是没有被改变过的。恢复快照的时候,只需要按照快照卷数据指针表来进行寻址就可以完成恢复了。
COW最大的问题是对写性能有影响。第一次修改原卷,需要复制数据,因此需要多一次读写的数据块迁移过程,这个就比较要命,应用需要等待时间比较长。但原卷数据的布局没有任何改变,因此对读性能没有任何影响。
ROW在传统存储情况下最大的问题是对读性能影响比较大。ROW写的时候性能基本没有损耗,只是修改指针,实现效率很高。但多次读写后,原卷的数据就分散到各个地方,对于连续读写的性能不如COW。这种方式比较适合写密集类型的存储系统。
早期学习的时候整理的一些笔记,且算作技术贴某公司,有错误的地方请务必支出~~~ |