hash环均衡负载方法、装置、电子设备和存储介质与流程

文档序号:23147268发布日期:2020-12-01 13:28阅读:182来源:国知局
hash环均衡负载方法、装置、电子设备和存储介质与流程

本申请涉及计算机技术领域,特别涉及一种hash环均衡负载方法、装置、电子设备和存储介质。



背景技术:

目前使用一致性hash作为负载均衡时,存在负载不均衡的问题。主要原因是服务节点的hash值不能离散均匀的分布到hash环上,进而导致发送给服务节点的请求消息不能均匀地分发到各服务节点。



技术实现要素:

为解决以上负载不均匀的问题,本申请提供一种hash环均衡负载方法,包括:

将每个真实服务节点虚拟出多个相等数量的虚拟服务节点,得到每个真实服务节点对应的虚拟服务节点;

分别从多个真实服务节点对应的虚拟服务节点中选择一个虚拟服务节点组成一个虚拟服务节点群组,以得到多个虚拟服务节点群组,每个所述虚拟服务节点群组中的虚拟服务节点对应的真实服务节点的顺序相同;

将各虚拟服务节点群组中的虚拟服务节点首尾相连,得到虚拟服务节点队列;

将所述虚拟服务节点队列均匀分布在hash环上。

进一步地,将所述虚拟服务节点队列均匀分布在hash环上,包括:

将所述hash环上相邻的两个虚拟服务节点之间的弧长作为公差,并基于等差数列的通项公式计算等差通项的数值;

基于所述虚拟服务节点队列中的虚拟服务节点与等差通项之间的对应关系,根据所述等差通项的数值将所述虚拟服务节点队列映射于所述hash环上。

进一步地,将所述hash环上相邻的两个虚拟服务节点之间的弧长作为公差,并基于等差数列的通项公式计算等差通项的数值之前,所述方法还包括:

获取虚拟服务节点的hash的值的取值范围,并根据所述取值范围获得所述hash环的周长;

根据所述hash环的周长和所述hash环上所述虚拟服务节点的数量计算出所述弧长。

进一步地,将所述hash环上相邻的两个虚拟服务节点之间的弧长作为公差,并基于等差数列的通项公式计算等差通项的数值之后,所述方法还包括:

将所述等差通项的数值取为整数。

进一步地,分别从多个真实服务节点对应的虚拟服务节点中选择一个虚拟服务节点组成一个虚拟服务节点群组,以得到多个虚拟服务节点群组,每个所述虚拟服务节点群组中的虚拟服务节点对应的真实服务节点的顺序相同,包括:

对每个所述真实服务节点进行编号以及每个所述真实服务节点对应的虚拟服务节点分别进行编号,其中,每个所述真实服务节点对应的虚拟服务节点的编号顺序相同;

将编号相同的虚拟服务节点组成一个所述虚拟服务节点群组,并在每个所述虚拟服务节点群组中按照对应的真实服务节点的编号进行排列。

进一步地,将所述虚拟服务节点队列均匀分布在hash环上之后,所述方法还包括:

计算请求信息的hash值;

根据所述请求信息的hash值,将所述请求信息分配给顺时针方向最近的所述虚拟服务节点。

进一步地,所述虚拟服务节点队列中的所述虚拟服务节点的个数为偶数。

本申请还提供一种hash环均衡负载装置包括:

虚拟单元,用于将每个真实服务节点虚拟出多个相等数量的虚拟服务节点,得到每个真实服务节点对应的虚拟服务节点;

分组单元,用于分别从多个真实服务节点对应的虚拟服务节点中选择一个虚拟服务节点组成一个虚拟服务节点群组,以得到多个虚拟服务节点群组,每个所述虚拟服务节点群组中的虚拟服务节点对应的真实服务节点的顺序相同;

连接单元,用于将各虚拟服务节点群组中的虚拟服务节点首尾相连,得到虚拟服务节点队列;

分布单元,用于将所述虚拟服务节点队列均匀分布在hash环上。

本申请还提供一种电子设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器执行所述计算机程序时实现以上任一项所述的方法。

