【IT168 资讯】SnapShot是WAFL文件系统“任意位置写入”功能带来的一项突出优势。一份SnapShot是文件系统的在线只读拷贝。创建文件系统的一份SnapShot仅仅需要几秒钟的时间,并且除非原始文件被删除或者更改,数据快照并不占用额外的磁盘空间。这种只有当数据快发生改动时才进行数据快复制的技术被称作“Copy-on-write”,只有修改活动文件系统中的数据块并写入磁盘中新的位置时,SnapShot才会占用额外的磁盘空间。
用户可以采用SnapShot作为数据的在线备份,以备将来进行数据恢复时使用。用户也可以方便的把SnapShot快照备份到磁带上。无需将Filer系统下线,用户管理员就可以将最近的SnapShot快照备份到离线存储系统中。
SnapShot技术详述
WAFL文件系统本身就可以理解成数据块树状结构,其根部的数据结构描述了inode文件信息。这份inode文件信息则包含了对文件系统中所有inode的描述,它包含诸如空闲块图和空闲inode图等元数据信息。WAFL通过复制根数据结构创建新的数据拷贝SnapShot。因为根数据结构只有128B,并且不需要在硬盘上复制其他数据块,一个新的SnapShot几乎不耗额外的磁盘存储空间,除非用户修改或者删除文件系统中的数据。
Filer可以对一个卷组创建最多255个SnapShot快照。SnapShot快照可以通过手动或者人为预先定制策略的方式来自动创建。每一个SnapShot快照可以保存的时间取决于文件系统变动的频度。在众多应用环境中,文件系统中的大部分数据并不是每天在变化,比如一个使用10MB大小Home Directory的用户,其数据通常每天只变动100到500KB。当文件变动缓慢的时候,SnapShot可以在线保存数天甚至数周,直到他们消耗的磁盘空间过多以至用户无法接受。而另外一些文件系统中的数据则在经常不停的变动,比如CAD应用环境下,需要经常覆盖写入许多大尺寸的文件,甚至可能一两天内就会更新整个文件系统的存储内容。在此类环境下,可能只有保存数小时SnapShot的空间。
用户对SnapShot的访问方式
文件系统中含有包含SnapShot数据快照的子目录,允许用户自行访问稍早些时候创建的SnapShot数据快照。假设一个用户从文件系统中意外删除掉一个名为foo的文件,现在需要利用SnapShot来对其加以恢复。则可以在UNIX/NFS客户端执行以下操作:
%ls –lu .Snapshot/*/foo
-rw-r-- r--l hitz 16787 Jun 16 15:00 .Snapshot/hourly.0/foo
-rw-r-- r--l hitz 16744 Jun 16 12:00 .Snapshot/hourly.1/foo
-rw-r-- r--l hitz 16811 Jun 16 10:00 .Snapshot/hourly.2/foo
采用-U选项查看三份SnapShot数据快照,用ls命令可以显示文件foo的创建时间,要恢复foo文件,用户只需将foo不同时期的快照版本复制回当前工作目录即可。
% cp .snapshot/hourly.0/foo
将.snapshot/hourly.0中的文件列表,将显示创建hourly.0数据快照时包含的所有文件。.snapshot目录是隐藏目录。如果.snapshot目录可见,可以使用find命令找到更多符合要求的数据快照副本。但是类似强制删除目录的命令,如 rm –rf 对SnapShot快照目录无效,因为SnapShot文件是只读文件,所以不能删除。然而Windows用户则可以在窗口中看到一个名为~snapshot的文件夹。
正确理解SnapShot
能否理解WAFL文件系统是由Root Inode引导的数据块树状结构是能否理解SnapShot的关键。由此,要对这种数据块树状结构创建副本,即创建SnapShot,WAFL只需复制Root Inode。
图(a )显示了文件系统树状结构图,为简便起见,只示意出了Root Inode,没有描绘出Inode和间接数据块。
图(b)显示了WAFL如何通过对Root Inode做一个完全相同的拷贝来建立新的SnapShot快照。这个复制而成的Inode就是代表SnapShot数据块树状结构的Root Inode和实际文件系统的Root Inode结构相同。当创建了SnapShot的Inode之后,它所指向的数据块与实际文件系统Root Inode所指向的数据块完全一致。所以除了Inode本身占用的空间之外,新建的SnapShot并不会占用额外的空间。
图(c)显示了当一个用户修改数据块C时,文件系统中发生的变化。WAFL在数据块C’上面写入新的数据, 并将活动文件系统指向新的数据块。而SnapShot仍然指向原有的未经修改的数据块C。随着活动文件系统中的文件越来越多的被加以修改,SnapShot中所包含的活动文件系统不再使用的数据块也就越来越多。文件变动的频度决定了SnapShot可以在磁盘上保留的时间长短,以免耗费过多的磁盘空间。
如果将WAFL的SnapShot数据快照与IBM TransArc Episode文件系统中所采用的Fileset Clones文件集克隆产品加以比较,会立刻得到有利于证明WAFL SnapShot性能优异的结果。在IBM TransArc Episode这种UNIX兼容文件系统中,如果执行数据快照类的功能,会带来十分可观的磁盘读写I/O,并且会消耗大量的磁盘空间。
例如,一个10GB的Episode文件系统中,为描述磁盘中每一个4KB的数据块,所有的Inode会耗用320MB的磁盘存储空间。在这种性能指标下,如果需要通过复制Inode的方式创建SnapShot数据快照,将会产生320MB的磁盘I/O请求,并且消耗320MB的磁盘空间,试想一下,如果我们需要创建10个这样的SnapShot数据快照,则意味着即使活动文件系统中的数据没有发生任何变化,也要消耗掉近乎1/3的磁盘空间(320MB*10约合3.125GB)。
与之对比的是,WAFL文件系统中的情况则截然不同。如上所述,WAFL可以迅捷的创建SnapShot数据快照并且只占用极小的磁盘存储空间,即复制Root Inode所耗用的空间。举个例子,为防范系统非正常停机,WAFL需要每隔几秒钟就对文件系统创建一个一致点,即内部的SnapShot。
数据块图文件(Block-Map File)
大多数文件系统使用位图的方式,即对每一块磁盘块使用1个数位,来标注空间数据块。如果该数位被使用了,那么意味着这个数据块是在被使用。这种机制在WAFL中并不适用,因为多个SnapShot可以同时指向一个数据块。WAFL的数据块图文件可以对每一个数据块采用32个数为来描述其路径。第0个数位记录了活动文件系统对数据块的映射,第1个数为记录了第1个SnapShot对数据块的映射,以此类推。如果一个数据块的块图文件中的任意一个数位被标注,则代表它已经被使用。