用于分布式系统的负载均衡及高可用性子系统及方法
技术领域
本发明涉及分布式系统领域,尤其涉及一种用于分布式系统的负载均衡及高可用性子系统及方法。
背景技术
在大多数分布式系统中,都会涉及到大量用户并发访问某一个资源的情况,此时如果该资源集中在一台服务器上,那么显然这台服务器将承受巨大的压力。这种情况下这台服务器的CPU、内存和I/O系统很快会达到性能上限,最终会成为系统的性能瓶颈。由于单台服务器无论如何提升其硬件配置始终存在性能上限,如果用户并发规模持续扩大,单台服务器显然无法满足不断扩大的并发规模。而只有采用服务器集群方式才能有效性根据并发规模动态调整集群规模,最终解决上述问题。
服务器集群是一个由多台服务器组成的分布式系统,如果大量用户并发访问集群上的某一个资源,显然这个资源是被分布在集群中的多台机器上的,那么就会出现两个问题。第一,如何将大量用户并发进行分流,即负载均衡。第二,分布式系统中可能出现集群中的部分服务器无法继续提供服务,而另一部分服务器能够接替其工作,即高可用性。
其中一种方法所采用的实现方式是在服务端加上一个中央控制系统,即所有用户并发请求均先分发到中央控制系统上,再由中央控制系统根据集群中各个服务器的动态权值和当前服务器的运行状况进行分流。
如果采用上述处理方式就会存在以下问题。首先,由于所有用户并发请求均先分发到中央控制系统上,那么中央控制系统可能出现性能瓶颈;其次,中央控制系统要处理大量并发计算动态权值,就需要用到动态权值的锁同步等并发同步策略,会降低系统的并发能力,如果遇到所选服务器宕机需要重新同步计算;最后,无论分流过程开销多么小,当大量并发存在的情况下都会导致用户请求的执行时间较长,影响用户体验。
其中另一种方法是在服务端根据集群中服务器的权值设置,根据权值在中央控制系统中生成一个轮流执行各个服务器的排程表或者根据权值生成一个随机执行各个服务器的排程表,这个排程表中包含了所有排程次序,通过排程表分流大量用户的并发请求。
如果采用上述处理方式就会存在以下问题。首先,排程表是在中央控制系统中,也就是说中央控制系统需要协调各个客户机请求的执行;其次,协调各个客户机请求需要消耗中央控制系统的资源,可能导致瓶颈的出现;最后,当有服务器宕机或加入新的服务器时,排程表需要考虑前一次的排程情况来重新生成排程表。
发明内容
本发明要解决的技术问题是:提供一种用于分布式系统的负载均衡及高可用性子系统及方法,实现分布式系统的负载均衡和高可用性。
本发明为解决上述技术问题所采取的技术方案为:
用于分布式系统的负载均衡及高可用性子系统,其特征在于:它包括至少2个服务提供者模块A30、注册中心模块A10和至少一个客户端模块A20;其中
每个服务提供者模块A30包括服务注册模块A31、概率分布计算服务模块A32、服务模块A33和服务权值计算模块A34;服务权值计算模块A34用于服务提供者模块启动时计算服务提供者的服务能力,即服务权值;概率分布计算服务模块A32用于在服务提供者注册时,获取当前时刻其它提供相同服务的服务提供者的信息,并计算此类服务的服务提供者概率分布;服务注册模块A31用于当服务提供者提供服务时向注册中心模块A10注册;服务模块A33用于提供服务;
注册中心模块A10包括统一命名服务模块A11、消息通知服务模块A12和服务提供者列表模块A13;统一命名服务模块A11用于在服务提供者注册时,根据服务名生成一个集群内唯一的服务路径供客户端A20查找;服务提供者列表模块A13用于存储每个服务所对应的服务提供者列表和服务提供者概率分布;消息通知服务模块A12用于在高可用性模块A23重新选择一个可用的服务提供者时,将对应的新服务提供者概率分布通知给所有客户端模块A20和所有服务提供者模块A30;
客户端模块A20包括注册中心连接器A21、负载均衡模块A22、高可用性模块A23和调用服务模块A24;注册中心连接器A21用于连接注册中心模块A10,根据所需要的服务依据统一命名服务模块A11生成的服务路径,从服务提供者列表模块A13中获得对应的服务提供者列表和服务提供者概率分布;负载均衡模块A22用于根据服务提供者概率分布进行负载均衡计算,随机选择一个服务提供者;调用服务模块A24用于在负载均衡模块A22选择的服务提供者可用时,调用对应服务提供者模块A30的服务模块A33;高可用性模块A23用于在负载均衡模块A22选择的服务提供者不可用时,重新选择一个可用的服务提供者,并重新计算此服务对应的新服务提供者概率分布。
利用上述用于分布式系统的负载均衡及高可用性子系统实现负载均衡及高可用性的方法,其特征在于:它包括以下步骤:
A、服务提供者模块首先计算自身的服务权值,并将自身能够提供的服务和服务权值注册到注册中心模块,在注册时获取当前时刻其它提供相同服务的服务提供者的信息,并计算此类服务的服务提供者概率分布;
B、注册中心模块将服务提供者模块注册的服务,以命名树的结构进行统一命名服务,并存储每个服务所对应的服务提供者列表和服务提供者概率分布;
C、客户端模块根据自己要获得的服务名称,连接注册中心模块查询并获取对应的服务提供者列表和服务提供者概率分布,并通过负载均衡算法根据概率分布随机选择一个服务提供者;
D、如果服务提供者可用则直接调用服务模块;如果服务提供者不可用则通过高可用性算法选择可用的服务提供者,同时更新服务所对应的服务提供者列表和服务提供者概率分布;
E、更新的服务提供者概率分布由注册中心模块通知给所有客户端模块和所有服务提供者模块。
按上述方法,所述的服务提供者模块计算自身服务权值的具体公式为:
其中W为权值结果,n为权值因子的总数,Ci为第i个服务提供者模块的权值当前值,Si为第i个服务提供者模块的权值比较基准,Pi为第i个服务提供者模块的权值因子,各个权值因子的总和为1;权值比较基准和权值因子由用户设定,权值当前值以实际为准。
按上述方法,选择CPU的主频、内存大小、硬盘大小和网络带宽作为权值因子的项。
按上述方法,服务提供者模块计算服务提供者概率分布时,从服务提供者列表模块中获得所能够提供此类服务所对应的当前的服务提供者列表,以此计算概率分布;
至少2个服务提供者模块分别计算概率分布时,采用排队同步的操作过程,即多个并行的服务提供者模块在获取当前的服务提供者列表过程中,由最先抢到当前的服务提供者列表的服务提供者模块进行计算,由注册中心模块阻塞其它服务提供者模块,直到所有服务提供者模块均完成概率分布计算。
按上述方法,第i个服务提供者模块计算某类服务对应的服务提供者概率分布时,按如下公式:
其中,Wi为第i个服务提供者模块的权值,Qi为第i个服务提供者模块提供该服务的概率即其服务权值占所有该服务的权值总和的比率;
第i个服务提供者模块的服务提供者概率分布用Ri表示,
其中n表示服务提供者模块的数量,I为正整数。
按上述方法,负载均衡模块产生一个均匀发生的随机数x,x∈[0,1],令x=Ri,从服务提供者列表模块中获取Ri对应的服务提供者模块。
本发明的有益效果为:
1、采用本发明系统及方法能够实现分布式环境下的服务资源的负载均衡,并且能够支持在服务器宕机或增加新的服务资源时的对客户请求透明处理,从而达到高可用性。
2、采用本发明系统及方法所提供的注册中心服务,可以避免客户端直接访问服务提供者模块,造成当发生服务宕机时客户端需要知道处理细节,从而使整个客户端访问提供者模块完全透明;客户端在选择服务提供者模块提供服务的过程完全在客户端本地进行,避免了有中央控制系统控制分流时所产生的一系列问题。
3、服务提供者模块在准备提供服务的时候只需向注册中心模块注册,保证了能够在运行期动态的增加服务节点的能力;同时服务提供者模块在注册过程中通过注册中心模块获得了服务提供者列表及各个权值后经过计算获得概率分布,重新更新到注册中心,可以避免中央控制系统中的同步操作及要考虑前面的执行次序等问题。
4、在客户端选择服务提供者模块提供服务的过程中如果发现服务提供者模块宕机,则会更新注册中心模块的服务提供者列表和概率分布,并通知所有正在与注册中心模块连接的客户端准备更新服务提供者列表和概率分布,避免其它客户端继续选择宕机的服务提供者模块。
5、注册中心模块以统一命名方式管理服务命名,可以有效防止资源命名冲突。
6、服务提供者模块注册、客户端发现服务宕机均以事件通知异步模式处理,避免了同步协调从而提高了系统的性能。
附图说明
图1为本发明一实施例的结构框图。
图2为本发明一实施例的控制流程图。
具体实施方式
下面结合具体实例与附图对本发明做进一步说明。
本发明系统及方法的核心思想是,将原有的多个并发客户端请求合理分流到不同的服务提供者模块执行的思路,转变为客户端根据服务提供者模块的服务能力(即服务权值)高低所产生的概率分布,由客户端随机选择,最终随着客户端并发规模的变大,随着调用次序的增多其能力高的服务提供者模块自然被选择的多,能力低的自然被选择的少,符合自然统计规律。其核心流程是:首先,由服务提供者计算自身权值,再注册到注册中心;然后客户端会从注册中心获得服务提供者的权值分布概率;最后,客户端通过负载均衡算法选择一个服务端,若服务端不可用则通过高可用性算法重新选择服务端;最终,完成客户端对服务提供者的服务模块的调用。
图1为本发明一实施例的结构框图,它包括至少2个服务提供者模块A30、注册中心模块A10和至少一个客户端模块A20;其中
每个服务提供者模块A30包括服务注册模块A31、概率分布计算服务模块A32、服务模块A33和服务权值计算模块A34;服务权值计算模块A34用于服务提供者模块启动时计算服务提供者的服务能力,即服务权值;概率分布计算服务模块A32用于在服务提供者注册时,获取当前时刻其它提供相同服务的服务提供者的信息,并计算此类服务的服务提供者概率分布;服务注册模块A31用于当服务提供者提供服务时向注册中心模块A10注册;服务模块A33用于提供服务;
注册中心模块A10包括统一命名服务模块A11、消息通知服务模块A12和服务提供者列表模块A13;统一命名服务模块A11用于在服务提供者注册时,根据服务名生成一个集群内唯一的服务路径供客户端A20查找;服务提供者列表模块A13用于存储每个服务所对应的服务提供者列表和服务提供者概率分布;消息通知服务模块A12用于在高可用性模块A23重新选择一个可用的服务提供者时,将对应的新服务提供者概率分布通知给所有在线的客户端模块A20和所有在线的服务提供者模块A30;
客户端模块A20包括注册中心连接器A21、负载均衡模块A22、高可用性模块A23和调用服务模块A24;注册中心连接器A21用于连接注册中心模块A10,根据所需要的服务依据统一命名服务模块A11生成的服务路径,从服务提供者列表模块A13中获得对应的服务提供者列表和服务提供者概率分布;负载均衡模块A22用于根据服务提供者概率分布进行负载均衡计算,随机选择一个服务提供者;调用服务模块A24用于在负载均衡模块A22选择的服务提供者可用时,调用对应服务提供者模块A30的服务模块A33;高可用性模块A23用于在负载均衡模块A22选择的服务提供者不可用时,重新选择一个可用的服务提供者,并重新计算此服务对应的新服务提供者概率分布。
图2为本发明一实施例的控制流程图,它包括以下步骤:
A、服务提供者模块首先计算自身的服务权值,并将自身能够提供的服务和服务权值注册到注册中心模块,在注册时获取当前时刻其它提供相同服务的服务提供者的信息,并计算此类服务的服务提供者概率分布;
B、注册中心模块将服务提供者模块注册的服务,以命名树的结构进行统一命名服务,并存储每个服务所对应的服务提供者列表和服务提供者概率分布;
C、客户端模块根据自己要获得的服务名称,连接注册中心模块查询并获取对应的服务提供者列表和服务提供者概率分布,并通过负载均衡算法根据概率分布随机选择一个服务提供者;
D、如果服务提供者可用则直接调用服务模块;如果服务提供者不可用则通过高可用性算法选择可用的服务提供者,同时更新服务所对应的服务提供者列表和服务提供者概率分布;
E、更新的服务提供者概率分布由注册中心模块通知给所有客户端模块和所有服务提供者模块。
所述的服务提供者模块计算自身服务权值的具体公式为:
其中W为权值结果,n为权值因子的总数,Ci为第i个服务提供者模块的权值当前值,Si为第i个服务提供者模块的权值比较基准,Pi为第i个服务提供者模块的权值因子,各个权值因子的总和为1;权值比较基准和权值因子由用户设定,权值当前值以实际为准。
权值因子中的项与服务提供者模块的性能有关,例如可选择CPU的主频、内存大小、硬盘大小和网络带宽作为权值因子的项。假设权值因子分别为{0.35,0.25,0.35,0.05}。假设比较基准分别为{1GHz,1GB,100GB,10M},假设当前的实际机器情况为{4GHz,8GB,500GB,10M},则
分别为{4,8,5,1}。则W=4*0.35+8*0.25+5*0.35+1*0.05=5.2,即经过计算该服务提供者的权值为5.2。
将所计算到的权值、服务提供者的服务相关信息注册到注册中心模块上。服务提供者的服务相关信息包括:所能提供的服务名、服务提供者模块的IP和端口。
在统一服务命名树中,每一个服务都是唯一的,通过一个唯一的服务命名路径标识,以保证客户端查找的服务是唯一的。存储服务提供者列表将服务提供者的服务相关信息存储到统一服务命名树中的叶子节点中。统一服务命名树中的叶子节点将存储所有能够为该服务提供执行的所有服务提供者模块的信息。
服务提供者模块计算服务提供者概率分布时,从服务提供者列表模块中获得所能够提供此类服务所对应的当前的服务提供者列表,以此计算概率分布;
至少2个服务提供者模块分别计算概率分布时,采用排队同步的操作过程,即多个并行的服务提供者模块在获取当前的服务提供者列表过程中,由最先抢到当前的服务提供者列表的服务提供者模块进行计算,由注册中心模块阻塞其它服务提供者模块,直到所有服务提供者模块均完成概率分布计算。
第i个服务提供者模块计算某类服务对应的服务提供者概率分布时,按如下公式:
其中,Wi为第i个服务提供者模块的权值,Qi为第i个服务提供者模块提供该服务的概率即其服务权值占所有该服务的权值总和的比率;
第i个服务提供者模块的服务提供者概率分布用Ri表示,
其中n表示服务提供者模块的数量,I为正整数。
负载均衡模块产生一个均匀发生的随机数x,x∈[0,1],令x=Ri,从服务提供者列表模块中获取Ri对应的服务提供者模块。
通过本发明可以无需借助中央集中控制系统产生排程表来协调分流,而是通过按服务权值分布的概率在客户端自行计算,借助概率的自然规律由客户端根据概率分布随机选择哪个服务器执行请求,起到负载均衡的作用。在服务器宕机时只要有客户机尝试连接不到,则由客户机通知注册中心移除宕机服务提供者模块重新计算概率分布。有新的服务提供者模块加入时,新的服务器向注册中心注册,并由新加入的服务提供者模块重新计算概率分布且均无需参考之前计算的结果。客户端每次请求均能够获得最新的概率分布情况。通过本发明能够实现分布式的负载均衡和高可用性。
负载均衡主要是在客户端模块根据服务提供者模块计算的权值概率分布进行随机选择来实现的。高可用性是通过客户端检测到存在不可用的服务提供者,由客户端模块更新服务提供者列表和概率分布,并通知其它客户端模块来实现的。
注册中心模块本身不提供协调客户端模块和服务提供者模块的调用关系,其只提供服务提供者模块的注册、客户端模块查询到唯一服务的路径、存储服务提供者列表和服务提供者概率分布,并提供一个异步消息通知模型,以阻塞的方式将消息分发到多个并发调用的客户端模块。因此,注册中心模块并非协调者,而只是一个信息仓库,由服务提供者模块主动注册信息,客户端模块主动获取信息,自行决定选择那个服务提供者模块,避免了以往方法中需要中央控制器来实现协调的问题。
服务提供者模块除了提供基本的服务模块供客户端模块调用以外,还提供了对注册中心模块主动注册信息的功能,自动计算自身权值的并根据当前注册中心模块中已注册的其它服务提供者模块进行计算概率分布的功能。这样使得注册中心模块无需参与任何协调计算,只负责存储,其它计算要么交给服务提供者模块,要么交给客户端模块。