本申请还提供一种可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以上任一项所述的方法。

本申请中提供的hash环均衡负载方法、装置、电子设备和存储介质,通过将每个真实服务节点均虚拟出多个相等数量的虚拟服务节点,从而来增加hash环上的节点数量;将对应于不同真实服务节点所虚拟出的虚拟服务节点组成一个群组,从而使每个群组中的虚拟服务节点对应的真实服务节点都是间隔的;然后,将各群组首尾相连,得到包含全部虚拟服务节点的虚拟服务节点队列,并且按照队列将全部虚拟服务节点均匀分布在hash环上,从而不仅能够使全部的虚拟服务节点在hash环上是均匀分布的,而且还能够使每个真实服务节点所虚拟出的各虚拟服务节点在hash环上也是均匀分布的,从而使hash环上各服务节点的负载更为均衡。

附图说明

图1是目前使用的一致性hash环上服务节点分布和负载情况示意图。

图2是本申请一实施例中hash环均衡负载方法的步骤示意图。

图3是本申请一实施例中虚拟服务节点在hash环上的分布和负载情况示意图。

图4是在图3所示的分布基础上进行扩容后的虚拟服务节点在hash环上的分布和负载情况示意图。

图5是本申请一实施例中hash环均衡负载装置结构示意框图。

图6是本申请一实施例中电子设备的结构示意框图。

图7是本申请一实施例中可读存储介质示意图。

具体实施方式

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

在本申请的描述中,需要理解的是,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个该特征。在本申请的描述中,除非另有说明,“多个”的含义是两个或两个以上。

此外,所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施例中。在下面的描述中,提供许多具体细节从而给出对本发明的实施例的充分理解。然而,本领域技术人员将意识到,可以实践本发明的技术方案而没有特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知方法、装置、实现或者操作以避免模糊本发明的各方面。

附图中所示的方框图仅仅是功能实体,不一定必须与物理上独立的实体相对应。即,可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。

附图中所示的流程图仅是示例性说明,不是必须包括所有的内容和操作/步骤,也不是必须按所描述的顺序执行。例如,有的操作/步骤还可以分解,而有的操作/步骤可以合并或部分合并,因此实际执行的顺序有可能根据实际情况改变。

一致性hash算法设计目标是为了解决因特网中的热点(hotspot)问题,初衷和carp十分类似。一致性hash算法是一种特殊的hash算法,由于其均衡性、持久性的映射特点,被广泛的应用于负载均衡领域,如nginx和memcached都采用了一致性hash算法来作为集群负载均衡的方案。目前使用一致性hash算法作为负载均衡方法时,仍旧存在一些负载不均衡的问题。主要原因是:一、服务节点hash值不能离散均匀的分布到hash环上;二、服务节点过少,源请求的hash值,分布在同一服务节点概率较大。

参照图1,在图1所示的hash环中,有node1、node2、node3共三个服务节点,在进行负载均衡时,可以使用fnv1_64_hash算出服务节点hash值;a、b、c分别为三个请求对应的请求,也通过fnv1_64_hash算出对应hash值,然后a顺时针找到最近的node服务节点,由图1可以看出,由于node3与node2的区间更大,请求更大的概率会负载到node1节点上,c、a两个请求都会负载在node1节点上,b请求负载到node2节点,node3节点没有请求。可以发现,此种一致性hash的算法设计,会导致负载不均衡的情况。

参照图2,本申请一些实施例中提供一种hash环均衡负载方法,方法包括:

步骤s1,将每个真实服务节点虚拟出多个相等数量的虚拟服务节点,得到每个真实服务节点对应的虚拟服务节点;

步骤s2,分别从多个真实服务节点对应的虚拟服务节点中选择一个虚拟服务节点组成一个虚拟服务节点群组,以得到多个虚拟服务节点群组,每个所述虚拟服务节点群组中的虚拟服务节点对应的真实服务节点的顺序相同;

步骤s3,将各虚拟服务节点群组中的虚拟服务节点首尾相连,得到虚拟服务节点队列;

步骤s4,将所述虚拟服务节点队列均匀分布在hash环上。

