一种基于Raft协议的分布式存储系统中日志项的分发方法与流程

文档序号:35135632发布日期:2023-08-16 18:44阅读:19来源:国知局
一种基于Raft协议的分布式存储系统中日志项的分发方法与流程

本发明涉及分布式存储领域,具体涉及一种基于raft协议的分布式存储系统中日志项的分发方法。


背景技术:

1、随着电子计算机硬件设备的不断升级,以大数据、云计算以及物联网等为代表的互联网技术得到了快速发展,全球数据量迎来了指数式爆炸增长。传统的单机存储或集中式存储系统通过纵向升级的方式提高自己的存储容量以及存取速度。纵向升级在容量上可以体现为通过增加存储设备或采用磁盘阵列的方式来提升容量,在存取速度上表现为将速度较慢的机械硬盘更换为存取速度更快的固态硬盘等,但是纵向升级总会在某个时期迎来瓶颈,长期得不到进一步的发展。因此,面对全球呈指数式增长的数据量,传统的单机存储或集中式存储在存储性能和存储容量迎来了瓶颈,难以满足在数据快速增长背景下应用对数据存储的需求。

2、分布式存储技术在这个背景下应运而生,相比于集中式存储,分布式存储可以通过水平扩展的方式增加系统的容量,达到存储海量数据的目的,同时也可以在用户对系统进行读写请求时将压力分散到系统中不同的节点中,提高分布式存储系统整体的性能,实现系统的负载均衡。分布式存储系统还可以通过将数据备份到不同节点上来实现对数据的异地容灾备份,预防单节点故障带来的数据丢失等问题,提高了数据的安全性、系统的可靠性以及可用性。分布式存储系统在带来上述优于传统集中式存储的优点的同时,也会存在其自身的一些缺陷,比如在实现异地容灾时将数据的多个副本保存在了不同节点上,如何保证这些副本的数据一致性是分布式存储系统的一个关键问题。

3、paxos和raft是在分布式领域解决数据一致性问题应用最广泛的两个算法。raft在增强可理解性的同时,在性能、可靠性、可用性等方面也不输于paxos。raft是一种基于日志复制实现数据一致性的算法,算法中节点角色分为领导者、跟随者和候选者;具体说明如下:

4、领导者:数据一切以领导者为准,它也是与客户端交互的唯一角色,处理请求,管理日志的复制,同时还不断地发送心跳信息给跟随者,不断刷新跟随者节点的超时时间,以防跟随者发起新的选举。

5、跟随者:在不发生选举时,仅默默地处理来自领导者发送的消息,充当数据冗余的作用,当领导者心跳超时,跟随者会在经过随机超时时长后成为候选者。

6、候选者:成为候选者之后,就会向其它节点发送请求投票消息,以获取其它节点的投票,如果获得了半数以上选票,则当选领导者。

7、在raft协议中,当一个日志项被领导者复制到系统中的一半以上节点时领导者就可以对该日志项进行提交并执行其中包含的指令。由于raft强领导的特性,在分布式存储系统中节点数量增多时会为领导者节点带来巨大的日志分发开销,领导者节点需要更多的时间来将日志项分发到集群中的其它节点来对日志项进行提交,导致集群对外界请求响应能力降低并带来性能下降的问题,从而限制分布式存储系统的水平扩展。


技术实现思路

1、本发明所要解决的技术问题是:提出一种基于raft协议的分布式存储系统中日志项的分发方法,解决现有基于raft协议的日志项分发方案在集群中节点数量变多时领导者节点需要更多的时间来将日志项复制到集群中的跟随者节点,导致的集群对外界请求响应能力降低带来的性能下降的问题。

2、本发明解决上述技术问题采用的技术方案是:

3、一种基于raft协议的分布式存储系统中日志项的分发方法,用于实现基于raft协议的分布式存储系统中的领导者节点向跟随者节点分发日志项,该方法包括以下步骤:

4、s1、领导者节点向系统集群中所有跟随者节点发送仅携带心跳信息的附加日志请求,以重置跟随者节点的选举超时计时器;

5、s2、领导者节点根据所有跟随者节点中存在的最大日志项索引,对所有跟随者节点进行排序,获得排序序列;

6、s3、领导者节点根据所述排序序列,为所有跟随者节点指定在本轮心跳函数中进行日志复制的优先级,获得优先级队列;

7、s4、领导者节点根据优先级队列中的各跟随者节点的优先级,计算各跟随者节点在本轮心跳周期中的日志项分发数量;

