ZFS文件系统Snapshot技术的分析

2009-08-28 09:09倪琴琴孙卫真
计算机教育 2009年14期
关键词:快照

倪琴琴 孙卫真 刘 峥

摘要:快照是一种重要的存储数据的技术,可以在不停止应用程序的情况下对数据进行备份。本文对Solaris平台下的ZFS文件系统中的快照技术进行了分析,介绍了快照的工作原理、实现技术及数据结构,并在ZFS中进行快照创建、数据恢复的实例分析,结果表明ZFS文件系统中的快照技术能避免数据的丢失,可以有效地保护该系统下的数据,并且在操作系统的实验教学中对文件系统的分析具有较大的实践意义。

关键词:快照;Copy-on-Write;ZFS;Solaris

中图分类号:G642 文献标识码:B

1引言

随着计算机技术在各个领域的广泛应用,信息量迅速增长,越来越多的单位、公司以及个人对计算机数据的依赖性逐步增强,数据的损坏或者丢失将对用户造成不可弥补的损失。为保护重要数据,用户不得不频繁地备份数据。传统的数据备份是冷备份,需要停止系统运行才能进行,在备份期间,无法进行正常的数据访问。但对于许多关键性的应用环境,如电子商务系统或者银行系统等,系统需要连续不断地运转,停机就意味着业务的停顿和商业机会的丢失,停止系统来进行数据备份就会造成难以估量的损失。因此,如何在系统运行期间对系统数据进行备份,并保证数据版本的一致性就变得尤为重要。Snapshot技术正是为了解决该问题提出的。Snapshot能在不停止应用程序的情况下生成某一瞬间的数据映像,用户可以对该数据映像进行保存备份,当系统出现问题或者数据丢失时,用户可以安全方便地获得快照创建时刻的数据映像。

2Snapshot技术介绍

Snapshot也称为快照,是本地保留的按时间点保存的数据映像。产生一个文件系的Snapshot,并不是对所有数据块进行拷贝,只是对文件系统当前点的信息记录。快照不能被直接访问,但是可以对它们执行克隆、备份、回滚等操作,通过这些操作,系统可以有效地保护数据。

Snapshot技术的实现方式目前有两种:即写即拷(Copy-on-Write)方式和分割镜像(Split-Mirror)方式。Snapshot需要建立一个完整一致的映像,为了保证这一点,必须在某个特定的时刻完成全部数据的拷贝,通常这种拷贝不可能在一瞬间完成的。实际上在进行Snapshot操作时,并不是对所有的数据进行完全复制,而是使用Copy-on-Write技术或者Split-Mirror方式。建立一个Snapshot只需要极少的工作,在极短的时间内完成即可。

Copy-on-Write技术可以在每次输入新数据或已有数据被更新时生成对存储数据改动的Snapshot,这样做可以在发生硬盘写错误、文件损坏或程序故障时迅速恢复数据。但是,如果需要对网络或存储媒介上的所有数据进行完全的存档或恢复时,所有以前的快照都必须可供使用。Copy-on-Write方式通常也被称为“元数据”拷贝,即所有的数据并没有被真正拷贝到另一个位置,只是指示数据所处位置指针被拷贝,从而使得实际用于保存Snapshot所需要的空间大大减少。

Split-Mirror快照引用镜像硬盘组上所有数据。每次引用运行时,都生成整个卷的Snapshot,而不只是新数据或更新的数据。这种方式使离线访问数据成为可能,并且简化了恢复、复制或存档一块硬盘上的所有数据的过程。但是,这是个较慢的过程,而且每个快照需要占用更多的存储空间。

3ZFS系统中Snapshot的实现分析

3.1ZFS中Snapshot的工作原理

ZFS是Solaris系统上一个全新的文件系统,它完全抛弃了传统的文件系统+卷管理+存储的架构,所有的存储设备通过ZFS Pool进行管理,通过把各种存储设备加入同一个ZFS Pool,可以轻松地在ZFS Pool文件系统下工作。Solaris ZFS文件系统通过快照可避免删除数据时出现意外丢失,也可以通过适当权限把文件系统中的所有文件移动到远程系统,以节省本地ZFS系统空间。ZFS通过使用Copy-on-Write的方式提供Snapshot功能,ZFS下的Snapshot为系统提供了更安全有效的数据保护方式,其工作原理如图1所示。

