VSS (Volume Shadow copy Service, 卷映射拷贝服务),最初是在Windows Server 2003 SP1中引入的存储技术。它通过在卷管理模块上加入快照功能,在此基础上就可以创建基于时间点(Point-In-Time)的映像(Image),从而实现数据的快速备份和恢复,用户也无需害怕因无意删除数据而造成的困扰,这就是VSS的关键所在。由于VSS所表现的优良特性,因此在Microsfot最新的Vista操作系统中,也加入了该功能。
一、 VSS概述 VSS能够让存储基础设备(比如磁盘、阵列)创建高保真的时间点映像,就是映射拷贝(Shadow Copy)。它可以在多卷、或者单个卷上创建映射拷贝,同时不会影响到系统性能。VSS通过协调业务应用软件、备份程序,以及存储硬件,从而达到创建高保真映射拷贝的能力。它可以应用到以下领域:
A、 快速数据备份和恢复;
B、 针对制定文件的恢复;
C、 磁带备份、测试,以及数据挖掘方面;
由于Microsoft在OS中集成了VSS技术,它将各个处理功能模块化,并针对存储软硬件厂商提供相应的开发接口;开发商只需要关注自己的模块,根据需求设计相关的应用,从而减少了整体设计的难度。就笔者了解,不少软硬件存储公司就采用VSS技术来设计NAS,并以此为基础构建数据保护服务器。
二、 VSS技术原理 VSS整体框架包含了VSS核心模块、请求者(Requestor)、写入者(Writer),以及提供者(Provider)。各个模块之间的关系如下图所示:
其中,各个模块的具体功能如下:
A) 请求者(Requestor),其主要任务是初始化映射拷贝的创建;由于需要不一样,解决的问题各不相同不同,因此可能设计不同请求者应用。例如,备份应用处理VSS的备份功能,管理应用处理映射拷贝的创建及使用(像WS2003和Vista本身提供的VSS管理软件就是此类),同时可以设计其他功能应用,来处理专门的业务。对于请求者的应用,包括Windows NT备份模块、备份软件提供商设计的备份应用,以及存储软硬件提供商设计的管理应用。
B) 写入者(Writer),其主要任务是保证数据的一致性;因为,如果在创建映射拷贝的过程中,应用软件继续往磁盘写入数据,那么将会出现数据非一致性问题,从而影响该时间点映像的完整性。通过在应用写入者模块进行控制处理,来保证数据的一致性,同时也可以达到创建映射拷贝的高效性。通常,写入者可能是Windows OS里面的各种服务模块,像COM+、DHCP服务、Active Directory服务等,除此之外,数据库也是常见的写入者应用。
C) 提供者(Provider),其主要任务是创建映射拷贝;提供者是创建时间点影响的接口,它可以是基于存储阵列(硬件模式),或者操作系统(软件模式)。VSS有不同的提供者,其层次关系为:最底层是硬件提供者,中间是软件提供者,最上面是系统软件提供者。其中前面两个提供者,是为第三方硬件或者软件厂商提供的。
D) 卷映射拷贝服务(VSS)核心模块,其主要任务是协调各个模块的协作运行,并提供创建卷映射拷贝的方法;VSS提供了两种创建映射拷贝的方法:一种是完全拷贝(Clone/Full Copy/Split Mirror),它会创建当前原始数据(Original Data)的全部拷贝;而另外一种就是写时才拷贝(Copy on Write/Differential Copy),它只创建将要被更新的原始数据的拷贝。因此写拷贝创建映射拷贝速度快,但是恢复数据时需要使用原始数据。
三、 VSS处理流程 VSS处理映射拷贝,需要协调各个模块来完成,从而保证创建出高保真的拷贝,进而实现数据的一致性,其具体步骤如下图所示:
A) 第一步,请求者让VSS枚举所在卷上的写入者应用,并收集元数据(Metadata)。
B) 第二步,写入者可能通过XML文件来描述其组件(Components),并定义其恢复(Restore)方法;其中,考虑到数据一致性,写入者需要一些相关处理,比如对于数据库应用来说,关闭所有打开的事务、回滚事务日志、以及将缓冲区中的数据写入等操作,直到所有数据准备好之后,通知VSS可以创建映射拷贝了。
C) 第三步,VSS对于请求的卷,查询是否支持映射拷贝,并由那个提供者提供;因为在请求者管理应用中,会设置卷的映射拷贝属性以及策略等,所以需要进行查询和判断。
D) 第四步,请求者通知VSS,要求在该卷上创建映射拷贝。
E) 第五步,VSS锁住写入者应用,暂时不让写入新数据(在某些应用情况下,读操作请求是可以允许的)。
F) 第六步,VSS让提供者在磁盘上创建当前状态的映射拷贝(创建映射拷贝的速度,和创建的方法以及提供者的实现相关)。
G) 第七步,创建映射拷贝完毕,VSS解锁写入者应用;然后写入者就可以处理队列中的写请求,接着VSS会查询是否这些写请求在创建映射拷贝期间被保证在队列中,如果是,则说明数据是一致的,否则说明可能数据一致性有问题,并做相应处理。