免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2675 | 回复: 1
打印 上一主题 下一主题

快照技术探究 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-23 22:08 |只看该作者 |倒序浏览

刚接触存储的时候就了解了下快照技术,当时了解了其大概意思,然后就是做快照的方法,经典的当然是文件系统级的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就拥有了整个文件系统的数据视图。





本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/87570/showart_2077069.html

论坛徽章:
0
2 [报告]
发表于 2009-12-01 03:14 |只看该作者
经典文章啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP