基于状态机副本管理模型的负载均衡调节方法与流程

文档序号:15981113发布日期:2018-11-17 00:20阅读:217来源:国知局

本发明涉及状态机副本管理领域,更具体地,涉及一种基于状态机副本管理模型的负载均衡调节方法。

背景技术

状态机副本管理模型smr的关键在于每个副本节点接受相同顺序的操作指令流,从而时刻处于数据一致的状态。而这个相同顺序的操作指令流是利用一致性协议算法(例如:paxos,raft)来保证,从而让系统中的每个副本节点都统一一个确定性的操作顺序。每个副本节点接受相同的操作指令并且顺序一样,那么系统中的任意时刻副本节点间都可以保证一致性。

状态机副本管理模型如图1所示,可以看到,出于一致性级别的要求,每个副本节点先对接受到的操作指令进行排序,然后执行操作。因为每个节点都是执行相同顺序的操作指令流,所以在smr中操作指令的执行过程是串行的。现如今服务器节点的多核多线程的并发能力是非常强大的,传统的串行式smr执行过程并不能充分的利用服务器节点的资源和并发能力。因此,如何在传统smr模型基础上提升并发能力便成为改善系统整体运行效率的有效解决方案。

许多研究人员对smr模型的并发能力进行了改进,主要的改进方案大致有以下几种。

1、pipelinedsmr(图2所示模型)

副本节点串行的执行相同顺序的操作指令流,但是这并没有要求整个系统的逻辑都是单线程的。比如说:服务节点利用一个线程接受操作指令,利用一个线程执行操作指令,还有一个线程用来向客户端返回执行结果。pipelinedsmr提出了管道化的机制来利用服务节点的多核多线程能力,改进了传统smr模型。但是,这种机制中实际执行命令仍然是一个线程负责,并发能力有限。

2、sequentialdelivery-parallelexecution(sdpe)

在传统的smr模型中,副本节点利用一致性协议层将操作指令排好顺序,然后再去执行。据研究,副本节点可以并发的执行那些访问不同变量的操作指令(无依赖的指令)而不会影响一致性级别。操作指令的依赖性是和应用相关的,需要由开发者来提供或者是从服务代码中自动的提取。

sdpe模型通过在副本节点上加入一个指令调度器来分发并发指令。每个副本节点的一致性排序层对操作指令排好顺序之后,指令调度器会对这些操作指令的依赖性进行检查,没有依赖性的指令便可以分配到不同的工作线程来执行,而不会产生冲突,有效的提升了系统的并发处理能力。此外,指令调度器还可以针对工作线程的工作负载情况进行平衡,负载较低的工作线程将分配多一些的指令,有效的改善系统的整体性能。

3、paralleldelivery-parallelexecution(pdpe)(图3所示模型)

pdpe在以上模型的基础上,不仅实现了操作指令执行层的并行化,而且在排序层也实现了指令分发的并行化。

相对于sdpe而言,pdpe的副本节点中并没有指令调度器,每个副本节点中有多个线程,并发的负责分发和执行互不依赖的操作指令流。为了保证正确性,一个线程的操作指令流和其他的线程的操作指令流是没有依赖性的。

在sdpe中,操作指令的依赖性是在排序后由副本节点的指令调度器来决定的。pdpe与此不同,操作指令的依赖性是在排序之前由客户端来决定的。客户端根据指令的映射关系将无依赖性的指令通过多播的形式分发到副本节点对应的线程组中,不同的副本节点中对应的线程构成一个线程组负责将该线程组接收到的操作指令进行排序,然后对应的工作线程负责执行。不同的线程组之间是并发执行的。

pdpe实现了一个全并发的模型:无依赖的操作指令可以并行的分发、排序和执行。有依赖的操作指令相关的多个线程组排序,串行化的执行。例如:一个操作指令与两个线程组有依赖,就需要多播到这两个线程组中,两个线程组对于这个依赖性指令不能并发执行,而需要同步。采取的方式是,在其中选择一个线程组来负责执行,另一个线程组等待执行线程的通知。

从上述的描述可以发现,这几种方案都是在不断的发掘命令执行的并发水平,在最大限度使得没有依赖关系的操作指令充分的并行执行,从而提升系统的整体性能。其中传统smr、pipelinedsmr都不算是并行,实际上仍然是单条线程在执行命令。sdpe做到了命令执行层面上的并行化,但是在一致性排序层面上仍然是串行的。pdpe在此基础上真正做到了排序和执行的并行化,相比较而言充分挖掘了系统的并行化能力。但是pdpe并没有考虑命令或者说请求的负载情况,在负载不均衡的情况下,pdpe的并发能力会大打折扣。



