快照(snapshot)是数据的时间点副本,并通常存储在与原始数据相同的存储系统上,可以在以后的时间将数据恢复到该时间点精确状态。快照通常与其他数据保护技术(如备份和复制)一起使用,以提供额外的数据保护层。由于快照是快速进行且不会干扰正常操作,因此可以使用它们频繁备份数据,而不需要完整备份过程的开销。是目前应用最广泛的备份技术,很多备份软件的实现也是基于快照技术。
快照有两种主要类型:写时复制(COW)和写时重定向(ROW)。我们下面详细解释这两种snapshot类型及两者的区别,并以Linux ext2 文件系统的简略示意图来辅助说明其实现原理。
- 写时复制COW (Copy-On-Write)
快照时,不会立即创建数据的新副本。相反,快照最初引用与原始副本相同的数据,如图1。Inode'就是创建的snapshot。
图 1:创建一个snapshot
随着对原始数据的更改,快照跟踪这些更改而不修改原始数据。当数据Data2被修改时,先拷贝Data2后,更新快照索引后将新数据Data2'被写入到原位置,并更新以引用新数据。
图 2:COW类型snapshot对Data2进行改写
- 写时重定向ROW(Redirect-On-Write)
与COW类似,在创建快照时不会立即创建数据的新副本。ROW 对原始数据进行写操作,会将新数据写入到新的存储位置,并更新以引用新数据。
图 3:ROW类型snapshot对Data2进行改写
- ROW 和 COW 的比较
我们从存储空间,创建快照的时间以及应用场景三个方面来看ROW和COW的区别。
从存储空间方面,创建 COW 快照时,会创建原始数据的一个新副本。原始数据被标记为只读,并且所有新写入的数据都被指向新副本。因此,原始数据被保留,快照反映了快照创建时的数据状态。COW 快照需要比 ROW 快照更多的存储空间,因为需要创建原始数据的完整副本。创建 ROW 快照时,会创建一个新的表来将所有新的写入操作重定向到存储中的新位置。原始数据保持不变,并且新的写入操作会被指向新位置。因此,快照反映了快照创建时的数据状态,而不需要创建原始数据的完整副本。ROW 快照需要比 COW 快照更少的存储空间,因为只需存储创建快照之后所做的更改。
从创建快照的时间角度来看,ROW 快照通常比 COW 快照更快,因为它们不需要复制原始数据。但是,随着重定向表的增长和数据的更新,ROW 快照可能会对性能产生影响。
从应用场景来说,COW 快照在需要保留原始数据并且快照应该是原始数据在创建快照时的完全副本时非常有用。ROW 快照在存储空间是一个问题时非常有用,或者当原始数据经常更新且快照仅需要捕捉创建快照之后所做的更改时。