amazon-web-services – 如何设置自动扩展RabbitMQ群集AWS

前端之家收集整理的这篇文章主要介绍了amazon-web-services – 如何设置自动扩展RabbitMQ群集AWS前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正试图从SQS转移到RabbitMQ进行消息传递服务.我正在寻求建立稳定的高可用性排队服务.现在我要去集群了.

目前的实施,
         我有三台带有RabbitMQ的EC2机器,在AMI中安装了管理插件,然后我明确地去了每台机器并添加

  1. sudo rabbitmqctl join_cluster rabbit@

将HA属性设置为all并且同步有效.最重要的是负载均衡器,并分配了DNS.到目前为止这件事情有效.

预期实施:创建自动扩展群集环境,其中上/下的计算机必须动态加入/删除群集.实现这一目标的最佳方法是什么?请帮忙.

最佳答案
我2年前有类似的配置.

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

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

如果引发自动调节警报,则启动新的主AMI.
此AMI在第一次执行时执行以下脚本:

  1. #!/usr/bin/env python
  2. import json
  3. import urllib2,base64
  4. if __name__ == '__main__':
  5. prefix =''
  6. from subprocess import call
  7. call(["rabbitmqctl","stop_app"])
  8. call(["rabbitmqctl","reset"])
  9. try:
  10. _url = 'http://internal-myloadbalamcer-xxx.com:15672/api/nodes'
  11. print prefix + 'Get json info from ..' + _url
  12. request = urllib2.Request(_url)
  13. base64string = base64.encodestring('%s:%s' % ('guest','guest')).replace('\n','')
  14. request.add_header("Authorization","Basic %s" % base64string)
  15. data = json.load(urllib2.urlopen(request))
  16. ##if the script got an error here you can assume that it's the first machine and then
  17. ## exit without controll the error. Remember to add the new machine to the balancer
  18. print prefix + 'request ok... finding for running node'
  19. for r in data:
  20. if r.get('running'):
  21. print prefix + 'found running node to bind..'
  22. print prefix + 'node name: '+ r.get('name') +'- running:' + str(r.get('running'))
  23. from subprocess import call
  24. call(["rabbitmqctl","join_cluster",r.get('name')])
  25. break;
  26. pass
  27. except Exception,e:
  28. print prefix + 'error during add node'
  29. finally:
  30. from subprocess import call
  31. call(["rabbitmqctl","start_app"])
  32. pass

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

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

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

好吧,连接“非常”简单,问题在于何时可以从群集中删除节点.

您无法根据自动缩放规则删除节点,因为您可以向必须使用的队列发送消息.

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

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

这就是我所做的,希望它有所帮助.

[编辑]

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

我建议看到这个:https://github.com/rabbitmq/rabbitmq-autocluster

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

猜你在找的Docker相关文章