快照技术探究
刚接触存储的时候就了解了下快照技术,当时了解了其大概意思,然后就是做快照的方法,经典的当然是文件系统级的copy-on-write,对于快照的实际意义没有什么认识,最近准备wf老师课堂presentation时,我所学习的论文里用到了快照技术,就深入的了解了一下。
快照技术的提出最初主要用于备份,在以前要备份某个时刻的数据,需采用一种叫分离镜像的方式(远程镜像或是本地镜像),这种方式需要占用一块和主卷相同容量大小的卷作为镜像卷,并且需要停掉主机IO一段时间(分离主卷与镜像卷),具体的步骤如下:
1, 如果某个时刻想要对整个镜像卷进行备份,需要停止读写主卷的应用,然后分离主卷和镜像卷。
2, 拆分之后,主卷恢复上层IO(整个停机时间不会很长,如果不采用镜像卷,会有很长的停机时间,损失过大),之后主卷的读写不再跟镜像卷关联。此时的镜像卷保持停止IO那一时刻原卷数据的完整镜像,此时可以使用备份软件,将镜像卷上的数据,被分到其他介质。
3, 拆分镜像后,主卷的所有IO回以bitmap的方式记录下来。Bitmap每一位表示卷上的一个块。带备份完成后,恢复镜像,镜像卷的数据需要重新同步,程序搜索bitmap中所有为1的块,如果镜像卷上对应的块尚未写入,则同步两个卷。
为什么使用这么复杂的方式备份,到了每个时间点需要备份,直接copy不行吗?
1, 备份的时候,如果停掉主卷的应用服务,直接将主卷的数据备份是可以的,但由于备份数据量大,需要很长一段时间完成,停机所造成的损失太大。
2, 不停掉IO服务,直接在某一时刻备份会有什么后果?
由于备份时间太长,备份过程中的IO会造成备份的数据不一致(漏备,错备,多备)
1, 备份过程中,一个已备份的文件移到一个未备份的目录。--à多余的备份
2, 备份过程中,一个未备份的文件移到一个已备份的目录。--à漏掉的备份
3, 备份过程中,一个即将备份的数据已被修改。 --à错误的备份
快照技术能在短时间内记录系统数据的试图(就像给系统的数据拍了一张照片),通过快照技术,用户可以snapshot作为数据的在线备份,也可以方便把snapshot备份到其它的存储戒指上。那么如何实现快照呢?(注:分割镜像技术也算是快照技术的一种实现方式,因它能记录镜像分离时刻的所有数据,它将负载分散到每次写)
1, 基于文件系统的快照
文件系统(以ext2)为例,文件系统包括超级块,组描述符,块位图,inode位图,inode节点块,数据块,其中前五个数据项都是为了管理数据而产生的(成为元数据),这里成为其数据量很小,实际的文件数据存储在数据块里,在某一时刻,如果记录了文件系统的元数据,就有了当前文件系统的视图,即给文件系统拍了张照片,要保证“照片”的完整性,之后对这张照片上数据的IO要被定位到其它空闲的地方,并修改文件映射关系。(可认为是ROW方式)
2, 基于物理卷的快照
基于物理卷的快照,相当于给物理卷增加一个“卷扇区映射管理系统”。卷扇区都是LBA来编号的,实现快照的时候,程序首先保留一张初始的LBA表,每当有新的写入请求的时候,程序将这些请求的数据,写入另一个地方(一般是一个新的卷,专为快照保留),并做记录:
如A的10000号已写入了数据内容,并且做了快照,快照后对A的10000号的写请求会被定为到新卷B的100号,这时A卷中就会记录如下映射数据。
原始LBA: 卷A的10000号,映射到LBA:卷B的100号
文件系统对感知不到这一重定向过程,FS在它的映射图中还是记录卷A的10000号LBA,而不是B的100号。
以上做快照的方式称为Write Redirect,快照生成之后对卷A的每一次读写请求,都需要查询映射表,增加了额外的时间开销。
由于Write redirect方式查表的时间开销太大,故产生了另外一种copy on write的方式。其工作原理如下:
快照生成之后,如果上层有针对原卷某个或者某些从做快照后从来没有更新过的LBA块进行写请求,则在更新这些LBA扇区之前,先将原来扇区的内容拷贝出来,放入一个空闲卷,然后将新数据写入原卷,即旧数据先占着位置,等新数据来了,旧数据再让位,一旦原卷某个LBA在快照之后被更新过了,则以后针对这个LBA的写,则可以直接覆盖,不需要提前拷贝。
COW 与 ROW 的对比:
1, 在两种方式下,快照后对从来没有修改过的扇区写IO,都需要占用额外的空间。
2, 如果快照数据被100%覆写,则快照需要与原卷相同的存储容量,但通常只有部分被覆盖,新卷的容量一般设为原卷容量的30%。
3, COW,初次覆写需要一次读,两次写;而ROW只需要一次写。故后者在IO延迟上有优势。但在读和非初次覆写的情况下,ROW需要遍历映射表或建立映射项,而COW则不需要。另外ROW方式在删除快照时开销很大。
3,做快照的步骤
1,发起创建指令,并在发起时间点,系统暂停应用程序和文件系统操作
2,刷新文件系统缓存,结束所有的事务
1, 创建快照,并在创建完后恢复系统正常运行
为什么要刷新系统缓存?
由于做快照的时间很短,快照记录文件系统当时的整个状态,做一次快照生成的状态,类似于系统掉电时系统的状态。
由于文件系统都有自己的缓存,文件系统缓存的是文件系统元数据和文件实体数据,并不是每次交互,都同步保存在磁盘上,如有的系统为了提高效率使用write delay算法,每隔一段时间(如30s),批量刷新到磁盘上。所以在做快照的时候可能有些数据还没写到硬盘,所做的快照就会与系统数据产生不一致。(如实际数据已经修改,而元数据没有修改,拷贝的元数据就跟实际数据不一致)
优秀的快照系统:
Netapp的WAFL因其工作方式,可以非常容易的做快照。WAFL从来的任何写操作都在新的数据块上进行,而不是覆写原有的块,所以每次快照WAFL只需要拷贝根inode而不是所有的inode就能得到文件系统的整个视图。
如图所示:某一个块上的inode改变了,则重写该块,则inode的父inode也会发生改变,将父目录inode的信息也写在新的块上,以此类推,一直到根inode,所以拥有了根inode就拥有了整个文件系统的数据视图。