8、s5、领导者根据计算获得的各跟随者节点在本轮心跳周期中的日志项分发数量,发送携带相应数量的日志项的附加日志请求给对应跟随者节点。

9、进一步的,步骤s2中,所述对所有跟随者节点进行排序,包括:

10、对所有跟随者节点,按照节点的最大日志项索引值的大小,进行升序排序,最大日志项索引值越大,则与领导者节点的日志同步程度越高,最大日志项索引值越小,则与领导者节点的日志同步程度越低。

11、进一步的,步骤s3中,所述领导者节点根据所述排序序列,为所有跟随者节点指定在本轮心跳函数中进行日志复制的优先级,获得优先级队列,包括:

12、首先,指定排序序列中第n个跟随者节点为最高优先级;其中,n为排序序列长度,即序列中跟随者节点的个数,floor()为向下取整函数;

13、然后,指定从该第n个跟随者节点开始到最大日志项索引值最高的跟随者节点的优先级依次递减;

14、最后,指定从排序序列中与该第n个跟随者节点相邻且最大日志项索引值较低的跟随者节点到排序序列中最大日志项索引值最低的跟随者节点的优先级依次递减;

15、从而获得优先级从高到低的优先级队列。

16、进一步的,步骤s4中,所述领导者节点根据优先级队列中的各跟随者节点的优先级,计算各跟随者节点在本轮心跳周期中的日志项分发数量,包括:

17、s41、初始化领导者节点在本轮心跳周期剩余可进行分配的日志项数量为load,load=loadnum,loadnum为领导者节点在一轮心跳函数中可以分配给所有跟随者节点的日志项的数量;

18、s42、从所述优先级队列中依次取出跟随者节点进行日志项分配:

19、假设当前进行日志项分配的跟随者当前的索引值为index,若load≥(leaderindex-index),则为该跟随者节点在本轮心跳中分配(leaderindex-index)个日志项,然后更新load=load-(leaderindex-index);leaderindex为领导者节点当前的日志项最大索引值;

20、若load<(leaderindex-index),则为该跟随者节点在本轮心跳中分配load个日志项,然后更新load=0,领导者节点结束日志项分配;

21、s43、判断是否满足:load>0且优先级队列不为空,若是,则返回步骤s42,否则,领导者节点结束日志项分配,进入步骤s5。

22、进一步的,该方法还包括步骤:

23、s6、对步骤s2中获得的排序序列划分为节点数量相同的委托者分组和接收者分组;其中,委托者分组中的节点与领导者节点的同步程度较高,接收者分组中的节点与领导者节点的同步程序较低;

24、s7、领导者节点委托所述委托者分组中的节点对所述接收者分组中处于同一对应位置的节点进行日志项复制。

25、进一步的,步骤s6中,所述对步骤s2中获得的排序序列划分为节点数量相同的委托者分组和接收者分组,包括:

26、若排序序列中的节点数量为偶数,则直接将排序序列中排序在前一半的跟随者节点划分至接收者分组,将排序序列中排序在后一半的跟随者节点划分至委托者分组;

27、若排序序列中的节点数量为奇数,则舍弃排序序列中最中间的节点后,再将排序在前一半的跟随者节点划分至接收者分组,将排序在后一半的跟随者节点划分至委托者分组。

28、进一步的,步骤s7中,所述领导者节点委托所述委托者分组中的节点对所述接收者分组中处于同一对应位置的节点进行日志项复制,包括:

29、领导者节点按序从委托者分组中取出一个委托者节点,并从接收者分组中相应位置取出一个接收者节点,若该委托者节点中委托者日志项索引indexconsignor大于接收者节点中接收者日志项索引indexreceiver,则委托所述委托者节点对所述接收者节点进行日志项复制。

30、进一步的,委托所述委托者节点对所述接收者节点进行日志项复制,具体包括:

31、领导者节点为委托者分组和接收者分组中的每一个跟随者节点设定一个委托复制窗口,每个跟随者节点的委托复制窗口中保存了领导者节点在之前的心跳周期中向其它跟随者委托复制日志项给该跟随者节点的记录;

32、在领导者节点对委托者节点进行委托复制时,根据接收者的委托复制窗口中的记录以及委托者节点的日志状态以及接收者的日志状态计算委托者节点需要发送的日志项的起始索引以及结束索引,并登记在该接收者的委托复制窗口中,然后向委托者节点发起委托复制请求;

