快照原理(全拷贝快照、cow、row)

快照原理(全拷贝快照、cow、row)

快照是记录系统某个时间点的状态,可以帮助用户回到快照记录的时刻,例如恢复故障等等,可见快照功能非常重要。
常见快照的有两类:全拷贝快照、差分快照(cow、row)

RAID JBOD: raid0,raid1,raid2,raid3 …

常用的RAID模式及其基本特点如下;

  1. RAID0可以简单理解为将多个硬盘合并为一个大硬盘使用。由于数据可以分散同时写入多块硬盘,所以可以获得很高的读写性能。其缺点是阵列中任意一块硬盘损坏则数据全部丢失。RAID0至少需要两块硬盘。
  2. RAID1可以简单理解为使用多个硬盘做重复镜像。这种阵列可提供很好的数据安全性,只有所有硬盘全部损坏才会导致数据丢失。RAID1至少需要两块硬盘。
  3. RAID2在普通阵列的基础上,使用专用的磁盘保存数据的ECC校验码,通过海明码校验,可以在数据发生错误的情况下检查并将错误校正,以保证输出的正确。
  4. RAID3于RAID2类似,但是只提供查错功能,不提供纠错功能。
  5. RAID4可以理解为RAID3的大数据版。它的难度比RAID3大得多,控制器的设计难度也要大许多,而且访问数据的效率不怎么好。
  6. RAID5可以理解为RAID3的分布数据版。由于数据的分布存放,因为访问效率更高。

全拷贝快照

全拷贝快照可以参考raid1 理解,创建的时候会生成一个源卷的镜像卷,在读操作的时候没有什么影响,在写操作的时候会有两次写入,分别写入源卷与镜像卷。

快照原理(全拷贝快照、cow、row)_第1张图片

拍摄快照时,镜像卷会断开读写操作,这样就会完整记录此时的磁盘状态,这个方法是最完整的,创建快照可瞬间完成,但是磁盘占用很大,源卷有多大,镜像卷就需要多大。

inode 基本作用

用来记录文件系统对象的一些元信息数据。一个文件占用一个inode , inode数量大小是固定的(ext4与xfs可以设置为256B)。
inode中大致有如下信息:
文件属主与属组
文件读写属性(基本rwx权限等)
文件大小(字节数)
文件时间戳(ctime、atime、mtime)
记录文件内容的指向block(文件内容数据的存储位置指针,)
文件特性表示(flag,如SetUID)
连接数(有多少硬链接指向这个inode)

如何通过inode读取到正确的文件内容

一个文件占用一个inode ,且inode是固定的,小文件过多就可能造成磁盘空间剩余挺多,但是inode耗尽的情况。
ext文件系统可以查询inode总数

快照原理(全拷贝快照、cow、row)_第2张图片

查看当前系统inode使用情况

快照原理(全拷贝快照、cow、row)_第3张图片

一个大文件,文件内容占用大量存储空间的话,明显一个inode 就不能完全记录这个文件存储位置指针。为此记录区块的区域定义为12个直接、一个间接、一个双间接、一个三间接记录区。这些“间接”就是拿一个区块来作为记录区来使用的“记录区”,这些就是延伸出来的“记录区”
当一个inode 中的12个直接记录区直接指向真实内容block号码。
间接记录区指向block1,block1记录了真实内容的block号码
双间接记录区指向block1,这个block1指向一个block2,block2记录了真实内容的block号码
三间接记录区指向block1,这个block1指向一个block2,block2指向block3,block3记录了真实内容的block号码
inode指向真实block号码简图(可以百度,有更详细的图片)

快照原理(全拷贝快照、cow、row)_第4张图片

差分快照

cow

这个方式会创建源卷与快照卷,源卷保存原始数据,创建快照是会保存原始数据所在的源数据块的物理位置元数据,即快照卷会保存原始数据的inode信息。
cow(Copy On Write)写时复制,顾名思义,就是在写入操作的时候进行复制源数据到新的block保存

  1. 写入操作的时候快照软件会监控原始数据是否发生变化
  2. 如果需要修改inode1原始数据block1 , 会先复制block1的数据到inode2的block2
  3. 快照软件修改快照卷中原始数据的inode1修改为inode2
  4. 将需要写入的数据写入到block1。

由此可见写操作时会有多次的读写操作,就会出现耗时相比较长的情况。单纯读操作没啥影响。

那么 CoW 的工作原理可以用图来表示,如下:

快照原理(全拷贝快照、cow、row)_第5张图片

总结一下,CoW 快照的优缺点:

  • 修改数据性能下降
  • 读数据性能不变

row

row(Redirect-On-Write),写时重定向。row与cow很相似,不同在于创建快照之后,首次写操作会重定向到新卷中。创建快照之前的所有原始数据都会保存在源卷,创建之时源卷是只读状态。当文件变更的时候,新变更的数据写入快照卷的block,文件inode也会修改为新的block,相对于cow这样做的好处就是不用执行多次写操作。
这种方式还可以创建快照链,这种快照链类似增量备份,新快照只会记录变化的部分,例如VMware的快照,每次新建快照会生成一个新的快照文件,这个文件是在上一个快照的增量部分,了解mysql的朋友就知道mysql增量备份就是类似的原理。当我们要恢复一个数据的时候,这个数据会先从最原始的快照(源卷)开始合并,知道合并到需要恢复的这个快照数据。

快照原理(全拷贝快照、cow、row)_第6张图片

快照原理(全拷贝快照、cow、row)_第7张图片

row原理简图

快照原理(全拷贝快照、cow、row)_第8张图片

快照的应用场景

全拷贝快照
因为全拷贝消耗很大,目前没有使用过,可能在特殊场景才能用到,(比如需要 在某一精准时刻 备份与源文件数据一致?)

cow
某些数据库软件就是使用的 CoW 机制,还有一些较为重要的文件,redis mysql 等等做数据备份的时候,全量备份时用的比较多

row
虚拟软件(例如刚才说的VMware)的快照,虚拟化平台所使用的快照技术一般是基于 row 来实现的,还有mysql的增量备份


参考资料

w
虚拟软件(例如刚才说的VMware)的快照,虚拟化平台所使用的快照技术一般是基于 row 来实现的,还有mysql的增量备份


参考资料

你可能感兴趣的:(软件设计,架构)