图1(b)是对图1(a)所示的活动的文件系统得一个Snapshot。在创建一个新的Snapshot映像时,系统仅仅简单地复制一个根节点,新的Snapshot节点与原始的根节点指向完全相同的数据块,如图1(b)所示。一段时间后,如果文件系统发生变化,如删除了一个文件时,在活动的文件系统中,此文件已经丢失,但在磁盘上并没有真正删除此文件,Snapshot中仍然记录此文件的信息,图1(c)所示。也就是说,通过Snapshot仍然可以找到该文件。而修改文件系统中的某个数据块时,系统在修改前复制该数据块,然后修改根节点的相关数据的同时,对复制块数据进行修改。这样,仅仅那些修改了的数据块才需要进行复制,不仅提高了复制效率,也提高了系统磁盘空间的利用率。需要备份时,从Snapshot根节点开始,可以读取到该时间点的完整的存储系统映像。而实际的操作仍从根节点开始,这样可以正确地访问到最新的数据。

3.2Snapshot结构分析

ZFS文件系统的Snapshot是文件系统的只读副本。Snapshot几乎可以即时创建,而且最初不占用池中的其他磁盘空间。但是当活动数据集中的数据发生更改时,Snapshot通过继续引用数据占用磁盘空间,从而阻止释放该空间。ZFS Snapshot的特征有以下几点:

 在系统重新引导前后保持不变;

 用户理论上可以创建的最大快照数为264,且可以根据用户需求为Snapshot重命名;

 不使用单独的后备存储,Snapshot直接占用存储池(从中创建这些快照的文件系统所在的存储池)中的磁盘空间。

文件系统中的Snapshot的存在不会影响系统的效率,ZFS中Snapshot的实现主要是在ZFS的DSL(Dataset and Snapshot Layer)层。

ZFS文件系统在磁盘上可以被描绘成包含诸多叶子节点树形结构,叶子节点包含数据和含有元数据的内部数据块,数据块为dnode_phys类型。在该文件系统中,修改磁盘上的一个数据块,并不是直接覆盖磁盘上的原始数据块,而是创建一个新的数据块。然后通过修改数据块父节点的指针,使其指向新数据块的内容。通过持续该操作,直到到达文件系统的根节点,来实现数据的更新,如图2所示。

Snapshot也是一种数据块类型,在ZFS中用dsl_dataset_ phys结构描述。ZFS为维护Snapshot技术主要维护两种数据结构: blkptr结构体,其中的blk_birth记录每个数据块创建的时间;dsl_dataset_phys结构体,维护每个文件系统的“dead”数据块列表和Snapshot结构,各数据结构的内部关系如图3所示。dsl_dataset_phys通过dsl_dataset指针链接到dsl目录中,由dsl目录结构维护整个文件系统中Snapshot以及数据集的关系;blkptr结构体记录每个数据块创建的时间,并通过blk_dva所保存的128位虚地址指向具体的数据块结构。

系统通过dsl_dataset_snapshot_sync()执行创建快照的功能。创建快照时,会生成一个新的dsl_dataset_phys节点,并将该节点加入到dsl目录中。新的快照节点的与当前的文件系统根节点指向相同的数据集。当文件系统的数据被修改时,如删除某个数据块时,需要判断该数据块是否可以被完全释放。此时系统调用dsl_dataset_block_born()来进行判断,通过比较该数据块的创建时间(blk_birth)与文件系统中所有的Snapshot的创建时间,如果数据块是在Snapshot之前创建,该数据块不能被释放,而是将其加入到文件系统的dead list中;如果数据块是在Snapshot之后创建的,则必须释放该数据块。通过该方法,当文件系统回滚到Snapshot创建点时,文件系统才能找回创建点的所有数据。当Snapshot被删除时,系统调用dsl_dataset_destroy_sync()函数,并在该函数中决定哪些数据块需被释放,并以此维护文件系统的dead list。

3.3Snapshot实例

在ZFS文件系统中,Snapshot的创建可以随时进行,当用户为文件系统创建一个新的Snapshot时,它的初始大小为0KB。如图4所示,为文件系统fs001创建快照fs_snapshot01,其初始大小为0。因为新创建Snapshot时,没有进行数据更新,系统只是创建了一个Snapshot节点指向文件系统的数据块。

