快照技术探究

刚接触存储的时候就了解了下快照技术,当时了解了其大概意思,然后就是做快照的方法,经典的当然是文件系统级的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表,每当有新的写入请求的时候,程序将这些请求的数据,写入另一个地方(一般是一个新的卷,专为快照保留),并做记录:

   A10000号已写入了数据内容,并且做了快照,快照后对A10000号的写请求会被定为到新卷B100号,这时A卷中就会记录如下映射数据。

   原始LBA: A10000号,映射到LBA:卷B100

   文件系统对感知不到这一重定向过程,FS在它的映射图中还是记录卷A10000LBA,而不是B100号。

   以上做快照的方式称为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),批量刷新到磁盘上。所以在做快照的时候可能有些数据还没写到硬盘,所做的快照就会与系统数据产生不一致。(如实际数据已经修改,而元数据没有修改,拷贝的元数据就跟实际数据不一致)

 

 

 

优秀的快照系统:

NetappWAFL因其工作方式,可以非常容易的做快照。WAFL从来的任何写操作都在新的数据块上进行,而不是覆写原有的块,所以每次快照WAFL只需要拷贝根inode而不是所有的inode就能得到文件系统的整个视图。

  

    

 

如图所示:某一个块上的inode改变了,则重写该块,则inode的父inode也会发生改变,将父目录inode的信息也写在新的块上,以此类推,一直到根inode,所以拥有了根inode就拥有了整个文件系统的数据视图。

 

 

 

posted @ 2013-04-19 14:04  ydzhang  阅读(448)  评论(0编辑  收藏  举报