基于linux系统的文件实时备份系统
2014-03-14刘斌
刘斌
(克拉玛依职业技术学院,新疆维吾尔自治区 克拉玛依 838600)
基于linux系统的文件实时备份系统
刘斌
(克拉玛依职业技术学院,新疆维吾尔自治区 克拉玛依 838600)
本文从企业的实际需求出发,总结当前备份软件存在的一些问题,根据这些备份软件备份过程中的关键技术,设计出一种linux下基于inotify机制以及Rsync算法的文件备份软件。实现不同类型同步事件的实时触发和事件类型识别,以及系统自动完成对不同文件同步事件的相应处理。利用Rsync算法计算文件差异,减少传输数据,减轻带宽压力。
linux;inotify;rsync;文件备份
1.引言
目前数据安全对企业以及个人用户越来越重要,因此容灾和远程备份技术正成为目前研究的热点。当前linux下较成熟的文件同步软件rsync等提供了文件同步功能,但他们的问题也很明显:首先,不能实时监控文件系统来判断文件的更新变化,而只能通过守护进程或者手动的方式进行指定文件的同步;其次,未能考虑到企业中的一些特别的需求,对主机两端实时数据文件的同步没有实现;再次,传统的软件都是利用定点备份的方法,设置一个时间段,每隔一个时间段备份一次,数据实时性较低。
本文提出了一种基于文件操作时间的差异备份方法,利用linux下的inotify机制对文件进行实时监控,当用户对所监控文件进行修改后,捕获文件的变化信息,转化为程序可识别时间,对文件操作进行记录,然后利用rsync经典算法计算出差异数据,通过网路进行传输。
2.inotify机制介绍
inotify的API都使用文件描述符,这样可以将监控粒度控制到单个文件,而dnotify机制的控制粒度则为单个目录。使用文件描述符更大的优势在于对inotify的操作也可以使用read()、close()、select()等这些传统的文件操作函数。
2.1 int inotify_init(void)
创建并初始化一个inotify实例,该函数返回一个文件描述符。可以认为这个函数是打开一个inotify类型的文件并返回该类型文件的描述符。
2.2 intinotify_add_watch (int__fd,constchar *__name,uint32_t__mask)
增加监视文件(监视器),fd用于指明该文件被添加于哪个inotify实例,name用于指名该文件的路径,mask则指明了该文件所有的监控事件。该函数调用成功后返回一个监视器的描述符。
2.3 int inotify_rm_watch(int__fd,int__wd)
从fd中删除一个监视器,wd指名具体的监视器。
表1 常用的事件触发掩码
3.Rsync算法介绍
rsync是unix/linux下同步文件的一个高效算法,它能同步更新两处计算机的文件与目录,并适当利用查找文件中的不同块以减少数据传输。rsync中一项与其他大部分类似程序或协定中所未见的重要特性是镜像只对有变更的部分进行传送。rsync可拷贝/显示目录属性,以及拷贝文件,并可选择性地压缩以及递归拷贝。rsync利用由Andrew Tridgell发明的算法。rsync的算法如下:(假设我们同步源文件名为fileSrc,同步目的文件叫fileDst)
(1)分块Checksum算法。首先,我们会把fileDst的文件平均切分成若干个小块,比如每块512个字节(最后一块会小于这个数),然后对每块计算两个checksum,一个叫rolling checksum,是弱checksum,32位的checksum,其使用的是Mark Adler发明的adler-32算法,另一个是强checksum,128位的,用md5 hash算法,checksum算法定义如下:
a(k,l)=(∑Xi)mod M
b(k,l)=(∑(l-i+1)Xi)mod M
s(k,l)=a(k,l)+216b(k,l)
上面公式中,s(k,l)表示数据块Xk,...,Xl的滚动校验值,为了简化计算,M取值为216。这种校验计算公式具有一个非常关键的特性,就是后续校验值可以通过递推关系高效地计算获得。
a(k+1,l+1)=(a(k,l)-Xk+Xl+1))mod M
b(k+1,l+1)=(b(k,l)-(l-k+1)Xk+a(k+1,l+1))mod M
s(k+1,l+1)=a(k+1,l+1)+216b(k+1,l+1)
因此,给定X1,...,Xn的校验值,X1以及Xn+1,我们就可以快速地计算出X2,...,Xn+1校验值。这样,利用这种性质我们就可以高效地计算数据块连续校验值,大幅减少checksum计算量。
(2)传输算法。同步目标端会把fileDst的一个checksum列表传给同步源,这个列表里包括了三个东西,rolling checksum(32bits),md5 checksume(128bits),文件块编号。
(3)checksum查找算法。同步源端拿到fileDst的checksum数组后,会把这个数据存到一个hash table中,用rolling checksum做hash,以便获得O(1)时间复杂度的查找性能。这个hash table是16bits的,所以,hash table的尺寸是2的16次方,对rolling checksum的hash会被散列到0到2^16-1中的某个整数值。
(4)比对算法。这是最关键的算法,细节如下:
a.取fileSrc的第一个文件块(我们假设的是512个长度),也就是从fileSrc的第1个字节到第512个字节,取出来后进行rolling checksum计算。计算好的值再到hash表中进行查找。
b.如果查到了,说明发现在fileDst中有潜在相同的文件块,于是就再比较md5的checksum,因为rolling checksume太弱了,可能发生碰撞。于是还要算md5的128bits的checksum,这样一来,我们就有2^-(32+128)=2^-160的概率发生碰撞,这个值太小了可以忽略。如果rolling checksum和md5 checksum都相同,这说明在fileDst中有相同的块,我们需要记下这一块在fileDst下的文件编号。
c.如果fileSrc的rolling checksum没有在hash table中找到,那就不用算md5 checksum了。表示这一块中有不同的信息。总之,只要rolling checksum或md5 checksum其中有一个在fileDst的checksum hash表中找不到匹配项,那么就会触发算法对fileSrc的rolling动作。于是,算法会住后step 1个字节,取fileSrc中字节2-513的文件块要做checksum,go to(a).
4.系统框架图
本系统的服务端运行在linux系统下,随系统启动。主要功能模块包括inotify监控模块,控制模块,文件数据处理模块,网络通信模块,日志记录模块和异常处理模块。
控制模块:监控管理备份系统的各个模块,协调各个模块的运行。并统一管理备份系统中的日志信息和异常信息。
静态文件数据备份模块:静态文件数据备份模块主要完成对文件的完全备份。
实时文件数据备份模块:实现文件的差异备份,采用经典的Rsync算法计算出更新文件的差量数据,并通过网络传输模块完成对数据的传输。
图1 服务端结构和功能模块设计
网络传输模块:主要任务是完成服务器端与客户端的链接,并且完成对数据的传输。
日志记录模块:以特定的格式记录每个模块中的状态信息,在备份任务创建和完成以及由于某种原因中断时,记录下状态信息。
异常处理模块:负责对备份系统异常信息的处理方法。
5.静态文件备份模块流程图
静态文件备份流程详细描述:
(1)程序开始接受客户端数据;
(2)分析接受到的客户端数据对进行备份初始化;
(3)分析接受到的客户端数据,取得客户端发送来的需要备份的路径列表记录;
(4)在路径记录列表中读取到一条记录以后获取路径信息,并且将路径信息返回给客户端;
(5)若路径为文件路径,则按行读取文件的内容,将其送往发送缓冲区,之后数据通过网络发往客户端,遇到EOF后返回;
(6)判断源列表记录是否还有记录,若有则返回步骤4,若无则将结束标志发往客户端,结束数据传输;
(7)若路径为目录,则递归的读取此目录下的所有文件,将文件数据发往数据缓冲区,通过网络将数据发往客户端,若目录中没有未处理文件或者目录,则返回6。
静态文件的备份主要是在客户端设置备份的周期,若备份周期为一周,则在第一次备份完一周以后再执行一次静态文件的备份。
图2 静态文件备份模块流程图
6.实时文件备份模块
6.1 实时监控模块流程图(如图3)
6.2 实时文件备份模块中文件数据处理流程图(如图4)
实时文件备份模块中文件数据处理详细流程:
(1)等待文件更新变化的发生,从事件队列中读取事件,判断事件的类型;
(2)有新建的文件或者有复制过来的文件,则对文件内容划分数据块,放入缓冲区,并进行数据传输;
(3)读取更新文件,按照RSYNC算法计算两种校验码,并与校验码附加文件中的校验码进行对比后计算出差量数据,构建好完整的数据包后放入缓冲区,通过网络传输到客户端。基于RSYNC算法的文件内容更新步骤如下:
a.在服务器端,当为指定的文件进行监控初始化时,建立一个校验码附加文件,将原始文件filesrc平均分成大小为b字节的若干个小块Bi,针对每个数据块bi,计算出两个校验码ri和mi,即滚动校验码和MD5哈希函数,在实际的对比过程中,滚动校验码用来区别不同,而MD5哈希函数是用来确认相同。将这两个校验码和文件相关信息存储为附加校验码文件checksum.txt。
b.在有更新事件发生后,读取旧文件的checksum.txt文件中的校验列表,并为该校验列表建立哈希表,针对校验码序列,遍历新文件,按照同样的方式对新文件进行分块,从第一块开始,先计算出滚动校验码,在哈希表中查找,若有匹配,且之后计算出的MD5校验码也匹配,则将索引号组织为更新包放到缓冲区,然后后移一块,对比下一块;如果在哈希表中找不到相应的滚动校验码或者找到滚动校验码之后对应的MD5码不匹配,则表示这一块中有不同的信息,后移一个字节后分块,再计算滚动校验码,重复这样的过程直到比较完整个文件。
c.通过网络传输数据更新包。
d.在客户端,通过服务器传输过来的更新同步数据包和旧文件来构建新文件。
图3 实时监控模块流程图
图4 实时文件备份模块中文件数据处理流程图
7.系统实现
本系统服务器端采用Cent OS6.2系统,功能实现主要采用c语言和shell脚本来完成,分别实现了静态文件备份和实时文件备份。为了简化用户操作步骤,缩短用户熟练使用软件的周期,客户端采用MS windows server2003系统,用c语言集合面向对象语言c++完成了人机交互界面和相应代码程序。客户端和服务器采用soket方式连接。
8.结语
本文介绍了一种新的linux下远程文件同步模型——基于Rsunc算法的远程文件同步系统。该远程文件同步系统提高了系统运行效率和提供较高的可扩展性,弥补了当前linux下远程同步软件所存在的特殊要求不可达、带宽占用多等问题。
[1]彭勇,刘晓洁,邓洪敏.《基于差异的远程文件备份与恢复方法》[J].四川大学学报,2009.
[2]李波,朱坤.《基于局域网的数据库文件备份》[J].农业网络信息, 2007,(10).
[3]李夷苒,李涛,胡晓勤,马晓旭.《基于事件的文件备份方法研究与实现》[J].计算机工程与设计,2010,(21).
[4]林国庆,王静,陈汝伟.《基于索引的文件备份方案》[J].电子设计工程,19(19).
Real-Time Backup System Based on Linux System
Liu Bin
(Karamay Vocational&Technical College,Karamay 838600,Xinjiang)
Starting from the actual needs of enterprises,this paper summarizes the problem and the key technologies of software backup,and designs the file backup software based on the inotify mechanisms and Rsync algorithm in linux.It implements the realtime synchronization events trigger of different types and event type recognition,as well as the automatic synchronization events procession of different file.Rsync algorithm is used to calculate the file differences,to reduce the transmitting data size and the pressure of the bandwidth.
linux;inotify;rsync;file backup
刘斌,男,甘肃酒泉人,硕士,研究方向:嵌入式系统。