如上述步骤s1所述,将每个真实服务节点都虚拟出多个虚拟服务节点,每个真实服务节点虚拟出的虚拟服务节点的个数是相等的,从而得到每个真实服务节点对应的多个虚拟服务节点。

例如,总共有node1、node2和node3三个真实服务节点。每个真实服务节点均虚拟出三个虚拟服务节点。如,真实服务节点node1虚拟出v1node1、v2node1和v3node1三个虚拟服务节点。真实服务节点node2虚拟出v1node2、v2node2和v3node2三个虚拟服务节点。真实服务节点node3虚拟出v1node3、v2node3和v3node3三个虚拟服务节点。

从而,将各虚拟服务节点代替真实服务节点分布在hash环上,以提高hash环上服务节点的数量。其中,每个真实服务节点可以理解成一个服务器。

如上述步骤s2所述,分别从每个真实服务节点对应的虚拟服务节点中选择一个虚拟服务节点组成,例如:

从真实服务节点node1所虚拟出的三个虚拟服务节点中选取虚拟服务节点v1node1,从真实服务节点node2所虚拟出的三个虚拟服务节点中选取虚拟服务节点v1node2,从真实服务节点node3所虚拟出的三个虚拟服务节点中选取虚拟服务节点v1node3,从而组成一个虚拟服务节点群组v1node1、v1node2和v1node3。

从真实服务节点node1所虚拟出的三个虚拟服务节点中选取虚拟服务节点v2node1,从真实服务节点node2所虚拟出的三个虚拟服务节点中选取虚拟服务节点v2node2,从真实服务节点node3所虚拟出的三个虚拟服务节点中选取虚拟服务节点v2node3,从而组成一个虚拟服务节点群组v2node1、v2node2和v2node3。

从真实服务节点node1所虚拟出的三个虚拟服务节点中选取虚拟服务节点v3node1,从真实服务节点node2所虚拟出的三个虚拟服务节点中选取虚拟服务节点v3node2,从真实服务节点node3所虚拟出的三个虚拟服务节点中选取虚拟服务节点v3node3,从而组成一个虚拟服务节点群组v3node1、v3node2和v3node3。

从而,得到三个虚拟服务节点群组。三个虚拟服务节点群组中的虚拟服务节点对应的真实服务节点的顺序相同,如上述三个虚拟服务节点群组中,每个虚拟服务节点群组都是对应真实服务节点node1的虚拟服务节点排在最前,对应真实服务节点node2的虚拟服务节点排在中间,对应真实服务节点node3的虚拟服务节点排在最后。

如上述步骤s3所述,将各虚拟服务节点群组中的虚拟服务节点首尾相连,从而得到虚拟服务节点队列,例如:

将上述三个虚拟服务节点群组首尾相连后,得到虚拟服务节点队列v1node1、v1node2、v1node3、v2node1、v2node2、v2node3、v3node1、v3node2、v3node3。

如上述步骤s4所述,将经过以上步骤所得到的虚拟服务节点队列均匀地分布在hash环上。如图3所示,得到虚拟服务节点队列v1node1、v1node2、v1node3、v2node1、v2node2、v2node3、v3node1、v3node2、v3node3后,将对列中的各虚拟服务节点按照对列中的前后顺序均匀地分布在hash环上,进而请求a、请求b和请求c可以更为均衡地负载于每个真实服务节点上。

通过以上各步骤,可以确保hash环上相邻的两个虚拟服务节点对应的是不同的真实服务节点,能够使全部的虚拟服务节点在hash环上是均匀分布的,而且每个真实服务节点所虚拟出的各虚拟服务节点在hash环上也是均匀分布的。

通过以上方案,不仅能使hash环上各服务节点的负载更为均衡,而且能够最大程度保留hash环的特性。

例如,新增一个节点node4,加载在node3和node1的虚拟节点中间,这样即扩容节点,同时大部分的负载集群都没有变,只会影响node3和node1之间的部分数据负载在新加入的node4虚拟节点上。

