一种基于文件系统的在线数据迁移技术 |
2012-08-23 10:17 作者:刘飞飞 来源:硅谷网 HV: 编辑: 【搜索试试】
|
|
硅谷网8月23日消息 《硅谷》杂志2012年第14期刊文称,介绍一种基于文件系统过滤驱动的在线数据迁移技术的架构、实现和难点解决方案。
在企事业生产环境中,通常会有设备更替等情况发生,比如,某单位原来购买了低端型号的磁盘阵列,然后经过多年发展,发现原有的磁盘阵列在性能上、规模上已经满足不了业务发展的需要,需要购买高性能的新型阵列,然而这种新型阵列有可能是另外一个存储产商生产的阵列,这就需要在这两种阵列间提供一种数据迁移的能力,把当前的业务数据、应用程序、运行环境从原有阵列迁移到新阵列,而且在进行这种迁移的时候,单位通常希望原有业务系统还能照常对外提供工作,即一边迁移,一边应用照常工作。当然,当前存储产商一般都有自己的解决方案去满足客户的这种需求,通常的做法是在主机端提供软件用操作系统标准接口从原有阵列上读取数据写入新阵列,同时捕获硬盘级别的原阵列I/O写入,复制到新阵列上,但一般说来,这种方案粒度较大,把整个硬盘上的数据都进行迁移,用户没有可定制性,即无法指定什么是真正需要迁移的数据,比如说,用户的系统上D盘安装了微软SQLServer,用户就想只迁移SQLServer数据库本身,而不需要D盘上的其他数据,但通常的方案往往需要把整个D盘上的数据进行迁移,这样不仅迁移时间变长,而且浪费了存储空间。本文介绍一种基于文件系统的数据迁移方案以提供灵活的用户定制性来弥补普通方案的不足。
1架构设计
上图简要描述了这种新型数据迁移方案的总体架构,该架构包含两个基本模块,分别位于用户态的控制模块,和位于内核态的数据迁移模块,控制模块用来提交用户的迁移需求,启动数据迁移模块进行数据迁移;数据迁移模块启动文件读取和写入进行真正数据迁移,并且在数据迁移结束后通知控制模块任务完成。具体来说,控制模块实际上是一个用户态进程,通过IOCTL通知内核态迁移模块要进行什么样的数据迁移,用户可以定制他们业务相关的数据迁移,还以微软SQLServer数据库为例,假设用户的数据库文件位于D盘MSSQL目录下,用户可以指定D:\MSSQL\*和F:,告诉内核数据迁移模块D:\MSSQL目录下所有文件需要进行迁移到F盘上的同样目录中;内核态的数据迁移模块是整个方案的重点模块,它本质上是一个文件系统过滤驱动,位于I/O存储栈的真正文件系统的上方,应用程序的文件I/O读写在到达真正文件系统之前先到达文件系统过滤驱动,文件系统过滤驱动做若干处理后下发到真正文件系统,很多功能软件,比如杀毒软件、文件复制软件、透明加密软件都是依靠这种方式实现的。在不同操作系统上,文件系统过滤驱动的实现各不相同,对Linux系统,主要通过HOOK机制在实现,在Windows系统上,微软提供了两种方式,legacy方式和minifilter方式,方便开发人员实现文件过滤;但不管文件系统过滤有多少种实现方式,其功能只有一个,在文件打开、读取、写入、锁定等等常见文件操作的时候能通知到功能软件以实现附加价值。
2基于文件系统在线迁移的核心思路(以用户指定迁移D:\MSSQL\*到F盘为例,)
1)从用户指定的配置中定位一个源文件,比如微软SQLServer中的数据库文件D:\MSSQL\DB\sqldb.mdf。
2)文件复制:打开源文件,通过操作系统ReadFileAPI读取其中内容,并通过WriteFileAPI写入F:\MSSQL\DB\sqldb.mdf。
3)I/O镜像:注意到在进行文件复制的同时,上层应用(这里是SQLServer)还在继续对外服务,有可能针对源文件(D:\MSSQL\DB\sqldb.mdf)发生数据库读写请求,需要捕获这些写入请求,并把它们镜像到F盘上同样目录的同名文件上。
4)当步骤2从头到尾把文件sqldb.mdf复制完了后,可以认为该文件的数据迁移完毕,根据用户的指定,定位下一个文件,开始复制,直至所有文件数据迁移完毕。注意对于所有文件,I/O镜像始终都在工作,以保持数据一致性。
5)停止所有文件的I/O镜像;把D盘F盘盘符卸下,把原来的F盘换成盘符D,重新Mount文件系统,启动MSSQLServer,数据迁移完毕。
3基于文件系统在线迁移的难点分析及解决方案
在这个方案中,主要有以下几个实现难点:
1)整个文件独占访问模式,比如MSSQLServer在访问数据库文件的时候,一定会将这个文件置上排他标志,以防止其他程序打开。
2)文件的一部分被锁定,也是一种文件独占访问模式。
3)I/O镜像时,需要截获文件写入请求。
4)文件复制和I/O镜像之间的同步。
对于难点1和2来说,某些应用确实希望只有自己能打开自己的文件进行独占访问,而且文件系统在设计和实现上确实提供了独占访问的方式,显然独占访问在数据迁移时是不可接受的,因为复制程序需要打开源文件读取,那么怎么解决这个独占访问的问题,同时使得应用觉得自己在独占访问数据库文件,其他应用程序无法打开读取,而在线迁移软件却能够照常访问呢?应该看到,作为文件过滤驱动程序,内核迁移模块能够在文件打开之前得到通知,如果能在文件系统过滤驱动程序中实现独占访问的逻辑,即设立一个白名单,在这个白名单的程序可以绕过独占访问检查直接打开文件,然后把在线数据迁移模块加入这个白名单,那样就解决了问题。举例来讲,假设存在两个应用程序--MSSQLServer和第三方文件拷贝工具FastCopy,前者作为独占访问sqldb.mdf文件的实体,后者作为其他应用程序试图复制sqldb.mdf到其他地方,文件系统过滤驱动先收到MSSQLServer发出来的指定了独占访问标志的文件打开请求,检查到独占访问标志后,文件系统过滤驱动就在内核内存中设立一个数据结构,并标志该文件已经被“独占”打开,然后清除MSSQLServer打开请求的独占标志,下发该请求到底层真实文件系统;接着FastCopy的文件打开请求到达过滤驱动,在下发到底层文件系统之前,文件系统过滤驱动先做一层检查,检查内存中的数据结构,发现文件已被“独占”打开了,因此文件系统过滤驱动不下发请求直接返回错误“文件访问冲突”;然后迁移软件执行到步骤2,需要以读取方式打开sqldb.mdf,然而因为它是白名单软件,文件系统过滤驱动不做额外处理直接下发请求,因此迁移软件能正常打开并读取文件。同理,在处理文件锁定问题上,文件系统过滤驱动也在内存中设立了一个数据结构,该结构包含一个链表,把所有文件锁定区域链在一起,白名单软件直接跳过,非白名单的软件需要检查文件锁定是否冲突,这样也能解决锁定所带来的问题。这种处理方式可以归结为把文件系统的独占访问/文件锁定逻辑实现在过滤驱动模块中。对于难点3,文件I/O镜像,可以有两种处理方式,首先,文件系统过滤驱动截获到文件写入后,可以拿到文件的写入位置、写入长度、写入内容,文件系统过滤驱动可以把这些信息从内核态传递到用户态,指示用户态程序调用通用操作系统系统调用WriteFile把数据写入目的文件;另外一种方式,就是在内核里头直接产生文件写请求,复制写入位置、写入长度、内容等,直接通过文件系统写到目的文件,与第一种方式相比,这种方式实现上稍微困难一些但避免了内核态用户态模式切换,因此性能更好。难点4,因为这是一种在线的数据迁移方案,为了保证数据的一致性,必须同步文件复制和I/O镜像的过程,比如,假设sqldb.mdf含有两个数据块A/B,当前正在进行文件复制A块,在A块写入F盘之前,上层数据库软件SQLServer由于transaction的缘故,引发的对A块的修改,这种情况下,必须等到A块的文件复制结束后才能进行A块的I/O镜像;同样的,如果对B块I/O镜像正在进行,那么B块的复制就不能开始;为此,引入一个数据结构,该数据结构含有SPIN_LOCK锁(自旋锁)、当前文件复制块号和未决的I/O镜像队列,SPIN_LOCK锁用来同步文件复制和I/O镜像,当前文件复制块号表示文件复制应该从哪个地方开始,I/O镜像队列用来保存当前正在进行镜像的I/O;这样文件复制的逻辑就是:
1)获取自旋锁。
2)遍历数据结构中I/O镜像队列,检查是否文件复制块号与其中某个镜像冲突,如果是的话,先释放自旋锁,睡眠一段时间,再次回到1);否则,进入下一步。
3)设定数据结构中的当前文件复制块号。
4)释放自旋锁。
5)读取文件对应于文件复制块号的内容,写入目的文件。
6)文件复制块号增1),回到1);如此反复直至文件所有数据块复制完毕。
对应I/O镜像的逻辑就是。
7)截获到I/O请求,获得当前写入位置。
8)获取自旋锁。
9)检查当前写入是否与数据结构中的文件复制块号冲突,若是,表明该块正在复制中,需要等待结束,故先释放自旋锁,睡眠一段时间再次回到1);否则进入下一步。
10)将当前写入加入I/O镜像队列。
11)释放自旋锁。
12)复制I/O以实现目的盘写入,并且下发I/O实现源盘写入。
13)等待两个I/O成功结束。
14)获取自旋锁。
15)从I/O镜像队列中移除当前写入。
16)释放自旋锁。
以上是实现内核迁移模块要注意的主要方面,另外,值得注意的是,内核数据迁移模块需要截获其他一些I/O请求,比如文件删除、文件重命名、文件截断等,对于这些请求,数据迁移模块需要复制请求,下发到目的盘,以得到一致的迁移效果。
作者简介:
刘飞飞(1980-),女,北京人,本科,工程师,研究方向:信息系统开发和运维。(原文载于《硅谷》杂志2012年第14期,硅谷网及《硅谷》杂志版权所有,未经允许禁止转载)
|
|
|
|
【对“一种基于文件系统的在线数据迁移技术”发布评论】 |
版权及免责声明:
① 本网站部分投稿来源于“网友”,涉及投资、理财、消费等内容,请亲们反复甄别,切勿轻信。本网站部分由赞助商提供的内容属于【广告】性质,仅供阅读,不构成具体实施建议,请谨慎对待。据此操作,风险自担。
② 内容来源注明“硅谷网”及其相关称谓的文字、图片和音视频,版权均属本网站所有,任何媒体、网站或个人需经本网站许可方可复制或转载,并在使用时必须注明来源【硅谷网】或对应来源,违者本网站将依法追究责任。
③ 注明来源为各大报纸、杂志、网站及其他媒体的文章,文章原作者享有著作权,本网站转载其他媒体稿件是为传播更多的信息,并不代表赞同其观点和对其真实性负责,本网站不承担此类稿件侵权行为的连带责任。
④ 本网站不对非自身发布内容的真实性、合法性、准确性作担保。若硅谷网因为自身和转载内容,涉及到侵权、违法等问题,请有关单位或个人速与本网站取得联系(联系电话:01057255600),我们将第一时间核实处理。
|
|
|
|