快照是记录系统某个时间点的状态,可以帮助用户回到快照记录的时刻,例如恢复故障等等,可见快照功能非常重要。
常见快照的有两类:全拷贝快照、差分快照(cow、row)
RAID JBOD: raid0,raid1,raid2,raid3 …
常用的RAID模式及其基本特点如下;
全拷贝快照可以参考raid1 理解,创建的时候会生成一个源卷的镜像卷,在读操作的时候没有什么影响,在写操作的时候会有两次写入,分别写入源卷与镜像卷。
拍摄快照时,镜像卷会断开读写操作,这样就会完整记录此时的磁盘状态,这个方法是最完整的,创建快照可瞬间完成,但是磁盘占用很大,源卷有多大,镜像卷就需要多大。
用来记录文件系统对象的一些元信息数据。一个文件占用一个inode , inode数量大小是固定的(ext4与xfs可以设置为256B)。
inode中大致有如下信息:
文件属主与属组
文件读写属性(基本rwx权限等)
文件大小(字节数)
文件时间戳(ctime、atime、mtime)
记录文件内容的指向block(文件内容数据的存储位置指针,)
文件特性表示(flag,如SetUID)
连接数(有多少硬链接指向这个inode)
一个文件占用一个inode ,且inode是固定的,小文件过多就可能造成磁盘空间剩余挺多,但是inode耗尽的情况。
ext文件系统可以查询inode总数
查看当前系统inode使用情况
一个大文件,文件内容占用大量存储空间的话,明显一个inode 就不能完全记录这个文件存储位置指针。为此记录区块的区域定义为12个直接、一个间接、一个双间接、一个三间接记录区。这些“间接”就是拿一个区块来作为记录区来使用的“记录区”,这些就是延伸出来的“记录区”
当一个inode 中的12个直接记录区直接指向真实内容block号码。
间接记录区指向block1,block1记录了真实内容的block号码
双间接记录区指向block1,这个block1指向一个block2,block2记录了真实内容的block号码
三间接记录区指向block1,这个block1指向一个block2,block2指向block3,block3记录了真实内容的block号码
inode指向真实block号码简图(可以百度,有更详细的图片)
这个方式会创建源卷与快照卷,源卷保存原始数据,创建快照是会保存原始数据所在的源数据块的物理位置元数据,即快照卷会保存原始数据的inode信息。
cow(Copy On Write)写时复制,顾名思义,就是在写入操作的时候进行复制源数据到新的block保存
由此可见写操作时会有多次的读写操作,就会出现耗时相比较长的情况。单纯读操作没啥影响。
那么 CoW 的工作原理可以用图来表示,如下:
总结一下,CoW 快照的优缺点:
row(Redirect-On-Write),写时重定向。row与cow很相似,不同在于创建快照之后,首次写操作会重定向到新卷中。创建快照之前的所有原始数据都会保存在源卷,创建之时源卷是只读状态。当文件变更的时候,新变更的数据写入快照卷的block,文件inode也会修改为新的block,相对于cow这样做的好处就是不用执行多次写操作。
这种方式还可以创建快照链,这种快照链类似增量备份,新快照只会记录变化的部分,例如VMware的快照,每次新建快照会生成一个新的快照文件,这个文件是在上一个快照的增量部分,了解mysql的朋友就知道mysql增量备份就是类似的原理。当我们要恢复一个数据的时候,这个数据会先从最原始的快照(源卷)开始合并,知道合并到需要恢复的这个快照数据。
row原理简图
全拷贝快照
因为全拷贝消耗很大,目前没有使用过,可能在特殊场景才能用到,(比如需要 在某一精准时刻 备份与源文件数据一致?)
cow
某些数据库软件就是使用的 CoW 机制,还有一些较为重要的文件,redis mysql 等等做数据备份的时候,全量备份时用的比较多
row
虚拟软件(例如刚才说的VMware)的快照,虚拟化平台所使用的快照技术一般是基于 row 来实现的,还有mysql的增量备份
参考资料
w
虚拟软件(例如刚才说的VMware)的快照,虚拟化平台所使用的快照技术一般是基于 row 来实现的,还有mysql的增量备份
参考资料