影响比例公式:(v_node'-v_node)/(2×v_node);

其中,v_node为原始虚拟节点;v_node'为扩容后虚拟节点。

如图4所示,按照以上方案,原始虚拟节点为九个,若增加一个真实服务节点node4扩容后,也即增加了v1node4、v2node4和v3node4三个虚拟服务节点,虚拟服务节点一共有十二个,影响比例为:16.6667%。

如果用传统hash取模来负载的话,当新增一个节点后,比如有四个节点,hash%4即为取模,如再加一个服务节点,则取模hash%5,这样只有前面的25%的hash模没有变,后面的都会发生变动。也即,影响比例为75%。

所以相比传统的hash取模负载,对集群进行扩容,影响的负载节点变化比例小很多,最大程度保留了hash环特性。

本申请一些实施例中,上述将分别从多个真实服务节点对应的虚拟服务节点中选择一个虚拟服务节点组成一个虚拟服务节点群组,以得到多个虚拟服务节点群组,每个虚拟服务节点群组中的虚拟服务节点对应的真实服务节点的顺序相同的步骤s2,包括:

步骤s21,对每个所述真实服务节点以及每个所述真实服务节点对应的虚拟服务节点分别进行编号,其中,每个所述真实服务节点对应的虚拟服务节点的编号顺序相同;

步骤s22,将编号相同的虚拟服务节点组成一个所述虚拟服务节点群组,并在每个所述虚拟服务节点群组中按照对应的真实服务节点的编号进行排列。

如上述步骤s21所述,可以先对每个真实服务节点进行编号,如三个真实服务节点分别编号为node1、node2和node3,从而便于区分不同的真实服务节点。

然后,对每个真实服务节点所虚拟出来的虚拟服务节点进行编号,每个所述真实服务节点对应的虚拟服务节点的编号顺序相同。

例如,其中一个真实服务节点node虚拟出的三个虚拟服务节点的编号分别为v1、v2和v3,则其余每个真实服务节点虚拟出的三个虚拟服务节点均分别编号为v1、v2和v3。

如上述步骤s22所述,将编号相同的虚拟服务节点组成一个虚拟服务节点群组。

例如,将真实服务节点node1所虚拟出的编号为v1的虚拟服务节点记为v1node1、真实服务节点node2所虚拟出的编号为v1的虚拟服务节点记为v1node2以及真实服务节点node3所虚拟出的编号为v1的虚拟服务节点记为v1node3组成一个虚拟服务节点群组,记为第一虚拟服务节点群组。

将真实服务节点node1所虚拟出的编号为v2的虚拟服务节点记为v2node1、真实服务节点node2所虚拟出的编号为v2的虚拟服务节点记为v2node2以及真实服务节点node3所虚拟出的编号为v2的虚拟服务节记为v2node3点组成一个虚拟服务节点群组,记为第二虚拟服务节点群组。

将真实服务节点node1所虚拟出的编号为v3的虚拟服务节点记为v3node1、真实服务节点node2所虚拟出的编号为v3的虚拟服务节点记为v3node2以及真实服务节点node3所虚拟出的编号为v3的虚拟服务节点记为v3node3组成一个虚拟服务节点群组,记为第三虚拟服务节点群组。

从而得到三个虚拟服务节点群组,然后,在三个虚拟服务节点群组中均按照对应的真实服务节点的编号进行排列。

例如,在第一虚拟服务节点群组中三个虚拟服务节点v1node1、v1node2和v1node3分别按照对应的三个真实服务节点node1、node2和node3的编号进行排列即为v1node1、v1node2和v1node3。

同理,在第二虚拟服务节点群组中三个虚拟服务节点v2node1、v2node2和v2node3分别按照对应的三个真实服务节点node1、node2和node3的编号进行排列即为v2node1、v2node2和v2node3,在第三虚拟服务节点群组中三个虚拟服务节点v3node1、v3node2和v3node3分别按照对应的三个真实服务节点node1、node2和node3的编号进行排列即为v3node1、v3node2和v3node3。

通过以上方法对各虚拟服务节点群组中的虚拟服务节点进行排序,使虚拟服务节点与真实服务节点的对应关系更为直观,便于分析对比和负载验证。

本申请一些实施例中,上述将所述虚拟服务节点队列均匀分布在hash环上的步骤s4包括:

步骤s41,将所述hash环上相邻的两个虚拟服务节点之间的弧长作为公差,并基于等差数列的通项公式计算等差通项的数值;

步骤s42,基于所述虚拟服务节点队列中的虚拟服务节点与等差通项之间的对应关系,根据所述等差通项的数值将所述虚拟服务节点队列映射于所述hash环上。

如上述步骤s41所述,将hash环上相邻的两个虚拟服务节点之间的弧长作为公差,并基于等差数列的通项公式计算等差通项的数值,例如:

等差数列的通项公式为

an=a1+(n-1)×d

其中,an代表通项。通项an代表虚拟服务节点队列中第n个虚拟服务节点在hash环上的位置。a1代表首项。n代表项数。令项数n等于虚拟服务节点队列中所有虚拟节点的数量。d代表公差。

假设hash环上相邻的两个虚拟服务节点之间的弧长为l,则将公差d代替为弧长为l后,得到

an=a1+(n-1)×l

根据此公式,结合弧长为l和项数n,就可以计算出该等差通项中每项的值。

如上述步骤s42所述,基于虚拟服务节点队列中的虚拟服务节点与等差通项之间的对应关系,根据等差通项的数值将虚拟服务节点队列映射于hash环上。其中,虚拟服务节点与等差通项之间的对应关系是指通项an代表虚拟服务节点队列中第n个虚拟服务节点在hash环上的位置,从而构建的通项an与虚拟服务节点的对应关系。

例如,a1代表虚拟服务节点队列中第1个虚拟服务节点在hash环上的位置,a1对应虚拟服务节点队列中第1个虚拟服务节点;a2代表虚拟服务节点队列中第2个虚拟服务节点在hash环上的位置,a2对应虚拟服务节点队列中第2个虚拟服务节点,依次类推,通项an对应第n个虚拟服务节点。

从而,通过上述步骤s41计算出通项an所包含的各项的数值后,按照上述对应关系,将虚拟服务节点队列中各虚拟服务节点映射在hash环上an各项数值对应的位置上。

例如,计算得a1=1073741823,a2=2147483647,a3=3221225471,则将虚拟服务节点队列中的v1node1、v1node2、v1node3分别映射在hash环上的1073741823、2147483647和3221225471位置处。依次类推,将全部虚拟服务节点队列中的全部虚拟服务节点映射在hash环上,从而使全部虚拟服务节点均匀分布于hash环上。

本申请一些实施例中,上述将所述hash环上相邻的两个虚拟服务节点之间的弧长作为公差,并基于等差数列的通项公式计算等差通项的数值的步骤s21之前,所述方法还包括:

步骤s21,获取虚拟服务节点的hash值的取值范围,并根据所述取值范围获得所述hash环的周长;

步骤s22,根据所述hash环的周长和所述hash环上所述虚拟服务节点的数量计算出所述弧长。

如上述步骤s21和上述步骤s22所述,hash环的周长可根据虚拟服务节点的hash值的取值范围获得。具体获得hash环的周长的方法可以是将虚拟服务节点的hash值的范围中的最大的值作为hash环的周长,从而便于下一步根据hash环周长计算hash环的半径。

例如,通过步骤s21获得hash环的周长c为232-1,hash环上的虚拟服务节点将hash环进行了n等分,从而可以算出hash环上任意相邻的两个虚拟服务节点之间的弧长l=(232-1)/n。

在以上实施例中,公差d=l,进而得到d=(232-1)/n。

在一些实施例中,也可以根据弧长公式l=a×r和弧度与角度的换算公式1°=π/180°得

l=m×π×r/180

其中,α代表弧度值,r代表hash的半径,m代表圆心角度数;

令弧长等于公差值,即长l=d,得,d=m×π×r/180;

由于hash环是被虚拟服务节点n等分的,所以每段圆弧所对应的圆心角m=360/n;

进而得到,

由hash环周长c=232-1,结合圆的周长公式c=2×π×r,得到

232-1=2×π×r

进而得到r=(232-1)/2π,代入上述公式同样可以得到

d=(232-1)/n。

本申请一些实施例中,上述获取虚拟服务节点的hash值的取值范围,并根据所述取值范围获得所述hash环的周长的步骤s21包括:

步骤s211,将所述取值范围对应的最大值作为所述hash环的周长。

例如,若虚拟服务节点的hash的取值范围为0~232-1,则虚拟服务节点的hash的最大值为232-1,进而可将hash环的周长可记为c=232-1。将hash环的周长c代入以上实施例中,便可以用于计算等差数列的公差。

本申请一些实施例中,上述将hash环上相邻的两个虚拟服务节点之间的弧长作为公差,并基于等差数列的通项公式计算等差通项的数值的步骤s41之后,所述方法还包括:

步骤s411,将所述等差通项的数值取为整数。

在步骤s411中,将等差通项计算出来的各项数值均取为整数,例如:

a1=1×(232-1)/4=1073741823,a2=2×(232-1)/4=2147483647

a3=3×(232-1)/4=3221225471,a4=4×(232-1)/4=4294967295,便于统计和计算。

本申请一些实施例中,虚拟服务节点队列中,虚拟服务节点的个数为偶数,从而使负载更为均衡。通过设置不同的真实服务节点和虚拟服务节点,对各真实服务节点的负载进行验证如下:

设置方案一:真实服务节点有四个,每个真实服务节点虚拟出两个虚拟服务节点。通过计算机验证,负载结果如下:

真实服务节点node1,负载比列:0.2527;

真实服务节点node2,负载比列:0.2486;

真实服务节点node3,负载比列:0.2441;

真实服务节点node4,负载比列:0.2546。

设置方案二:真实服务节点有四个,每个真实服务节点虚拟出五个虚拟服务节点。通过计算机验证,负载结果如下:

真实服务节点node1,负载比列:0.2907;

真实服务节点node2,负载比列:0.3029;

真实服务节点node3,负载比列:0.2001;

真实服务节点node4,负载比列:0.2063。

对比设置方案一与设置方案二的负载结果可知,虚拟节点为偶数时,各真实服务节点负载更均衡。

设置方案三:真实服务节点有四个,每个真实服务节点虚拟出六个虚拟服务节点。通过计算机验证,负载结果如下:

真实服务节点node1,负载比列:0.2506;

真实服务节点node2,负载比列:0.2505;

真实服务节点node3,负载比列:0.2508;

真实服务节点node4,负载比列:0.2481。

对比设置方案二与设置方案三的负载结果可知,虚拟节点更多时,各真实服务节点负载更均衡。

设置方案四:真实服务节点扩容到八个,每个真实服务节点虚拟出六个虚拟服务节点。通过计算机验证,负载结果如下:

真实服务节点node1,负载比列:0.1258;

真实服务节点node2,负载比列:0.1229;

真实服务节点node3,负载比列:0.1244;

真实服务节点node4,负载比列:0.1223;

真实服务节点node5,负载比列:0.1232;

真实服务节点node6,负载比列:0.1235;

真实服务节点node7,负载比列:0.1279;

真实服务节点node8,负载比列:0.13。

对比设置方案三与设置方案四的负载结果可知,按照本申请方案扩容节点后,负载依然比较均衡。

通过以上各实施例,将虚拟服务节点均匀分布在hash环上后,就可以根据hash算法,计算请求信息的hash值,然后根据请求信息的hash值以及各虚拟服务节点的hash值将,请求信息分配给顺时针方向最接近的虚拟服务节点。

例如,hash函数选用质数(除非1),从而避免溢出的情况,导致信息丢失。兼顾到虚拟机的性能,虚拟机默认使用2<<5-1,提高计算hash的性能。综合以上,hash的算法为:

hash=31*hash+ascii;

其中,hash初始化值为0。ascii初始化值为32。ascii表示需要进行hash的字符串的ascii码,比如需要根据ip进行hash这里的ascii就是ip字符数组ascii码。例如,ip为114.114.114.114,计算出值为-1009865594,然后需要取绝对值为1009865594。

本步骤中,通过hash算法对请求信息进行hash计算,从而提高离散概率。

然后,根据计算出的请求信息的hash值,将请求映射到hash环上。例如,通过hash计算后得到的请求信息的hash值为1009865594。则将请求信息映射到hash上的1009865594位置处。

可见,请求信息的位置1009865594距离虚拟服务节点v1node1的位置(a1=1073741823)比较近,按照顺时针则该请求信息负载在虚拟服务节点v1node1对应的真实服务节点node1上。

综合以上实施例,本申请通过将虚化后所得到的虚拟服务节点都均匀分布在hash环上,而且每个真实服务节点所虚化出的虚拟节点也均匀分布在hash环上,从而使每一个数据请求负载在各服务节点上的概率尽可能地均匀。通过本方案还能够最大程度地保留hash环的特性,某个服务器/服务节点失效,或者添加新的服务节点进行扩容后,影响比大大降低,使服务器集群更为稳定可靠。

参照图5,本申请一些实施例中,还提供一种hash环均衡负载装置,包括虚拟单元10、分组单元20、连接单元30和分布单元40。虚拟单元10用于将每个真实服务节点虚拟出多个相等数量的虚拟服务节点,进而得到每个真实服务节点对应的虚拟服务节点。分组单元20用于分别从多个真实服务节点对应的虚拟服务节点中选择一个虚拟服务节点组成一个虚拟服务节点群组,进而得到多个虚拟服务节点群组。其中,每个虚拟服务节点群组中的虚拟服务节点对应的真实服务节点的顺序相同。连接单元30用于将各虚拟服务节点群组中的虚拟服务节点首尾相连,从而得到虚拟服务节点队列。分布单元40用于将虚拟服务节点队列均匀分布在hash环上。

可选地,所述hash环均衡负载装置还包括计算请求信息的hash值计算单元和分配单元。所述请求信息的hash值计算单元用于计算请求信息的hash值。所述分配单元用于根据所述请求信息的hash值,将所述请求信息分配给顺时针方向最近的所述虚拟服务节点。

可选地,所述分布单元被配置为:将所述hash环上相邻的两个虚拟服务节点之间的弧长作为公差,并基于等差数列的通项公式计算等差通项的数值;基于所述虚拟服务节点队列中的虚拟服务节点与等差通项之间的对应关系,根据所述等差通项的数值将所述虚拟服务节点队列映射于所述hash环上。

可选地,所述分布单元被配置为:获取虚拟服务节点的hash值的取值范围,并根据所述取值范围获得所述hash环的周长;根据所述hash环的周长和所述hash环上所述虚拟服务节点的数量计算出所述弧长。

可选地,所述分布单元被配置为:将所述hash环上相邻的两个虚拟服务节点之间的弧长作为公差,并基于等差数列的通项公式计算等差通项的数值之后,将所述等差通项的数值取为整数。

可选地,所述分组单元被配置为:对每个所述真实服务节点以及每个所述真实服务节点对应的虚拟服务节点分别进行编号,其中,每个所述真实服务节点对应的虚拟服务节点的编号顺序相同;将编号相同的虚拟服务节点组成一个虚拟服务节点群组,并在每个所述虚拟服务节点群组中按照对应的真实服务节点的编号进行排列。

上述装置中各个模块的功能和作用的实现过程具体详见上述hash环均衡负载方法中对应步骤的实现过程,在此不再赘述。

应当注意,尽管在上文详细描述中提及了用于若干模块或者单元,但是这种划分并非强制性的。实际上,根据本发明公开的实施方式,上文描述的两个或更多模块或者单元的特征和功能可以在一个模块或者单元中具体化。反之,上文描述的一个模块或者单元的特征和功能可以进一步划分为由多个模块或者单元来具体化。

此外,尽管在附图中以特定顺序描述了本发明中方法的各个步骤,但是,这并非要求或者暗示必须按照该特定顺序来执行这些步骤,或是必须执行全部所示的步骤才能实现期望的结果。附加的或备选的,可以省略某些步骤,将多个步骤合并为一个步骤执行,以及/或者将一个步骤分解为多个步骤执行等。

通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本发明实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是cd-rom,u盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、移动终端、或者网络设备等)执行根据本发明实施方式的方法。

