当前位置: 首页 > 面试题库 >

如何设置自动缩放RabbitMQ集群AWS

卢宜然
2023-03-14
问题内容

我正在尝试从SQS转移到RabbitMQ,以提供消息服务。我正在寻求建立稳定的高可用性排队服务。现在,我要使用集群。

在当前实现中 ,我有三台EC2机器,其中RabbitMQ的管理插件安装在AMI中,然后我明确地转到每台机器并添加

sudo rabbitmqctl join_cluster rabbit@<hostnameOfParentMachine>

将HA属性设置为all并进行同步。在其上面的负载均衡器已分配了DNS。到目前为止,这件事有效。

预期的实现 :创建一个自动伸缩的集群环境,在该环境中,运行Up / Down的计算机必须html" target="_blank">动态加入/删除集群。实现此目标的最佳方法是什么?请帮忙。


问题答案:

我两年前有类似的配置。

我决定使用Amazon
VPC
,默认情况下,我的设计有两个始终运行的RabbitMQ实例,并在集群中配置(称为主节点)。Rabbitmq集群位于内部亚马逊负载均衡器的后面。

我创建了配置了RabbitMQ和管理插件的AMI(称为“ master-AMI”),然后配置了自动缩放规则。

如果发出自动缩放警报,则会启动新的master-AMI。该AMI在第一次执行时执行跟随脚本:

#!/usr/bin/env python
import json
import urllib2,base64

if __name__ == '__main__':
    prefix =''
    from subprocess import call
    call(["rabbitmqctl", "stop_app"])
    call(["rabbitmqctl", "reset"])
    try:
        _url = 'http://internal-myloadbalamcer-xxx.com:15672/api/nodes'
        print prefix + 'Get json info from ..' + _url
        request = urllib2.Request(_url)

        base64string = base64.encodestring('%s:%s' % ('guest', 'guest')).replace('\n', '')
        request.add_header("Authorization", "Basic %s" % base64string)
        data = json.load(urllib2.urlopen(request))
        ##if the script got an error here you can assume that it's the first machine and then 
        ## exit without controll the error. Remember to add the new machine to the balancer
        print prefix + 'request ok... finding for running node'


        for r in data:
            if r.get('running'):
                print prefix + 'found running node to bind..'
                print prefix + 'node name: '+ r.get('name') +'- running:' + str(r.get('running'))
                from subprocess import call
                call(["rabbitmqctl", "join_cluster",r.get('name')])
                break;
        pass
    except Exception, e:
        print prefix + 'error during add node'
    finally:
        from subprocess import call
        call(["rabbitmqctl", "start_app"])


    pass

脚本使用HTTP API“ http://internal-myloadbalamcer-
xxx.com:15672/api/nodes
”查找节点,然后选择一个节点并将新的AMI绑定到群集。

作为高可用性策略,我决定使用此方法:

rabbitmqctl set_policy ha-two "^two\." ^
   "{""ha-mode"":""exactly"",""ha-params"":2,"ha-sync-mode":"automatic"}"

好了,联接“非常”简单,问题在于确定何时可以从集群中删除节点。

您无法基于自动缩放规则删除节点,因为您可以将消息发送到必须使用的队列。

我决定执行一个定期运行到两个主节点实例的脚本:

  • 通过API http:// node:15672 / api / queues检查消息计数
  • 如果所有队列的消息计数均为零,则可以从负载均衡器中删除该实例,然后从Rabbitmq集群中删除该实例。

这大致上就是我所做的,希望对您有所帮助。

[编辑]

我编辑了答案,因为有这个插件可以帮助您:

我建议看一下:https :
//github.com/rabbitmq/rabbitmq-
autocluster

该插件已移至官方RabbitMQ存储库,可以轻松解决此类问题



 类似资料:
  • 拜托,我需要你的帮助。 自上周以来,我一直在努力尝试在Windows服务器上配置兔子MQ集群。我重新安装了 RabbitMQ 3.7.8 和 ErlangOTP 21-1 超过 15 次,试图找出问题并修复它,但不幸的是,我所有的尝试都失败了。 我的环境: 三个虚拟机与操作系统: Windows 服务器 2012 环境变量设置: 安装步骤:(针对每台服务器) 完成以上服务器的安装后,我开始配置集群

  • 我有一个主节点,它的ip是192.168.1.101,还有一个非主节点,它的ip是192.168.1.106。两者使用相同版本的ElasticSearch-1.2.0。 但是在我启动主节点和非主节点之后,我得到了以下信息: cluster.name:mycluster node.name:“node1” node.master:true node.data:true index.number_of

  • 问题内容: IE浏览器忽略缩放设置不起作用,我的代码如下,为什么它不起作用?我收到了错误消息(selenium.common.exceptions.SessionNotCreatedException:消息:启动Internet Explorer时发生意外错误。浏览器缩放级别设置为125%。应将其设置为100%) 问题答案: 不 ,在使用 InternetExplorerDriver时, 您不应忽

  • 问题内容: 我想知道如何配置此工具,使其从最小数量的节点开始,并在需要时增长到最大数量的节点。 我应该使用其他工具还是docker swarm可以为我解决这个问题? 问题答案: 简短的答案 :目前尚无简便的方法可以使用Docker Swarm做到这一点。 Docker Swarm(或Swarm模式)不支持 自动缩放 机器。您需要为此使用另一种解决方案,例如在基础架构上创建计算机(使用docker)

  • 问题内容: 在所有ECS教程中,您需要创建一个集群,然后创建一个自动伸缩组,该集群将生成实例。在所有这些教程中,实例都以某种方式神奇地显示在群集中,但是没有人提示是什么将自动扩展组和群集连接在一起。 我的自动伸缩组会按预期生成实例,但是它们不会出现在保存我的docker定义的ecs集群上。 我缺少的连接在哪里? 问题答案: 好吧,我发现了。有关ecs- agent及其配置文件/etc/ecs/ec

  • 我正在学习负载平衡器和托管实例组自动扩展。我不理解MIG在使用HTTP负载平衡利用率时如何自动缩放: 因此,在MIG自动缩放设置中,我将目标HTTP负载平衡利用率设置为10%: 在设置外部HTTP负载平衡器时:我有以下两个选项: 利用: 速率: 我可以理解基于CPU的MIG自动缩放,如果平均CPU使用量大于我输入的数量,那么MIG将添加更多VM以降低数量。它非常简单明了。 但我不知道在使用HTTP