33、委托者节点在接收到来自领导者节点的委托复制请求后,携带本次领导者节点委托的相应日志项向对应接收者发起请求并将日志项复制到接收者中。

34、进一步的,所述委托复制窗口中的记录内容为[本次委托的起始索引startindex,本次委托的结束索引endindex,领导者本次委托时的领导者任期term,委托者节点helper,接收者节点receiver,领导者本次委托时的心跳节拍ticks。

35、进一步的,所述根据接收者的委托复制窗口中的记录以及委托者节点的日志状态以及接收者的日志状态计算委托者节点需要发送的日志项的起始索引以及结束索引,并登记在该接收者的委托复制窗口中,然后向委托者节点发起委托复制请求,具体包括:

36、a、领导者节点判断接收者节点此时委托复制窗口是否存在记录,若是,则进入步骤c,否则,进入步骤b;

37、b、设置startindex=indexreceiver+1,endindex=indexreceiver+min(indexconsignor-indexreceiver,systemmaxloadinoneheartbeat),

38、receiver=nodereceiver,helper=nodeconsignor,ticks=nowticks,term=nowterm,

39、其中,systemmaxloadinoneheartbeat为委托者节点在一次委托复制中可以传输的日志项的最大数量;nodereceiver为接收者节点,nodeconsignor为委托者节点,nowterm为领导者节点当前任期,nowticks为领导者节点当前任期中当前的心跳;

40、然后,领导者节点将记录[startindex,endindex,term,helper,receiver,ticks]追加到接收者节点nodereceiver的窗口中,并委托委托者节点nodeconsignor对接收者节点nodereceiver进行日志项索引为startindex到endindex之间的日志项的复制,结束本流程;

41、c、查看接收者节点此时委托复制窗口中的第一项记录[startindex,endindex,term,helper,receiver,ticks],若领导者当前任期nowterm等于term且领导者当前心跳节拍nowticks-ticks大于overtimeticks,或者,领导者当前任期nowterm大于term且nowticks大于overtimeticks,则判定该记录已经超时,进入步骤e,否则,进入步骤d;

42、d、领导者节点遍历接收者节点nodereceiver的委托复制窗口中的记录并得到其中所有记录中entindex的最大值endindexmax,若indexconsignor大于等于记录中的endindexmax,进入步骤g,否则,结束本流程;

43、e、判断indexconsignor是否大于等于记录中的endindex,若是,则进入步骤f,否则,结束本流程;

44、f、领导者节点将该记录从接收者nodereceiver的委托复制窗口中移除,然后更新helper=nodeconsignor,term=nowterm,ticks=nowticks,然后将该记录重新插入到接收者nodereceiver的委托复制窗口中,并委托nodeconsignor对接收者节点进行日志项索引为startindex到endindex之间的日志项的复制,结束本流程;

45、g、令startindex=endindexmax+1,endindex=endindexmax+min(indexconsignor-endindexmax,systemmaxloadinoneheartbeat),

46、receiver=nodereceiver,helper=nodeconsignor,ticks=nowticks,term=nowterm,

47、然后,领导者节点将记录[startindex,endindex,term,helper,receiver,ticks]追加到接收者nodereceiver的窗口中并委托nodeconsignor对接收者节点进行日志项索引为startindex到endindex之间的日志项的复制,结束本流程。

48、本发明的有益效果是:

49、(1)采用了基于动态优先级分配的日志分发机制:在每一轮日志分发前,领导者节点根据所有跟随者节点中存在的最大日志项索引,计算对各跟随者节点在本轮心跳函数中进行日志复制的优先级,进而确定各跟随者节点在本轮心跳周期中的日志项分发数量;

50、领导者通过这种动态优先级将每一轮心跳中有限的日志项分发数量优先分配给影响领导者对未提交日志项进行提交的跟随者节点,即与领导者自身日志同步程度高的跟随者节点,从而能够尽快满足日志项提交的要求,提高系统对外部请求的响应速度;

51、(2)在基于动态优先级分配的日志分发机制的基础上采用了基于窗口流水线的日志分发委托机制:在领导者每一次心跳函数进行日志分发这个过程中,委托日志同步程度较高的跟随者节点对日志同步程度较低的节点进行一次指定区间日志的复制,从而将部分领导者对跟随者进行日志复制的压力转移到同步程度较高的跟随者节点中,使得领导者节点能够加速集群中所有节点日志趋于一致的时间,每个节点都能更快实现在本节点状态机中所维护的数据一致,系统的可靠性也就越高。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1