快照是记录系统某个时间点的状态,可以帮助用户回到快照记录的时刻,例如恢复故障等等,可见快照功能非常重要。
常见快照的有两类:全拷贝快照、差分快照(cow、row)
全拷贝快照
全拷贝快照可以参考raid1 理解,创建的时候会生成一个源卷的镜像卷,在读操作的时候没有什么影响,在写操作的时候会有两次写入,分别写入源卷与镜像卷。
拍摄快照时,镜像卷会断开读写操作,这样就会完整记录此时的磁盘状态,这个方法是最完整的,创建快照可瞬间完成,但是磁盘占用很大,源卷有多大,镜像卷就需要多大。
差分快照
这里需要了解inode与block的关系,可以看下我之前的简介://www.greatytc.com/p/6d31d31f937a
cow
这个方式会创建源卷与快照卷,源卷保存原始数据,创建快照是会保存原始数据所在的源数据块的物理位置元数据,即快照卷会保存原始数据的inode信息。
cow(Copy On Write)写时复制,顾名思义,就是在写入操作的时候进行复制源数据到新的block保存
- 写入操作的时候快照软件会监控原始数据是否发生变化
- 如果需要修改inode1原始数据block1 , 会先复制block1的数据到inode2的block2
- 快照软件修改快照卷中原始数据的inode1修改为inode2
- 将需要写入的数据写入到block1。
由此可见写操作时会有多次的读写操作,就会出现耗时相比较长的情况。单纯读操作没啥影响。
这张图片很直观,来源:http://www.haxi.cc/archives/%E5%BF%AB%E7%85%A7%E5%8E%9F%E7%90%86.html
row
row(Redirect-On-Write),写时重定向。row与cow很相似,不同在于创建快照之后,首次写操作会重定向到新卷中。创建快照之前的所有原始数据都会保存在源卷,创建之时源卷是只读状态。当文件变更的时候,新变更的数据写入快照卷的block,文件inode也会修改为新的block,相对于cow这样做的好处就是不用执行多次写操作。
这种方式还可以创建快照链,这种快照链类似增量备份,新快照只会记录变化的部分,例如VMware的快照,每次新建快照会生成一个新的快照文件,这个文件是在上一个快照的增量部分,了解mysql的朋友就知道mysql增量备份就是类似的原理。当我们要恢复一个数据的时候,这个数据会先从最原始的快照(源卷)开始合并,知道合并到需要恢复的这个快照数据。
快照的应用场景
全拷贝快照
因为全拷贝消耗很大,目前没有使用过,可能在特殊场景才能用到
cow
某些数据库软件就是使用的 CoW 机制,还有一些较为重要的文件
row
虚拟软件(例如刚才说的VMware)的快照,虚拟化平台所使用的快照技术一般是基于 row 来实现的