发明内容
本发明所要解决的技术问题是提供一种分布式文件系统中的存储数据修复结构及其修复方法,其结合底层的网络拓扑,通过一系列协议模块和软件模块提供高效的树形结构的数据恢复,不仅大大降低了数据修复的流量开销,而且使得修复过程的持续时间大为缩短。
本发明所述的一种分布式文件系统中的数据修复结构,所述分布式文件系统中数据存储采用主/从架构模式,在中心节点和从节点中都设有:
修复树生成协议模块,即STNRP:以丢失数据所属文件id作为特征码标识编码块,构建一棵StenierTree修复树,以支持编码数据的传输协议模块;
编码数据传输协议模块,即CDTP:对于每个特征码标识的编码块通信,根据修复树生成协议模块生成的修复树,同步各个叶子节点和中间节点,使得编码块由叶子节点同步传输到根结点,并在中间过程或者转发,或者做编码操作;
网络监测模块:负责更新网络各链路资源的使用情况,由adjMatrix矩阵来表示,以展现整个网络的拓扑结构,其权值表示链路上的负载情况;
编码模块:在中心节点该模块负责计算修复向量,从节点则负责在中间节点上对编码块的编码解码操作;
树形修复模块:负责根据网络的拓扑信息,构造出一棵修复树,然后将这颗树转发给STNRP协议模块。
2、一种分布式文件系统中的数据修复方法,其特征在于包括以下步骤:
1)生成修复树,其具体步骤包括:
11)中心节点运行STNR算法,根据网络拓扑结构,构造一棵再生树用于数据修复,这棵树本质上是一棵StenierTree,其保证修复带宽和流量;
12)中心节点实现stnrp_dispatch()函数,该函数通过Socket将再生树中的节点信息分发到每个从节点,包括其父节点,子节点信息以及修复系数;
13)从节点实现stnrp_rcv()函数,该函数收到中心节点的节点信息后,在本地构造修复结构,包括数据源,数据目的地以及修复系数;然后构造一个接收队列和一个发送队列,一个接收线程和一个发送线程;然后调用stnrp_ack()将结果报告给中心节点;
14)中心节点若收到节点构造失败消息,则调用stnrp_replace()函数,以stnrp_closest()函数来选择替代节点以代替再生树中构造失败的节点,接着调用stnrp_dispatch()向这些节点分发修复信息;选择替代节点的策略为:1)如果节点是参与节点,则选择离其最近的一个节点替换;2)如果节点是数据提供节点,则从提供节点集合中选取一个下一个瓶颈带宽值最大的节点;
15)实现中心节点的stnrp_monitor()函数,统计节点的反馈信息;
16)如果所有从节点都成功建立修复结构,则调用中心节点的stnrp_send(),通知再生树中所有叶子结点开始发送数据;
2)编码数据传输,其具体步骤包括:
21)以丢失数据所属文件id作为特征码标识编码块,并以id为关键字,将其映射到相应的修复管道;
22)向其父节点发送一个消息,告诉其数据开始传输;当从节点接收到数据开始传输的消息,便根据其收到的特征标识码,找到该节点上缓存的对应的修复结构,唤醒接收线程,发送线程并设置好用于同步的条件向量等参数;
23)从节点实现cdtp_rcvData()函数,该函数负责接收并编码数据,并以编码块的特征标识码,将编码后的数据放入到对应的发送队列sendQueue之中;
如果是数据提供节点,则数据源包括两部分:来自子节点的数据和存储在本地的编码块;叶子节点由于其子节点为空,所以其数据源为本地编码块;cdtp_rcvData()会每次从所有的数据源中取一个缓存块大小的数据,然后在本地进行编码,并将编码后的数据放入发送队列sendQueue之中;
如果是参与节点,则其数据源为来自孩子节点的数据,cdtp_rcvData()每次从来自所有子节点的Socket中读取缓存块大小的数据,然后在本地进行编码,并将编码后的数据放入发送队列sendQueue之中;
24)从节点实现cdtp_sendData()函数,该函数负责从发送队列sendQueue之中读取数据,然后将数据发送至目的地,cdtp_encodeData()函数主要负责对接收到的数据进行编码以得到最终生成的编码块以替换失效的编码块,如果节点是再生树中的根结点,则是数据流的终点,此时cdtp_sendData()调用cdtp_encodeData()函数,将数据在本地进行编码,得到最后生成的编码块;cdtp_ack()函数主要负责向中心节点汇报数据修复的最终结果;如果节点不是再生树中的根结点,则cdtp_sendData()函数通过Socket将数据发送至其父节点;
25)当数据发送完成之后,向其父节点发送一个传输完成的消息,根据特征标识码,发送端关闭本地的发送线程,回收发送队列等资源,接收端收到消息后,关闭对应的接收线程,回收接收队列资源;
26)数据会经历接收,编码,发送三个过程;为了保证系统的正常运行,使用锁和条件变量来保证队列的同步与互斥;这种情况下,队列为空有两种可能:数据处理完成和数据正在前一个操作中处理,为了区分这两种情况,当数据处理完成之后,认为向队列中添加一块空的数据块。这样,当队列为空时,则下一操作等待直至新的数据到达。当数据块为空的时候,则表示数据处理完成;
3)网络监测,其具体步骤包括:
31)中心节点向网络中所有节点发送其相邻节点的地址信息,新开一个监听线程,用以监听来自从节点的拓扑更新消息;
32)从节点收到中心节点的消息后,更新其保存的相邻节点列表,新开两个线程,分别用于向相邻节点发送ping消息和向中心节点报告拓扑更新消息,为了提高线程的利用率,这里采用线程池的形式来执行任务;
33)从节点向其相邻节点发送ping消息,消息格式就包含2个字段:消息类型字段和时间戳字段。消息类型表示这是一个网络探测消息,时间戳表明ping消息发送的时间点;
34)从节点接收到来自其它节点的ping消息之后,根据接收到的时间和消息中的时间戳,更新与其相邻节点的链路使用情况;
35)从节点定期向中心节点报告其拓扑更新情况,消息格式分为两部分:消息类型字段以及如果序列对;序列对有地址和试验组成,表示节点和其相邻节点链路的链路的时延值;
36)中心节点接收到来自从节点的拓扑更新消息后,便更新其adjMatrix拓扑矩阵;
4)实现编码,其具体步骤包括:
41)无论是中心节点还是从节点,都需要编码模块,来对编码数据进行分析,处理;
42)中心节点的编码模块负责对编码块的分析以及修复向量的计算;一旦确定k个数据提供节点时,再生树中的节点需要知道对这k块编码块应该怎样处理;根据修复向量的计算方法,我们需要分析如下信息:a)k块编码块对应的编码向量。b)丢失编码块的编码向量。一旦获取到这些信息,我们就可以计算出丢失编码块的修复向量;
43)从节点的编码模块负责对编码块数据的编码;由于允许数据在中间节点进行编码,所有再生树中的所有节点都需要对接收到的数据进行编码处理;如果是数据提供节点,则需要知道本地存储的以及从Socket中读取的编码块的编码策略,包括各个编码块对应的系数以及该如何对这些编码块进行编码;如果是参与节点,则需要知道接收到来自若干子节点的编码数据块时的编码策略,即这些编码块对应的系数以及该如何对接收到的编码块进行编码;
44)为了提高编码效率,我们对数据按块大小组织成数据队列;每编码完一块数据块,则将其放入发送队列,这样以一种流的形式来对数据进行编码,转发,数据块的大小在配置文件中配置;
5)树形修复,其具体步骤包括:
51)以网络拓扑矩阵adjMatrix,丢失编码块剩余的数据提供节点和选中的替换节点作为输入;
52)运行最大带宽路径算法,找到从数据提供节点到替换节点的各自最大带宽路径,取最大的k个数据提供节点作为修复过程中的数据提供节点,并得到一个瓶颈带宽最优值;
53)借鉴蚁群算法思想,分别找出步骤42)中选择的数据提供节点到替换节点的所有可行路径,并对这些路径上的边赋予新的权值,保存在ants矩阵中;在ants矩阵中,权值越低表示数据经由该条链路传输的代价越低;
54)以dijstra算法作为选路的基本算法,在步骤43)中获得的ants矩阵之上,初始化一棵StenierTree。最开始树中只包含替换节点节点。每次寻找从42)获得的数据提供节点中到StenierTree的最短路径,然后更新StenierTree,将这条路径上的链路和节点加入到StenierTree之中,直到数据提供节点集合中的节点都被添加到StenierTree之中,算法结束。
本发明在引入编码的分布式存储中,当节点失效的时候,目的节点需要从多个数据源节点来获取编码数据。由文件id标识的编码块,通过同步各个参与节点,组件一棵树形结构的修复系统,使得编码数据块能够通过中间节点进行编码,从而使得我们可以避开那些瓶颈链路的同时减少网络中的流量开销,降低数据中心的负载,增加网络的资源利用率。树形结构的修复系统由STNRP/CDTP协议模块和若干的软件模块组成。树形结构的修复系统能够在基于编码的数据修复场景下,通过构造一棵优化的StenierTree,并以一种管道流的形式对数据进行编码和转发,使得其在修复过程中的瓶颈带宽最优且尽可能的降低其产生的网络流量开销。
具体实施方式
下面结合附图对本发明进行详细说明。
图1是系统的场景图,树形修复系统采用主/从架构,有一个中心节点和若干从节点组成。每个节点都运行着本发明所设计的STNRP和CDTP协议模块以及若干软件模块。具体来说,当目的节点需要从若干数据源获取编码数据时,中心节点会运行树形修复模块来构造出一颗优化的再生树,然后将树转发给STNRP协议模块。接着STNRP协议模块同步再生树中的各个节点。接着CDTP协议模块能够负责将编码数据在中间节点上进行编码和转发,沿着再生树的结构传输至根结点。相对于忽略网络拓扑结构而直接将各个编码数据发送到目的节点,大大降低了传输的时间开销和对网络资源的占用。
图2是STNRP协议模块的流程图。当再生树构造完成时被转交给STNRP协议模块,STNRP协议模块则调用stnrp_dispatch()开始分发节点信息。发送完后开始执行stnrp_monitor()方法等待从节点的执行结果。在从节点则调用stnrp_rcv()函数来接收中心节点的修复结构构造消息,然后再本地构造修复结构,包括一个接收线程和一个发送线程以及一个接收队列,一个发送队列,接着建立该节点和子节点的数据流管道以及父节点的数据流管道。然后从节点调用stnrp_ack()将执行结果报告给中心节点。当中心节点收到来自从节点的反馈信息时,如果是构造失败,则开始选择是否有备用节点以替换构造失败的节点,如果有,则分发该节点信息(包括更新其子节点和其父节点等节点信息),如果没有,则标记为该编码块修复失败。如果是构造成功消息,则stnrp_monitor()查看是否收到了所有节点的反馈信息,如果没有则继续等待修复结构的建立完成,如果是,则调用stnrp_send()通知叶节点开始传输数据,启动修复过程。
图3是CDTP协议模块的流程图。从节点向其父节点发送数据传输开始消息,告诉其父节点激活接收线程,接收队列等。接着接收方首先判断自己是不是叶子节点,如果是,则根据中心节点发来的特征码,从本地读取数据然后发送给其父节点。如果不是叶子节点,则等待接收数据。当接收到编码数据时,提取其标识的特征码,根据其特征码放入相应的接收队列之中。然后调用cdtp_rcvData()从接收队列读取数据,当接收队列的数据达到编码要求时(来自子节点的编码数据均已到达),便读取这些数据,对之进行编码,然后根据其标识的特征码放入对应的发送队列之中。接下来cdtp_sendData()会开始发送数据。如果发送队列为空则等待。如果不为空,则从发送队列一次读取一块编码数据块,根据其特征码转发至其父节点。如果节点是根结点,则将从发送队列中读取的数据直接做本地化存储。当从节点数据发送完成时,向父节点发送数据传输完成消息,同时关闭本地的发送线程,回收发送队列等资源。
图4是STNR算法。该算法以当前网络拓扑结构,丢失编码块所属的数据提供节点以及新选的替换节点为输入,输出一棵用于数据修复的StenierTree。算法整个过程维护一棵StenierTree,初始时该树中仅包含一个节点,即编码数据的目的节点。算法的第一步便是寻找数据提供节点集合到替换节点之间的最大带宽路径。一旦确定数据提供节点集合中各个节点到替换节点的最大带宽路径之后,其各自的瓶颈带宽也就确定了。接着便是从数据提供节点集合中选取k个瓶颈带宽最大的节点,作为此次数据修复中的数据提供节点。紧接着,利用网络拓扑结构的不变性,首先寻找出这k个节点到替换节点中所有链路带宽值大于所得的瓶颈带宽值的路径,并利用蚁群算法的思想,将这些链路重新赋予权值,这个时候可以得到一个简化的网络拓扑结构图,在这个图中,所有的链路都满足带宽要求,且其链路上的权值表示编码数据经由该条链路传输所能带来的开销收益。然后借鉴传统的StenierTree的启发式算法选择编码数据的路径,从算法中可以看到选路时主要考虑2个因素:1)链路的带权和最低,这表示其传输代价越低。2)传输路径尽可能早和多的产生交汇,这样我们就可以在中间节点对数据进行编码,从来节省编码数据的传输开销。一旦传输路径选定后就把该路径上的所有节点加入到算法维护的StenierTree中,直到k个节点均加入到StenierTree中,这时候算法结束,返回这棵StenierTree。
本发明具体应用途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以作出若干改进,这些改进也应视为本发明的保护范围。