当进行文件更新时,如在fs001文件系统中创建了一个新的文件test002.txt,并删除原来的test001.txt文件,此时再观察fs_snapshot01,其大小已经变为18.5K,而在文件系统fs001中已经找不到文件test001.txt(图5所示)。

为观察Snapshot是否保存有test001.txt文件,我们通过mdb进入系统内核,查看ZFS文件系统的信息。从mdb中可以看到为fs001文件系统创建的Snapshot路径的信息,命令如下所示:

#mdb –k /*进入mdb*/

>::walk vfs |::fsinfo –v !grep zfs/*查看名为zfs的文件信息*/

fffffffffbacad650zfs /

ffffff00c9cd8690zfs /rpool

ffffff0e84c679c0zfs /rpool/fs001

ffffff00d5c7f358 zfs/rpool/fs001/.zfs/snapshot/fs_snapshot01

从图6可以看出,进入/rpool/fs001/.zfs/snapshot/fs_ snapshot01文件夹,可以看到,在该文件夹中保存有fs_snapshot01创建时fs001文件中完全相同的数据信息。创建文件系统的快照时,每个文件系统会在自身的根目录下创建.zfs/snapshot的文件夹,该系统的所有快照信息数据均被保存在这个目录下。创建Snapshot后,对文件系统中的数据进行修改或删除,并没有真正地从磁盘上删掉修改或删除的文件,只是改变了文件系统数据块的指针指向,原始的数据仍然保存在磁盘上,而通过快照回滚,仍然可以找回快照创建点的数据。通过Snapshot可以避免因不正当操作误删数据等,能有效地保护系统的数据。

5结束语

本文主要分析了Solaris平台下ZFS文件系统中Snapshot技术,详细阐述了在ZFS系统中Snapshot的工作原理,主要功能及数据结构,并通过具体的实例分析了Snapshot保护数据的有效性。Snapshot技术提供了一种高效的地址映射机制,使得用户在不停止应用程序的前提下,利用较小的空间保护数据,具有极大的灵活性和广泛的应用性。由于Solaris系统使用的广泛,该平台下基于ZFS的Snapshot技术也会有广阔的应用前景。

快照技术在我校操作系统分析与实践的课程中作为文件系统的实验课题,对学生的实践教学具有实际意义。它不仅在教学过程中引入了OS新技术,也加深学生对文件与IO系统的理解,为后续“UNIX高级编程技术”和“系统编程技术”课程的学习提供了前导帮助。近二年的实践课程和学生报告表明,利用Solaris操作系统中的新技术(例如Snapshot等),对促进和提高OS的教学具有较现实的意义。

参考文献:

[1] 董欢庆,李战怀,王彦龙,等. Linux卷管理系统Snapshot技术的分析与研究[J]. 计算机工程,2004,30(2):55-57.

[2] 胡风华,游智勇, 李恪. 存储系统中Snapshot技术研究[J]. 计算机工程,2004(01):103-105.

[3] Ahrens. Snapshot, is it magic?[EB/OL]. [2009-04-10]. http://blogs.sun.com/ahrens/entry/is_it_magic.

[4] Richard McDougall. Solaris内核结构 [M]. 2版.北京:机械工业出版社,2007.

[5] BigAdmin. ZFS源代码概览[EB/OL]. [2009-04-05]. http://www.sun.com/bigadmin/hubs/ multilingual/simp_chinese/content/ zfs-source.jsp.

[6] 吕烁,罗宇. 基于设备的容灾备份方案的研究[J]. 计算机工程与科学,2007(04):142-145.

[7] 李晓林. 存储网格面面观[J]. 计算机教育,2004(11):30-32.

猜你喜欢
快照
巧破困局,快速恢复本本活力
千万门级FPGA芯片设计平台的数据存储技术
戛纳红毯禁自拍火了快照
注册表拍个照 软件别瞎闹
跟踪监视系统或文件的细微变化
云存储下的容灾备份技术研究与部署
分布式文件系统在铁路信息系统中的应用
屎壳郎能够利用星星辨别方向
啪!一个瞬间讲述一个故事
快照管理充当“中场球员”?