技术实现要素:

本发明在维持smr一致性要求的前提下,充分考虑近年来相关研究的成果,从客户端请求负载水平的角度,设计了一种基于状态机副本管理模型的负载均衡调节方法,能够根据客户端请求的负载情况实现动态调节,从而提升系统的整体性能。

为实现以上发明目的,采用的技术方案是:

基于状态机副本管理模型的负载均衡调节方法,包括以下步骤:

s1.副本节点记录每个线程组的请求的负载情况;

s2.在一段时间内根据请求负载的情况计算出新的映射关系;

s3.在各个副本节点上重新配置映射关系模块,使用新的映射关系来分发客户端的请求。

优选地,所述步骤s3的具体过程如下:

s11.设其中一个副本节点的映射模块被选举为映射模块组的leader;

s12.映射模块组的leader向其他副本节点发送消息m,告知系统更改的要求,当其他副本节点的映射模块接收到消息m后,便会停止分发客户请求,此后服务节点接受到的命令将会缓存在命令接受队列中;然后向映射模块组的leader发送消息m’,告知已经做好了更改新映射关系的准备;

s13.映射模块组的leader接受到了其他所有副本节点的映射模块发来的消息m’后,映射模块组的leader向下层的排序层发送一个特殊全局同步的命令,这个命令需要在系统的各个线程组中同步,然后映射模块组的leader便可以按照新的映射关系来分发客户端的请求。

与现有技术相比,本发明的有益效果是:

本发明所设计的smr机制,是基于pdpe的基础上,充分的考虑请求负载情况,以实现映射关系的动态调节,从而充分利用服务器的资源,提高系统的整体效率,将系统的并发能力发挥最大化。

附图说明

图1为状态机副本管理模型的示意图。

图2为pipelinedsmr的示意图。

图3为pdpe的示意图。

图4为将客户端的映射关系由静态改为动态的示意图。

图5为系统的模型图。

图6为映射关系更改模型的示意图。

图7为更改新映射关系的过程图。

具体实施方式

附图仅用于示例性说明,不能理解为对本专利的限制;

以下结合附图和实施例对本发明做进一步的阐述。

实施例1

pdpe存在负载不均衡的问题,从根本原因上考虑是因为客户端发送的请求就是不均衡的。这样经过proxy分发之后肯定也是不均衡的(分发的映射关系是静态的,分发结果会和客户请求的负载水平相一致。),这样就会造成一些线程的任务量非常重,而其他的一些线程任务量非常轻。这样的情况下,pdpe虽然实现了排序和执行两个层面上的并行化,但是在负载不均衡情况下的实际效果仍然不是真正的并行。此外考虑到依赖命令的处理需要全体线程组的同步处理,这就会导致情况的进一步恶化。

通过仔细观察pdpe的算法可以发现,客户端有一个静态的映射关系map,客户端proxy会根据这个方案将请求分发到指定的线程组中。当客户端的请求负载动态变化时,分发的映射关系是不会变的,这样系统的并发能力和效果也就直接由请求的负载水平所影响,没有改善的能力。

所以,为了使得pdpe方案真正变的负载均衡,使得系统整体的并发性能最大化,最根本的方法就是将请求分发的映射关系函数动态调整,使其根据当前的负载情况,把请求更为平均的分发到副本节点的各个线程组中。

如图4所示:将客户端的映射关系由静态改为动态,便可以有效的改善线程组的负载不均衡情况,最大化系统的整体并发能力。

要做到动态调整客户端proxy的请求分发方案(即map函数),需要在一段时间内统计客户端请求的负载情况,并选择新的分发方案,最终修改各个节点的方案。其中统计负载情况是很容易做到的,而选择最优的分发方案也可以参考各种负载均衡算法并根据实际情况进行最终确定。其中最复杂的是如何在分布式系统中将新的分发方案应用到各个服务节点上,使其在映射关系上一致性的分发,而不会出现映射关系不一致的情况,破坏副本状态机在一致性方面的保证便成为了最大的挑战。因此,本发明提出了基于状态机副本管理模型的负载均衡调节方法,充分的解决了这个问题,实现了系统性能的最大化。

图5所示为系统的整体模型,在每个副本节点有三个模块:

