摘 要:随着互联网络飞速发展,数据量呈现海量增长,单机存储无法满足需求,分布式存储应运而生并且取得了较大的发展。系统中的数据由于自然灾害、异常故障等原因会遭到破坏,因而需要对数据进行备份加以保护。以基于分布式文件服务器的存储备选份恢复系统为研究对象,探讨了分布式存储下海量数据备份恢复的关键问题:存储备份恢复的高效性、一致性和可靠性。
关键词:备份;存储;分布式;p2p;技术
1 存储与备份技术的高效性
1.1 高性能多源下载过程
(1)服务器根据相关信息返回存储需要下载文件的slave的具体信息;(2)根据文件大小和slave的负载状态,选择合适的slave建立socket连接对文件进行分块下载;(3)下载完成后把各个文件块合并成为原始文件。
1.2 静态下载
在静态下载中,不考虑备份文件的大小,服务器的负荷量,采取统一的模型进行下载。算法如下:(1)得到备份文件所在服务器的个数n,以及每个服务器的ip地址和端口号;(2)得到文件的总大小size,按照文件分割算法,把文件分割为n块;(3)与每个服务器建立连接,从每个服务器上下载一块文件;(4)下载完成后,把所有文件块合并成一个完整的文件,存储在备份介质上;(5)保存备份文件的相关元数据信息;(6)文件下载、备份完成。www.133229.COm
1.3 动态下载
在动态下载模型中,要综合考虑各方面因素,动态决定文件是否分块进行多源下载,以及文件块的大小,提高系统资源利用率,进而提高备份效率。对于没有冗余的文件,只能从一个节点上下载。对于较小的文件,使用单线程下载;对于较大的文件,可以采用多线程下载。对于有多个冗余的文件,可以动态选取从负荷量较低的节点进行下载。伪算法表示如下:
首先定义如下变量:文件大小阀值tl,当文件大小大于tl时采用多源下载;节点标准负荷t2,若节点负荷大于t2,则节点处于重负荷状态;文件大小size文件冗余数n。
算法表示如下:
if(文件没有冗余)
{
无须分块下载,可以采用多线程从存储文件的节点上下载文件;
}
else{
if(文件大小size<阀值t1)
{
无须多源下载,从存储文件的节点中选取负荷最小的节点,下载文件;
}
elsel
得到存储文件的n个节点的信息;
从n个节点上选择负荷小于阀值t2的节点,节点数目为m;
利用文件分割算法把文件分割为m块;
与选中的m个节点建立连接,从每个节点上下载一个文件块;
下载完成后,把m个文件块合并成为完整的文件;
把文件存储在备份介质;
}
}
2 存储与备份技术的一致性
2.1 锁和快照技术
锁就是当进行数据备份时,对需要备份的数据加锁,此时禁止对数据进行修改。由于备份时禁止对数据的修改,锁技术对数据的可用性会造成一定的影响,会影响到系统的效率。快照就是在相当短的时间内生成原存储系统的瞬时映像,该映像生成之后,备份就可以根据该映像来进行,而不用担心数据的不一致性。快照技术的实现有两种方式:更新复制方式和split-mirror方式。更新复制技术就是当进行快照时,并不立刻复制数据,只有当数据发生变化时才进行复制。split-mirror是使用和主存储系统一样的快照存储系统,数据同时保存在主存储系统和快照系统,此时快照系统就可作为备份数据。
2.2 在线备份
在分布式文件访问平台中,存在着海量的文件,文件的信息较多,若把文件的信息逐个复制则要浪费大量的时间、空间,对系统的可访问性造成影响。wafl文件系统使用了更新复制技术。当创建系统快照时,并不立刻复制所有文件信息,而是创建新的快照根节点,它与原文件系统根节点有相同的信息,文件系统中根节点的子节点也为快照根节点的子节点。此时以快照根节点为根节点生成了一棵快照树,它和原文件系统树除了根节点以外,其余部分相同。当文件信息需要修改时,创建新的节点,把文件信息赋给此节点,并把节点作为快照节点插入快照树中,同时修改原节点的信息,具体分为以下情况:
(1)修改文件信息:当对文件的基本信息进行修改时,如更改文件名称等,此种情况下比较简单,伪算法如下:
if修改文件)
{
创建新的节点作为快照节点;
把原节点的信息复制到快照节点;
把快照树中指向原节点的指针指向快照节点;
快照节点儿子节点的指针指向原节点的儿子节点;
修改原节点的信息;
}
修改文件信息具体过程如图3:
(2)移动文件:当把文件或者目录从一个目录移动到另外一个目录下时,具体伪算法如下:
if移动文件)
{
创建新的快照节点;
把原节点的信息复制到快照节点;
复制原父目录的信息,添加到快照树中;
把快照树中指向原节点的指针指向快照节点;
快照节点儿子节点的指针指向原节点的儿子节点;
复制新父目录的信息,修改子节点,添加到快照树中;
修改原节点的信息,把原节点移动到新的目录下;
}
移动文件过程如图4所示:
(3)新建文件:当新建文件时,具体伪算法如下:
if(新建文件)
{
创建新的节点,并给节点赋予相应的文件信息;
在文件系统树中找到节点的父目录;
if(若父目录己经创建了副本),
{
把创建的节点插在文件系统树中父目录节点下;
}
else{
父目录创建副本;
副本赋予相应的信息;
父目录副本儿子节点即为父目录的儿子节点;
快照树中指向原来父目录的指针指向副本;
新建节点插在文件系统树中父目录节点下;
}
}
新建文件过程如图5所示:
2.3 备份的实现
在创建好快照树之后,就可以进行在线备份。快照树保存的信息就是开始备份瞬间所有文件的信息,进行在线备份时,首先从快照树的根节点开始,逐个访问节点,按顺序对快照树进行遍历、备份,保证了数据的一致性,并且可以在备份的同时允许对数据进行修改,不影响用户的访问。
3 存储与备份的可靠性
在分布式系统中存储着海量的数据,数据量大,备份的时间较长,在备份的过程中可能会出现错误情况或者发生意外的中断。因此备份过程中需要随时记录备份的进度,这样在备份发生错误或者异常时,下次备份能够在上次备份的出错点继续进行,实行断点备份,而不用重新开始备份。断点备份过程中,使用日志表来记录备份过程,把每次备份的信息写入日志表。日志表如表1:
3.1 伪算法
if(日志表为空)
{
无须查找断点位置,直接开始备份,备份时把每一个文件的备份信息添加
到日志表;
}
else{
while(日志表尚未查找完毕)
{
对于表中每一项,查找此项对应文件在树中的具体位置;
if(此文件尚未备份完成)
记录此文件,即为断点位置;
}
当日志表查找完成后,即可得到未备份完成的文件;
从断点位置开始继续备份,并把文件备份信息添加到日志表;
}
本次备份完成后把日志表清空
名称定义
id文件独一无二的id
type备份类型,可以是完全备份、增量备份、差量备份
stary_time开始备份时间
finished是否完成
isfolder是否为文件夹
parentid文件父节点id
3.2 算法复杂度
若日志表中的记录个数为k,文件总数为n。则对于每一个记录项,要查找其在文件树中的位置,当前一个记录项查找到时,由于遍历的顺序性,后一个记录项可以从前一个的位置继续向后查找,这样,可以保证k个记录项查找次数为k,也即为o(n)。当备份发生错误或者中断时,通过此算法,能够在相当少的时间内,找到断点位置,下一次备份时可以直接从断点位置继续进行,实现断点备份,保证了备份的可靠性。
参考文献
[1]牛云,徐庆.数据备份与灾难恢复[m].北京:机械工业出版社,2007.
[2]张联峰,刘乃安,张玉清.p2p技术[j].计算机工程与应用,2007,(12).
[3]刘天时,赵正.一种通用数据库数据整理方法[j].计算机工程,2007,(2).
[4]韩德志,谢长生,李怀阳.存储备份技术探析[j].计算机应用研究,2006,(5).
[5]谢川.数据备份技术的初探[j].中国科技信息,2006,(12).