gpt4 book ai didi

amazon-web-services - 如何设置自动缩放 RabbitMQ 集群 AWS

转载 作者:IT老高 更新时间:2023-10-28 21:22:15 27 4
gpt4 key购买 nike

我正在尝试从 SQS 转移到 RabbitMQ 以获取消息传递服务。我正在寻找建立一个稳定的高可用性排队服务。现在我要使用集群。

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

sudo rabbitmqctl join_cluster rabbit@<hostnameOfParentMachine>

将 HA 属性设置为 all 并且同步工作。并在其顶部分配了一个负载均衡器,并分配了 DNS。到目前为止,这件事有效。

预期实现:创建一个自动缩放的集群环境,其中向上/向下的机器必须动态加入/移除集群。实现这一目标的最佳方法是什么?请帮忙。

最佳答案

两年前我有类似的配置。

我决定使用 amazon VPC ,默认情况下,我的设计有两个始终运行的 RabbitMQ 实例,并在集群中配置(称为主节点)。rabbitmq 集群位于 internal amazon load balancer 后面。 .

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

如果发出自动缩放警报,则会启动新的主 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 绑定(bind)到集群。

作为 HA 政策,我决定使用这个:

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 官方仓库,可以轻松解决此类问题

关于amazon-web-services - 如何设置自动缩放 RabbitMQ 集群 AWS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31340413/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com