一是映射关系模块mapping,负责将客户端的请求映射到不同的线程组。在pdpe中这一模块是处于客户端中,但是为了实现映射关系的动态调节,本发明将它移动到服务端;

如图所示,每个副本节点都将(1-49)范围内的请求分发到线程组1中,将(50-99)范围内的请求分发到线程组2中。线程组1是每个node中左边的队列,线程组2是每个node右边的队列;

二是命令的排序层,负责在各个节点之间达成一致的命令顺序;

node1,node2,node3中的线程组1负责对(1-49)范围内的请求进行排序;

node1,node2,node3中的线程组2负责对(50-99)范围内的请求进行排序。

三是命令的执行层,负责确定性的执行已经排好顺序的命令。

排序层和执行层是和pdpe一样的,这里重点考虑映射关系的动态调节过程。

(1)副本节点记录每个线程组的请求的负载情况,因为不同副本节点之间相同线程组内执行的命令顺序是一样的,所以每个副本节点在执行层面记录不同的线程组的执行情况也是一致的,各线程组的请求负载可以得到。

例如:在一段时间内线程组1接受的请求数是10000,线程组2接受的请求数是5000,每个副本节点都可以记录到相同的数据,进而发现当前的映射关系并不合适,为了充分的发挥系统的能力,应该修改映射关系;

(2)在一段时间内根据请求负载的情况计算出新的映射关系。

例如发现线程组1的请求是线程组2的请求数量的两倍,这可以根据命令的执行观测到,修改映射关系将线程组1的请求分一些到线程组2中,使线程组之间的请求数均衡一些。新的映射关系可以参考现有各成熟的负载均衡算法,并且根据实际的系统来考虑。

(3)在各个副本节点上重新配置映射关系模块,使用新的映射关系来分发客户端的请求。这一环节是最为重要也是非常复杂的,因为如果映射关系的更改时机未能在副本节点间达成一致,很容易导致不同的副本节点使用不同的映射关系,从而使得同一类请求在有些副本节点分发到线程组1中,而在其他节点分发到线程组2中,因为不同线程组的执行是并发的,没有顺序方面的保证。这就导致有依赖性的指令分发到了不同线程组,违背了指令分发的原则,无法形成相同顺序的操作指令流,使得系统在一致性方面无法保证。

下面将介绍专利的核心机制,在不同副本节点中一致的使用新的映射关系。

如图6所示,为了重点说明映射模块的更改过程,简化了上文中的排序层和执行层。

在每一个服务节点中都有操作指令接受队列来接受客户端发送的命令请求,这些请求需要经过映射模块的分发才可以进入排序层排序,命令执行层执行。不同节点之间的映射模块(即图中的mapping)形成一个组,利用一致性算法例如paxos,raft对映射关系取得一致性意见。假定其中的servernode2被选举为映射模块的leader,负责更改整个系统的映射关系。

首先node2向其他副本节点发送消息m,告知系统更改的要求,当其他副本节点的映射模块接收到消息m后,便会停止分发客户请求,此后服务节点接受到的命令将会缓存在命令接受队列中。于是新接受的命令就不会继续按照旧的映射关系分发到下层的线程组中进行排序。然后向leader即node2发送消息m’,告知已经做好了更改新映射关系的准备。

当映射模块组的leader接受到了其他所有副本节点的映射模块发来的消息m’后,便知道整个系统都准备好了使用新的映射关系。于是leader立即向下层的排序层发送一个特殊全局同步的命令,这个命令需要在系统的各个线程组中同步,然后leader便可以按照新的映射关系来分发客户端的请求。这个特殊的全局同步指令会在排序层的一致性算法保证下,转发到其他各个副本节点的线程组中,而其他的副本节点在收到这个特殊的全局同步操作后,就会重新按照新的映射关系来分发客户端的请求。

在这个过程中利用特殊的全局同步操作作为旧映射关系和新映射关系的分界线,特殊全局操作之前都是旧映射关系分发的操作,特殊全局同步操作之后都是新映射关系分发的操作。保证了指令分发在依赖性方面的要求,也保证了副本状态机的安全性。从而实现了基于负载均衡动态调节以最大化系统的并发性能。

图7以时间顺序进一步展示了副本节点一致的更改新映射关系的过程。

显然,本发明的上述实施例仅仅是为清楚地说明本发明所作的举例,而并非是对本发明的实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明权利要求的保护范围之内。

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