一直对快照的两种模式cow和row区分不开,今天看到一篇文章讲的很清晰。转载过来,希望能给有同样困惑的同学以帮助。
所谓快照,是指某数据集在某一时刻一个完全可用的拷贝。也叫即时拷贝。注意是一个完全可用的。如果是在window环境下,则要结合VSS 机制,把应用程序的buffer,文件系统的buffer,操作系统的buffer全部刷向磁盘后,再做快照。
当前快照有两种实现,分别是COW(Copy on first write) 和ROW(Redirect on first write).
假如有一个卷8个物理块,分别为1~8, 在某一个时刻做了快照,这时候生成了一个快照卷,快照卷也有8个块,和原始卷一样指向相同的物理块。这时候有一个新的io,修改原始卷的第8个物理块,对COW 而言,会依次做如下几步
1、分配一个新的物理块。我们称为第9个物理块
2、读取第8个物理块
3、新读取的第8个物理块数据写入到第9个物理块。
4、更新快照卷map,指向第9个物理块
5、更新第8个物理块
从上面可以看出,本来写一个物理块,变成了1读3写。
COW 优点:
1、原始卷物理块连续。没有碎片。
COW 缺点:
1、写放大,本来一个写,变成1读3写。
对ROW 而言,会依次做如下几步
1、分配一个新的物理块。我们称为第9个物理块
2、数据写入到第9个物理块。
3、更新原始卷map,指向第9个物理块
从上面可以看出,本来写一个物理块,变成了2写。
ROW 优点:
1、性能比COW 好。
ROW 缺点:
1、写放大,本来一个写,变成2写。
2、原始卷物理块不连续。没、有碎片。