Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4020819
  • 博文数量: 251
  • 博客积分: 11197
  • 博客等级: 上将
  • 技术积分: 6862
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-05 14:41
个人简介

@HUST张友东 work@taobao zyd_com@126.com

文章分类

全部博文(251)

文章存档

2014年(10)

2013年(20)

2012年(22)

2011年(74)

2010年(98)

2009年(27)

分类: LINUX

2010-06-06 21:27:16

快照技术及应用

 

   摘要快照技术从提出至今,一直被广泛的应用,快照已成为存储系统的一项基本功能,很多企业的产品都提供快照工具,让用户可以很方便的使用,如NetApp公司的WAFL文件系统, IBM公司的TransArc Episode文件系统。本小组通过对快照技术的学习,首先介绍了快照的概念,由来;其次介绍了基本做快照的方式包括分离镜像,写时复制,写重定向;接下来对NetApp公司WAFL文件系统的高效快照方式做了介绍;最后介绍了快照技术的一些扩展应用。

 

     关键字:快照,WAFL,文件系统,分离镜像,写时复制,写重定向                 

1,快照的概念

快照通常被定义为一组文件、目录或卷在某个特定时间点的副本。快照所捕获的是一些特定数据在某个时间点的映像。按照存储网络工业协会(SNIA)德定义,快照(snapshot)为一个数据对象产生完全可用的副本,它包含对该数据对象在某一时间点的映象,快照在快照时间点对数据对象进行逻辑复制操作,产生数据对象在该时间点的一致性数据副本,但实际的部分或全部物理复制过程可能在复制时间点之外的某些时间进行。

 

2,快照的由来

存储系统快照的概念最初源于备份,因为需要备份的数据量通常很大,需要很长一段时间,如果停止主系统服务,固然能获取某一时刻的全部数据,但这样造成的经济损失会很大,而如果不停止主系统的应用服务,就会遇到一些问题,导致错备,漏备,这些问题包括:

Ø  备份过程中,某一文件从一个未备份的目录移到一个已备份的目录

Ø  备份过程中,某些文件正在进行写操作,导致备份数据不能被使用

Ø  热备份会严重影响应用系统的性能

这些问题导致,最终备份的数据跟备份时间点的时间严重的不一致,所以必须有一种技术能快速获取某一时间点存储系统的数据,快照技术因此而产生。

  

3,基本快照技术

 

