一种基于镜像队列的主队列负载平衡方法与流程

文档序号:22845351发布日期:2020-11-06 16:49阅读:82来源:国知局
一种基于镜像队列的主队列负载平衡方法与流程

本发明涉及数据处理领域,尤其涉及一种基于镜像队列的主队列负载平衡方法。



背景技术:

在目前的rabbitmq集群的镜像队列模式下,每一个消息队列由一个主队列和若干个从队列构成;正常情况下,由主队列提供消息服务,从队列备份消息,如果有一个消息队列的主队列存在异常,消息队列集群会从其他节点中选举出新的主队列;初始情况下,一个节点有较少数量的主队列和相对较多的从队列,如果有新的消息队列加入集群,则该消息队列的主队列自动加入到当前主队列最少的节点上,其从队列加入到其他节点上。

但是上述镜像队列模式仍存在以下问题,当有节点存在异常时,例如宕机或节点重启的场景下,该节点的主队列自动分散至正常的节点上,但该节点恢复至正常状态后,原有节点的主队列仍旧分布于当前的节点上,不会自动迁移回复至原有节点;另外,在扩容状态下,有新的节点加入消息队列集群时,原有节点上主队列数量较多的节点上的消息队列并不能分散到新的节点上。这会使的在较长时间内并不能分摊运行压力。

现有技术中的镜像队列模式下,这能自动均衡新生成的主队列,却不能动态平衡已有旧的主队列,所以并不能分摊原有节点的压力。



技术实现要素:

本发明的目的在于提供一种基于镜像队列的主队列负载平衡方法,从而解决现有技术中存在的前述问题。

为了实现上述目的,本发明采用的技术方案如下:

一种基于镜像队列的主队列负载平衡方法,包括以下步骤:

s1、消息队列中设有主队列和从队列,所述消息队列均存放于节点中,存放有消息队列的节点构成消息队列集群;

s2、获取所述消息队列集群中的节点信息,通过命令获取所述消息队列中的节点构成,并统计出每个所述节点中存放的所述主队列的数量;

s3、根据步骤s2中统计的所述节点的总数以及所述主队列的总数,计算出所述节点中期望存放的所述主队列的最大数量;

s4、从步骤s2中选出存放主队列数量最大的节点和存放主队列数量最小的节点,将所述存放主队列数量最大的节点中的主队列的数量与步骤s3中的计算出期望存放的所述主队列的最大数量进行对比;当所述节点中的主队列的数量大于期望存放的所述主队列的最大数量时,从所述存放主队列数量最大的节点中随机选择一个所述主队列迁移至所述存放主队列数量最小的节点中;否则,结束本次平衡;

s5、所述消息队列集群经过步骤s4中的主队列迁移后,重新进行步骤s2至步骤s4的循环,直至步骤s4中的对比结果为存放主队列最大数量的节点中的主队列的数量小于或等于期望存放的最大数量,结束所述消息队列集群的负载平衡。

优选的,步骤s3节点中期望存放的主队列的最大数量的计算方法为:

期望存放主队列最大数量=(主队列总数/节点总数)+(主队列总数%节点总数)。

优选的,步骤s4中,所述主队列在所述节点之间的迁移方法如下:

s401、从所述存放主队列数量最大的节点中选择一个所述消息队列,并设置所述消息队列的临时策略:将所述消息队列的设置为副本1,并执行所述消息队列,使所述临时策略生效;

s402、从所述存放主队列数量最大的节点中迁移步骤s401中选择的所述消息队列中的所述主队列,设置所述消息队列的临时策略:将所述消息队列的节点设置为迁移的目标节点;执行所述消息队列,使所述消息队列的临时策略生效;

s403、步骤s401中的选择的所述消息队列的所述主队列迁移至所述存放主队列数量最小的节点中,并清除步骤s401和步骤s402中的所述临时策略,使所述消息队列集群的策略恢复至正常状态;