参照图6,本申请一些实施例中还提供一种用于实现上述hash环均衡负载方法的电子设备。图6显示的电子设备500仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。

电子设备500以通用计算设备的形式表现。电子设备500的组件可以包括但不限于:至少一个处理单元510、至少一个存储单元520、连接不同系统组件(包括存储单元520和处理单元510)的总线530。

其中,所述存储单元存储有程序代码,所述程序代码可以被所述处理单元510执行,使得所述处理单元510执行本说明书上述“示例性方法”部分中描述的根据本发明各种示例性实施方式的步骤。例如,所述处理单元510可以执行如图2中所示的步骤s1至步骤s4。

存储单元520可以包括易失性存储单元形式的可读介质,例如随机存取存储单元(ram)5201和/或高速缓存存储单元5202,还可以进一步包括只读存储单元(rom)5203。

存储单元520还可以包括具有一组(至少一个)程序模块5205的程序/实用工具5204,这样的程序模块5205包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。

总线530可以为表示几类总线结构中的一种或多种,包括存储单元总线或者存储单元控制器、外围总线、图形加速端口、处理单元或者使用多种总线结构中的任意总线结构的局域总线。

电子设备500也可以与一个或多个外部设备1000(例如键盘、指向设备、蓝牙设备等)通信,还可与一个或者多个使得用户能与该电子设备800交互的设备通信,和/或与使得该电子设备500能与一个或多个其它计算设备进行通信的任何设备(例如路由器、调制解调器等等)通信。这种通信可以通过输入/输出(i/o)接口540进行。并且,电子设备500还可以通过网络适配器560与一个或者多个网络(例如局域网(lan),广域网(wan)和/或公共网络,例如因特网)通信。如图所示,网络适配器560通过总线530与电子设备500的其它模块通信。应当明白,尽管图中未示出,可以结合电子设备500使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、raid系统、磁带驱动器以及数据备份存储系统等。