3.1 分离镜像(Split Mirror

   

分离镜像(Split Mirror):在快照时间点到来之前,要为源数据卷创建并维护一个完整的物理镜像卷,这一过程与标准的RAID1 相似:同一数据的两个副本分别保存在由源数据卷和镜像卷组成的镜像对上。在快照时间点到来时,镜像操作被停止,镜像卷转化为快照卷,获得一份数据快照。快照卷在完成数据备份等应用后,将与源数据卷重新同步,重新成为镜像卷。对于要同时保留多个时间点快照的源数据卷,则必须预先为其创建多个镜像卷。分离镜像快照的优点为:在快照命令发出之后立即就能得到一个完整的物理副本,不再需要额外的复制操作。快照操作的时间非常短,仅仅是断开镜像卷对所需的时间,通常只有几毫秒,这样小的“复制窗口”几乎不会对上层应用造成影响。但是镜像分裂快照也存在一些缺点:首先,这种快照技术缺乏灵活性,无法在任意时间点为任意的数据卷建立快照:如果源数据卷没有预先创建镜像卷,将无法建立快照;当一个镜像卷正处于重新同步状态时,也无法用于建立快照。其次,预先创建镜像卷占用了大量的存储资源,并极有可能造成资源的浪费。最后,快照时间点之前持续的镜像操作将会增加系统的开销,尤其当一个源数据卷同时维持多个镜像卷时。分离镜像最困难的方面是镜像卷和源数据卷的数据同步。

 

3.2 写时复制(Copy-On-Write

 

写时复制快照需要预留一些存储空间,建立快照卷。当我们为一个数据卷创建一个快照之后,这些预留的空间用来存被更新数据块的旧数据。写时复制快照在初始化的过程中仅仅创建用来描述源数据块位置的指针信息(元数据),而不是完整的将源数据块拷贝过来。因此初始化的过程几乎可以在瞬间完成,对系统的影响也很小。

写时复制快照会跟踪数据卷的写操作和数据块变化。当某个数据块发生改变时,在将旧的数据覆盖之前,首先将该块的旧数据复制到预留的快照卷,该步骤仅在数据卷相应数据块位置发生第一次写操作请求时进行。这个处理过程确保快照出来的数据与发起快照的那个精确时间点保持完全一致。写时复制快照的具体过程如下图1所示:

如果我们需要访问某个时间点的快照数据,对没有改变过的块直接从数据卷读取;对已经改变并被复制的块则从快照空间读取。从快照被创建那一刻开始,每个快照都会跟踪记录描述块改变的元数据信息。

写时复制快照的主要优势在于空间的高效利用,因为快照卷只需要保留发生过变化的数据块,与数据卷相比要小得多,并且读性能很高。写时复制快照的缺点在于,它会引起数据卷性能的下降,尤其是写性能因为创建快照之后,对数据卷的写操作会增加一个等待的过程,即将旧数据块复制到快照卷的过程。

 

  1COW快照过程

 

3.3 写重定向(Redirect-On-Write

 

重定向写与写时复制是相对的概念,它可以避免两次写操作引起的性能损失。重定向写同写实复制一样在空间利用方面效率非常高。

写重定向把对数据卷的写请求重定向到快照预留的存储空间,而写操作的重定向设计则把需要两次写才能完成的操作减少为一次写。写时复制的两次写包括:将旧数据写入快照卷,在数据卷写入新数据;而写重定向只需将新数据写到快照卷即可,从而避免两次写操作带来的性能损失。重定向需要一个映射表来记录重定向的记录,每次读取数据之前,需要查询映射表,将请求定向到快照卷,从而影响读的性能。其具体过程如下图2所示:

 

2ROW快照流程

使用写重定向快照,数据卷存放的是上一个快照时间点的旧数据,新数据最终存放在预留的快照空间。这就引发了一个问题,就是快照的删除。被删除的快照上的数据必须被复制到原始数据卷,并做一致性回退。创建的快照越多,维护快照的复杂度也会随着上升。这些复杂性包括对原始数据的访问、快照数据和原始数据卷的跟踪、以及快照删除后的数据调整。另一个直接引发的严重问题是,原始数据集中会产生大量的碎片。

 

4WAFL文件系统快照技术

   快照是NetApp公司WAFL文件系统任意位置写入功能带来的一项突出优势。一份快照是文件系统的在线只读拷贝。创建文件系统的一份快照仅仅需要几秒种的时间,并且除非原始文件被删除或者更改,数据快照并不占用额外的磁盘空间。

WAFL每次做快照,它只将根inode拷贝并保存,而不保存下级链表的inode,之所以能这么做,是因为WAFL从来不覆盖写入某个文件对应的旧块,不管是元数据还是实体数据,WAFL统统写入到卷的空闲块上(根节点inode的映射图位置是恒定,每次更新会覆盖写)。这样,在只复制了根节点inode之后,由于下级链表inode均不会被覆写,所以同样可以保存瞬间的snapshot。而其他的快照实现方式,一般都将所有inode复制并保存,因为它们的inode都是恒定位置的,只能全部覆写。

 

图3:WAFL快照的方式

WAFL的写方式,如上图3所示,当第一次做完快照后,得到了snapshot1,在系统运行过程中,block6上的某一inode50改变了,于是WAFL在新的块block7写入修改后的数据,inode50的根inode所在数据块block3也会发生变化,因此在新的块block8写入新的数据,依次类推……直到更新根inode节点的数据。因此,WAFL每次做快照,只需要拷贝根inode节点,即能得到整个文件系统的当前数据视图。 

5,快照的扩展应用

 

5.1 持续数据保护(CDP)

 

持续数据保护的出现是为了实现零数据丢失的RPO指标,以及瞬时数据恢复的RTO指标。它本身与同步数据镜像很类似,不同之处在于CDP还可以对软性灾难进行恢复。包括人为误操作、恶意软件攻击、意外删除、数据损坏等情况。

持续数据保护类似频率很高的增量快照,它会捕获并复制任何时刻发生的数据变化,并且给这些数据块打上时间戳。或者采用快照加日志的方式实现CDP, 即通过快照提供一个初始参考点,然后对每次数据的修改以日志的形式记录下来,通过日志,就能得到任意时间点的数据。CDP本质上相当于每个时刻都创建一份增量快照,提供细粒度的精确数据恢复。

 

5.2 增量元数据收集

 

Spyglass是一个存储系统元数据查找原型,它提出了多种策略包括层次性分区,签名文件,增量元数据收集等思想来提高大规模存储系统的元数据查找效率,而其中的增量元数据搜索的思想则用到了快照技术。Spyglass的模型如下图4所示:

 


图4: spyglass模型图

 

     Spyglass接受用户的查找请求,并返回查找结果,其中的crawler组件主要负责从存储系统收集元数据。Spyglass每次只收集改变过的元数据,而其如何判断文件系统哪些元数据被修改过呢?这得益于文件系统的快照功能。因为通过两次快照,文件系统能很快得出哪些元数据被修改过(快照会跟踪文件系统元数据),从而crawler只收集修改过的这部分元数据,而不用重新收集所有的元数据,以提高效率。

 

 

5.3 内存快照技术

 

 

 

图5:内存快照例子

 

如图5所示:某个图包含A,B,C,D四个节点,一个分析线程(Profiling Thread)需要遍历该图,同时有一个应用程序线程(Application Thread)可能会更新这个图。

5(a)所示:当分析线程已经访问完节点A,发现节点BA唯一的孩子节点,于是分析线程下一步就是访问节点B,当分析线程访问节点B的时候,应用程序线程把节点DC分离,并把它连接成为A节点的孩子节点。由于A节点已经被访问了,故作为A节点孩子节点的D 就无法被访问,分析线程无法原子的遍历整个图,可能因为应用程序线程的并行操作而丢失一些节点信息。

引入锁机制可以解决5(a)中的问题,即在访问过程中对路径上的节点访问前进行加锁,但这样可能会造成死锁,如图5(b)所示,分析线程访问完B需要获取C节点的锁,而应用程序线程访问完C需要获取B的锁这是就陷入死锁。

通过内存快照技术,如图5(c)所示。内存快照支持原子的对多字节进行读操作,分析线程在读之前,系统在硬件的辅助下,对需要访问的数据做快照,同时应用程序线程可对原数据进行更新,以实现并发操作,即内存快照在不需要同步代码情况下很容易解决竞争问题,从而提高系统效率。

 

 

参考文献

 

[1]  Spyglass: Fast, Scalable Metadata Search for Large-Scale Storage Systems. Andrew W. Leung, Minglong Shao, Timothy Bisson, Shankar Pasupathy, Ethan L. Miller. FAST-08.

 

[2] Fast Memory Snapshot for Concurrent Programming without Synchronization. Jaewoong Chung, Woongki Baek, Christos Kozyrakis. ICS-09.

 

TRAP-Array(A Disk Array Architecture Providing Timely Recovery to Any Point-in-time). In Proceedings of ISCA’06: The 33rd Annual International Symposium on Computer Architecture, Boston, USA.

 

 

   

阅读(3581) | 评论(0) | 转发(1) |
0

上一篇:计算机系统结构

下一篇:片上系统SoC

给主人留下些什么吧!~~