s404、步骤s401中选择的消息队列中的所述从队列迁移至除所述存放主队列数量最小的节点以外的所述节点中,结束一个主队列的迁移;

s405、将经过步骤s401~s404迁移的所述消息队列集群重新回到步骤s2,进行循环。

优选的,同一消息队列中有且只有一个主队列,并且同一消息队列的所述主队列与所述从队列存放于不同的所述节点中。

本发明的有益效果是:本发明公开了一种基于镜像队列的主队列负载平衡方法,设置了动态平衡主队列的机制,通过自动获取节点中的主队列数量,并根据设定的规则主动迁移主队列;本发明能够自主发现节点中主队列的分布数量,并将主队列分布数量较多的节点中的主队列平滑迁移至主队列分布数量较少的节点中,可以完全覆盖所有主队列负载不均衡的场景;本发明的主队列平衡方法适用于节点宕机恢复、新节点加入和部分消息队列使用完释放后造成的压力不均衡现象,可以自动均衡消息队列集群所在的节点中的主队列分布。

附图说明

图1是主队列负载平衡流程图;

图2是初始状态节点的消息队列分布图;

图3是迁出状态节点的消息队列分布图;

图4是迁入状态节点的消息队列分布图;

图5是迁移完毕节点的消息队列分布图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施方式仅仅用以解释本发明,并不用于限定本发明。

一种基于镜像队列的主队列负载平衡方法,基于目前的镜像队列模式下的消息排列方式;所述主队列负载平衡的方法,如图1所示,包括以下步骤:

s1、将消息存放于消息队列中,所述消息队列包括一个主队列和多个从队列,同一个消息队列的主队列和从队列于不同的节点中;存放所述消息队列的所述节点构成消息队列集群;

s2、通过命令获取所述消息队列集群中的节点构成,并统计出每个节点中存放的所述主队列的数量;

s3、根据步骤s2中统计的所述节点的总数以及所述主队列的总数,计算出所述节点中期望存放的所述主队列的最大数量,计算方法为:

期望存放主队列最大数量=(主队列总数/节点总数)+(主队列总数%节点总数);

s4、从步骤s2中选出存放主队列数量最大的节点和存放主队列数量最小的节点,将所述存放主队列数量最大的节点中的主队列的数量与步骤s3中的计算出期望存放的所述主队列的最大数量进行对比;当所述节点中的主队列的数量大于期望存放的所述主队列的最大数量时,从所述存放主队列数量最大的节点中随机选择一个所述主队列迁移至所述存放主队列数量最小的节点中;否则,结束本次主队列的负载平衡;

所述主队列在所述节点之间的迁移方法为:

s401、从所述存放主队列数量最大的节点中选择一个所述消息队列,并设置所述消息队列的临时策略:将所述消息队列的设置为副本1,并执行所述消息队列,使所述临时策略生效;

s402、从所述存放主队列数量最大的节点中迁移步骤s401中选择的所述消息队列中的所述主队列,设置所述消息队列的临时策略:将所述消息队列的节点设置为迁移的目标节点;执行所述消息队列,使所述消息队列的临时策略生效;

s403、步骤s401中的选择的所述消息队列的所述主队列迁移至所述存放主队列数量最小的节点中,并清除步骤s401和步骤s402中的所述临时策略,使所述消息队列集群的策略恢复至正常状态;

s404、步骤s401中选择的消息队列中的所述从队列迁移至除所述存放主队列数量最小的节点以外的所述节点中,结束一个主队列的迁移;

s5、所述消息队列集群经过步骤s4中的主队列迁移后,重新进行步骤s2至步骤s4的循环,直至步骤s4中的对比结果为存放主队列最大数量的节点中的主队列的数量小于或等于期望存放的最大数量,结束所述消息队列集群的负载平衡。

上述基于镜像队列的主队列负载平衡方法,可以每次这在所述节点之间只迁移一个主队列,还可以同时迁移多个所述主队列;若在所述主队列的迁移过程中,其对应的消息队列被消息消费者访问时,访问不到,但由于迁移时间很短,只需重新访问即可。