通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本发明实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是cd-rom,u盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、终端装置、或者网络设备等)执行根据本发明实施方式的方法。

参照图7,在本申请的示例性实施例中,还提供了一种计算机可读存储介质,其上存储有能够实现本说明书上述hash环均衡负载方法的程序产品。在一些可能的实施方式中,本发明的各个方面还可以实现为一种程序产品的形式,其包括程序代码,当所述程序产品在终端设备上运行时,所述程序代码用于使所述电子设备执行本说明书上述“示例性方法”部分中描述的根据本发明各种示例性实施方式的步骤。

图7是本申请一示例性实施例示出的一种用于实现上述hash环均衡负载方法的计算机可读存储介质。图7描述了根据本发明的实施方式的用于实现上述hash环均衡负载方法的程序产品600,其可以采用便携式紧凑盘只读存储器(cd-rom)并包括程序代码,并可以在电子设备,例如个人电脑上运行。然而,本发明的程序产品不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。

所述程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。

计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。

可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、rf等等,或者上述的任意合适的组合。

可以以一种或多种程序设计语言的任意组合来编写用于执行本发明操作的程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如java、c++等,还包括常规的过程式程序设计语言—诸如“c”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(lan)或广域网(wan),连接到用户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。

此外,上述附图仅是根据本发明示例性实施例的方法所包括的处理的示意性说明,而不是限制目的。易于理解,上述附图所示的处理并不表明或限制这些处理的时间顺序。另外,也易于理解,这些处理可以是在多个模块中同步或异步执行的。

虽然已参照几个典型实施方式描述了本申请,但应当理解,所用的术语是说明和示例性、而非限制性的术语。由于本申请能够以多种形式具体实施而不脱离本申请的精神或实质,所以应当理解,上述实施方式不限于任何前述的细节,而应在随附权利要求所限定的精神和范围内广泛地解释,因此落入权利要求或其等效范围内的全部变化和改型都应为随附权利要求所涵盖。

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