[0027] 进一步地,所述步骤S2中所述管理节点查找到损坏数据块时, 若查找到的损坏数据块的数量大于1时,需对所有损坏数据块的优先数进行计算,其中所述损坏数据块的优先数量用以表示进行数据修复的先后顺序,所述优先数越低的损坏数据块,优先权越高,则越需要优先修复,反之修复顺序越靠后;所述优先数计算采用以下公式得到:数据块优先级=静态优先数+u1*冗余数-u2*该数据块被访问频率+u3*相关数据访问负载数,其中u1+u2+u3=100%,冗余数=该数据整体的所有纠删码-最少可以修复整个数据整体的纠删码数。
[0028] 较佳的,在计算优先级时,采用加权平衡来实现,静态优先级是由用户预先指定的,而其他影响因子需要根据系统运行状态进行动态调整,所有影响因子之和为100%,因此使资源的分配更加合理,整个修复系统也更强大与完善。其中冗余数越大安全性和数据可靠性越高,但系统的存储开销也越大;相反,冗余数越小,安全性和数据可靠性越低,相比较冗余数小的也就需要先修复。
[0029] 进一步地,所述用以修复损坏数据块的存储节点集S中的最优存储节点有多个修复损坏数据块的任务时,根据所述数据块优先数的大小进行排序,依次选择优先数小的损坏数据块进行修复;在选定修复一损坏数据块后,所述最优存储节点集S所述最优存储节点向存储节点集A请求修复所述损坏数据块所需的纠删码数据。
[0030] 较佳的,所述的存储节点获取到的相关信息包含如下内容:1.与修复该数据有关的其它纠删码所在的存储节点位置及存储地址。2.该损坏的纠删码数据块所采用的纠删码算法的一下必要参数信息。当数据被访问的频率和相关数据被访问频率越高表示该数据的重要性 越高,而该数据被损坏对整个系统产生的影响也就越大,所以它是数据修复的积极因素,对比其他长期不被使用的数据,这种数据应该尽可能的先修复保证系统的良好运行。
[0031] 进一步地,所需的纠删码数据包括进行纠删码算法所需要的k个其它纠删码信息元,当所述最优存储节点接收到存储节点集A中响应的纠删码信息元超过所需的k个时,则发送取消信号至所述存储节点集A,并采用纠删码算法对损坏数据块进行修复。
[0032] 较佳的,由于数据块采用纠删码算法进行修复,其所需要的其它纠删码信息元只是全部纠删码中的任意k个即可,所以当接收到其它存储节点的响应信息超过所需的数量的k个时就已经足够了,再接收到响应信号则发送取消信号回去,表示不需要该资源了。对于前k个其它存储节点发过来的响应信号,采用即收即发的处理方式,立即发送纠删码数据发送信号过去,要求这些存储节点把纠删码数据立即发送过来。因此当存储节点B获取到足够的k个纠删数据时,则可以调用对应纠删码数据修复算法,进行对纠删码数据的修复。
[0033] 特别的,由于考虑到可能会发生管理节点损坏的问题,这是对系统致命的打击,为了避免这种危险的发生,应该用一个节点作为管理节点的备用存储节点newControler。一方面备用节点要定时存储管理节点上新更新的信息,另一方面用心跳报文实时监控着管理节点,如果一旦管理节点发生损坏或者下线等问题,就立即启动该备用的新的存储节点作为新的管理节点,马上替代原来的管理节点成为管理者的角色。首先该新管理节点上可以通过日志可以很快恢复原管理节点 的上新的动态信息,另外新管理节点首先要通知所有的存储节点新管理节点的位置所在,使系统平稳过渡管理节点的转换。最后要为该新管理节点寻找一个新的备用节点。若备用节点损坏或下线,则管理节点,就近选一个存储节点做为备用节点,将管理信息发送给新的备用节点。
[0034] 与现有技术相比,本发明的有益效果是:
[0035] 1.本发明的分布式数据存储系统中管理节点采用授权存储节点进行辅助修复的修复策略,这个策略尽可能的调用了存储节点的资源并且大大减轻了管理节点的负载,使管理节点能够更有效的工作,专注于更重要的部分。
[0036] 2.本发明的分布式数据存储系统中管理节点授权存储节点自行修复的修复策略采用了竞争机制,尽可能充分调用各个存储节点,使大量的修复数据的过程可以并行运行,一定程度上均衡负载,提高数据自我修复的综合能力。
[0037] 3.本发明的分布式数据存储系统中管理节点授权存储节点自行修复的修复策略没有使用管理节点进行统一修复的方式,而是用分布式方式让各存储节点进行并发修复。因为统一由管理节点管理的修复方式不仅有修复上限的瓶颈困扰,而且无疑对管理节点造成相当大的负担,而分布式数据存储系统中管理节点授权存储节点的自行修复的修复策略正好能解决这两个问题,提高系统性能,并且更符合当前技术发展的趋势。
[0038] 4.本发明的分布式数据存储系统中管理节点授权存储节点自行 修复的修复策略更简化了管理节点的管理机制,管理节点不再需要为修复数据提供负责的管理,这就是分布式的一个优点,简化管理。
附图说明
[0039] 图1为基于副本的数据修复方法的示意图。
[0040] 图2为基于编码的数据修复方法的示意图。
[0041] 图3为基于路由器的数据修复方法的示意图。
[0042] 图4为本发明的方法流程示意图
[0043] 图5为管理节点检测到有5个数据块损坏的示意图。
[0044] 图6为:存储节点S1、S2、S3分别向与损坏的a、b、d数据块相关的数据块所在的节点发送数据修复请求的示意图。
[0045] 图7为接收到请求的存储节点发送回响应信号给存储节点集S中的对应存储节点的示意图。
[0046] 图8为对应存储节点接收到相应的响应信息,立刻发送数据发送请求的示意图。
[0047] 图9为存储节点S1得到修复a数据块的所需纠删码数据,调用纠删码算法对a数据块进行修复的示意图。
[0048] 图10为存储节点S1、S2、S3分别修复好数据块a、b、d,向管理节点发送该数据块修复完成信号及该数据块的相关信息的示意图。
[0049] 图11为本发明中管理节点工作流程示意图。
[0050] 图12为本发明中存储节点工作流程示意图。
具体实施方式
[0051] 下面结合附图及实施例对本发明做进一步说明。
[0052] 本实施例提供一种分布式数据存储系统的修复方法,如图4所示,具体包括以下步骤:
[0053] 步骤S1:提供一管理节点与复数个存储节点;所述管理节点用以查找所述存储节点中是否有数据损坏;所述存储节点中包括用以修复损坏数据块的存储节点集S与用以存储修复数据所需的纠删码数据的存储节点集A;
[0054] 步骤S2:所述管理节点监测查找所述分布式数据存储系统中的损坏数据块,当所述管理节点查找到损坏数据块时,采用LeDiR算法在用以修复损坏数据块的存储节点集S中为所述损坏数据块选取最优存储节点,并授权所述最优存储节点进行数据修复工作;
[0055] 步骤S3:所述最优存储节点向存储节点集A请求修复所述损坏数据块所需的纠删码数据,并为所述损坏数据分配一空间,启动所述损坏数据块的修复进程,采用纠删码算法进行修复工作;
[0056] 步骤S4:所述最优存储节点完成数据修复后,将数据修复情况发送给管理节点;若是修复成功,则将最优存储节点上数据发送给管理节点进行数据更新;若是失败,则所述最优存储节点对所述损坏数据块重新进行修复。
[0057] 在本实施例中,所述管理节点创建表T,用以记录纠删码信息元存储位置;所述管理节点创建表G。用以记录每个存储节点当前的访 问量;所述管理节点包括一用以存储损坏数据块位置的链表badList,当所述管理节点采用心跳报文对所有存储节点的状态进行检测,当检测到损坏数据块时,将存储损坏数据块的存储节点添加到badlist中。
[0058] 较佳的,所述管理节点工作流程图如图11所示,在管理节点基于纠删码找到能修复损坏数据块的存储节点时,根据表G找到一个访问量最少的节点minTag,发送损坏数据块的大小和修复损坏数据块找到的minTag节点,并创建两个线程:
[0059] 线程1:
[0060] message=receive()
[0061] if type是修复数据块的反馈信息
[0062] if message.P is success
[0063] T[message.D]=message.A
[0064] if message.P is faile
[0065] badlist.add(messeage.D);
[0066] 线程2:
[0067] //开辟数组用于存储修复损坏块纠删码信息元存储位置信息tmp;
[0068] maxPower=min(badlist);//找到优先数最小的损坏的数据块//查找所有与修复损坏块有关纠删码信息元存储位置信息for t in T
[0069] //p表示信息元是否由同一数据块划分出来
[0070] if t.p==maxPower.p
[0071] tmp.add(t)
[0072] //在不存在与损坏数据maxPower有关的集合中找到一个访问量最少的存储节点[0073] minTag=Min(G-releated(maxPower))
[0074] message={'开辟空间大小':maxPower.size,'修复损坏块纠删码信息元存储位置',tmp}
[0075] //把信息message发送到minTag
[0076] Send(minTag,message)
[0077] 在本实施例中,所述纠删码算法可记为(n,k,t,Q),用以修复损坏数据块,具体包括以下步骤:
[0078] 步骤S11:将待存入分布式数据存储系统的文件数据分为k个分片;
[0079] 步骤S12:将k个分片进行冗余编码,生成n(n>k)个冗余分片,并且将所述n个冗余分片分别存储在不同的服务器节点上;
[0080] 步骤S13:当进行修复损坏数据块时,从n个分片中选取t(k≤t
[0081] 在本实施例中,所述步骤S2中所述管理节点查找到损坏数据块时,若查找到的损坏数据块的数量大于1时,需对所有损坏数据块的优先数进行计算,其中所述损坏数据块的优先数量用以表示进行数据修复的先后顺序,所述优先数越低的损坏数据块,优先权越高,则越 需要优先修复,反之修复顺序越靠后;所述优先数计算采用以下公式得到:数据块优先级=静态优先数+u1*冗余数-u2*该数据块被访问频率+u3*相关数据访问负载数,其中u1+u2+u3=100%,冗余数=该数据整体的所有纠删码-最少可以修复整个数据整体的纠删码数。
[0082] 在本实施例中,所述存储节点工作流程图如图12所示,所述用以修复损坏数据块的存储节点集S中的最优存储节点有多个修复损坏数据块的任务时,根据所述数据块优先数的大小进行排序,依次选择优先数小的损坏数据块进行修复;在选定修复一损坏数据块后,所述最优存储节点集S所述最优存储节点向存储节点集A请求修复所述损坏数据块所需的纠删码数据。所需的纠删码数据包括进行纠删码算法所需要的k个其它纠删码信息元,当所述最优存储节点接收到存储节点集A中响应的纠删码信息元超过所需的k个时,则发送取消信号至所述存储节点集A,并采用纠删码算法对损坏数据块进行修复。
[0083] 1.算法实现代码:
[0084] struts message{
[0085] recordNum;
[0086] tpye;
[0087] head;
[0088] temp;
[0089] list;
[0090] }
[0091] //用于存储所有接收的信息
[0092] messageList;
[0093] message=receive()
[0094] head=message.head
[0095] temp=message.temp;
[0096] type=messege.type;
[0097] if type是管理节点发送修复新节点请求
[0098] size=message('开辟空间大小')
[0099] newNode=newsizeof(size)
[0100] messageList.add(message)
[0101] for t in tmp
[0102] 向t节点发送请求信息
[0103] if type是提供修复数据的节点的响应
[0104] mg=messageList.search(head)
[0105] mg.recordNum++
[0106] if mg.recordNum>k
[0107] 退出接收响应线程
[0108] send(确认发送纠删码相关信息,t)
[0109] if type是提供修复数据的节点的数据流
[0110] mg=messageList.search(head)
[0111] ifmg.list=full
[0112] //k纠删码算法修复一个节点所需最少信息元个数
[0113] 开始修复
[0114] 修复完后发反馈信息----修复的数据块D,修复情况P,该节点地址A[0115] if type是其他存储节点的修复请求
[0116] if System不忙碌
[0117] 发送响应信号
[0118] if type是修复节点要求发送数据
[0119] 根据head发送相应信息
[0120] 在本实施例中,为了更好的说明该修复方法,假设在开始数据修复工作前的背景如下:文件以纠删码的形式存储,假设有5块文件被损坏,且经过计算后5个数据块的优先级由高到低记为a,b,c,d,e;如图5至图10所示,对所述五个数据块进行修复的过程具体包括以下步骤:
[0121] (1)第一步:管理节点检测到有5个数据块损坏。
[0122] (2)第二步:根据LeDiR算法[2],管理节点为损坏的数据块分配对应的最优节点进行数据修复工作。分别是a、c数据块分配到S1存储节点进行修复,b数据块分配到S2存储节点进行修复,d、e数据块分配到S3存储节点进行修复。
[0123] (3)第三步:向存储节点S1、S2、S3发送损坏纠删码数据块的对应的相关修复信息。
[0124] 信息中包含的内容如下:
[0125] 1.修复该数据有关的其他纠删码信息所在的其他节点位置,及所在的存储地址等。
[0126] 2.该纠删码修复算法所必需的参数信息,由该具体的修复算法所决定。
[0127] (4)第四步:存储节点S1、S2、S3接收到管理节点M发送的信息后,开始进行各自的数据修复。
[0128] (5)第五步:经计算,存储节点S1中a数据块的修复工作的优先权高于c数据块的修复工作,所以a数据块的修复工作先进行。同理,存储节点S3中d数据块修复工作的优先权高于e数据块修复工作,d数据块先修复。
[0129] (6)第六步:存储节点S1、S2、S3分别向与修复a、b、d数据块相关的数据块所在的存储节点节点发送数据修复请求。
[0130] (7)第七步:存储节点集A中如果有某个节点Ai被多个需要进行修复工作的节点请求数据,按先到先响应的规则,后到的则进入请求等待。
[0131] (8)第八步:接收到请求的存储节点Ai发送响应信号给存储节点集S中的对应存储节点。
[0132] (9)第九步:存储节点S1、S2、S3收到节点集A中各个存储节点响应,收到一个响应则立刻再发送一个“数据发送信号”过去,令其可以发送纠删码数据块。假设由于a数据块的修复只需k个纠删码的数据块即可,当接收到第k+1个响应信号时则发送取消信号回去。S2、S3同理。
[0133] (10)第十步:存储节点S1得到修复a数据块的所需纠删码数据,则调用对应的纠删码算法,对a数据块进行修复工作。S2、S3同理。
[0134] (11)第十一步:当存储节点S1修复好a数据块后,发送完成信号及a数据块的一些相关信息给管理节点M,以方便管理节点进行管理。S2、S3同理。
[0135] (12)第十二步:存储节点S1、S3分别开始修复数据块c,e。类似重复修复步骤的第六步至第十一步。
[0136] 以上所述仅为本发明的较佳实施例,凡依本发明申请专利范围所做的均等变化与修饰,皆应属本发明的涵盖范围。