实施例

本实施例中将上述主队列负载平衡方法应用于rabbitmq集群中,利用消息队列存放消息,可供消息的出队和入队的,所述消息队列包括一个主队列和若干个从队列,其中所述主队列用于提供消息服务,所述从队列用于备份消息;将消息队列于节点中,其中的所述主队列和从队列于不同的节点中,利用所述节点部署消息队列的服务,控制消息的出队和入队;消息队列的所有节点构成完整的消息队列集群。应用的所述消息队列集群的分布如图1所示,将上述主队列负载平衡方法应用与图1所示的消息队列集群中,包括如下步骤:

s1、设置所述消息队列集群中对所有消息的默认策略为:"ha-mode":"all",即所有消息队列有一个主队列节点,其余节点为从队列节点;

s2、获取所述消息队列集群中的节点构成,并统计出每个节点中存放的所述主队列的数量;其中所述消息队列集群由node1、node2和node3三个节点构成,节点node1的主队列的总数为5,node2的主队列的总数为3,node3的主队列的总数为1;

s3、根据步骤s2中统计的所述节点的总数以及所述主队列的总数,计算出所述节点中期望存放的所述主队列的最大数量,计算方法为:

期望存放主队列最大数量=(主队列总数/节点总数)+(主队列总数%节点总数);图1所示的消息队列集群中的期望存放主队列的最大数量=9/3=9%3=3;

s4、从步骤s2中选出存放主队列数量最大的节点和存放主队列数量最小的节点;图1所示中node1为存放所述主队列数量最大的节点;node3为存放所述主队列数量最小的节点;node1中存放的所述主队列的数量为5,大于期望存放主队列的最大数量3,选择一个node1节点中message1的主队列迁移至node2节点中,所述主队列的迁移步骤如下:

s401、修改消息队列message1的副本数为1,设置消息队列message1的临时策略为{"ha-mode":"exactly","ha-params":1};执行sync_queuemessage1让临时策略生效;使所述消息队列集群如图2所示,消息队列message1只有主队列存放于节点node1中;

s402、将message1迁移至node3,设置message1的临时策略置为{"ha-mode":"nodes","ha-params":["node3"]};执行sync_queuemessage1让临时策略生效;使所述消息队列集群如图3所示,消息队列message1只有主队列存放于节点node3中;

s403、并清除上述步骤s401和步骤s402中的临时策略,此时对所有消息队列的策略又恢复至步骤s1中的默认策略:"ha-mode":"all";

s404、将消息队列message1的从队列迁移至节点node1和node2中,此时所述消息队列集群如图4所示,node1和node2中出现消息队列message1的从队列,完成一个主队列的迁移;

s5、所述消息队列集群经过步骤s4中的主队列迁移后,重新进行步骤s2至步骤s4的循环,此时节点node1中存放的主队列数量为4,仍大于3,所以再次循环步骤s4的过程完成一个消息队列的迁移,此时所述消息队列集群中的主队列数量均为3,满足主队列负载均衡的条件,完成了整个所述消息队列集群的主队列负载均衡。

本发明选择一次迁移一个所述消息队列,降低了消息队列在迁移过程中被消息消费者访问的概率,避免了大量消息消费者重试而增加节点压力。

通过采用本发明公开的上述技术方案,得到了如下有益的效果:

本发明公开了一种基于镜像队列的主队列负载平衡方法,设置了动态平衡主队列的机制,通过自动获取节点中的主队列数量,并根据设定的规则主动迁移主队列;本发明能够自主发现节点中主队列的分布数量,并将主队列分布数量较多的节点中的主队列平滑迁移至主队列分布数量较少的节点中,可以完全覆盖所有主队列负载不均衡的场景;本发明的主队列平衡方法适用于节点宕机恢复、新节点加入和部分消息队列使用完释放后造成的压力不均衡现象,可以自动均衡消息队列集群所在节点中的主队列分布。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视本发明的保护范围。

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