我正试图从SQS转移到RabbitMQ以获取消息服务。我正在寻求建立一个稳定的高可用性排队服务。现在我要去集群了。
当前实施, 我有三台带有RabbitMQ的EC2机器,管理插件安装在AMI中,然后我明确地去了每台机器并添加
sudo rabbitmqctl join_cluster rabbit@<hostnameOfParentMachine>
将HA属性设置为all并且同步有效。并且负载均衡器位于顶部,并分配了DNS。到目前为止这件事情有效。
预期实施:创建一个自动扩展群集环境,其中上/下的计算机必须动态加入/删除群集。实现这一目标的最佳方法是什么?请帮忙。
答案 0 :(得分:11)
2年前我有类似的配置。
我决定使用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绑定到群集。
作为HA政策,我决定使用它:
rabbitmqctl set_policy ha-two "^two\." ^
"{""ha-mode"":""exactly"",""ha-params"":2,"ha-sync-mode":"automatic"}"
好吧,连接“相当”容易,问题在于何时可以从群集中删除节点。
您无法根据自动缩放规则删除节点,因为您可以向必须使用的队列发送消息。
我决定执行一个定期运行到两个主节点实例的脚本:
这就是我所做的,希望它有所帮助。
<强> [编辑] 强>
我编辑了答案,因为有这个插件可以提供帮助:
我建议看到这个:https://github.com/rabbitmq/rabbitmq-autocluster
该插件已移至官方RabbitMQ存储库,可以轻松解决此类问题
答案 1 :(得分:1)
我们最近遇到了类似的问题。
我们尝试使用https://github.com/rabbitmq/rabbitmq-autocluster,但发现它在我们的用例中过于复杂。
我创建了terraform配置,使用Autoscaling Group在Y子网(可用区)上旋转X RabbitMQ节点。
TL; DR https://github.com/ulamlabs/rabbitmq-aws-cluster
配置创建IAM角色,以允许节点自动发现Autoscaling组中的所有其他节点。