如何设置自动缩放的 RabbitMQ 集群 AWS
How to set up autoscaling RabbitMQ Cluster AWS
我正在尝试从 SQS 转移到 RabbitMQ 以获取消息服务。我正在寻找构建稳定的高可用性队列服务。现在我要使用集群。
当前实施,
我有三台带有 RabbitMQ 的 EC2 机器,在 AMI 中安装了管理插件,然后我明确地转到每台机器并添加
sudo rabbitmqctl join_cluster rabbit@<hostnameOfParentMachine>
将 HA 属性 设置为全部,同步工作。并且在其之上分配了一个 DNS 的负载均衡器。到目前为止,这件事有效。
预期实施:创建一个自动缩放的集群环境,其中 Up/Down 的机器必须动态地 join/Remove 集群。实现这一目标的最佳方法是什么?请帮忙。
两年前我有过类似的配置。
我决定使用 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"}"
嗯,加入“相当”容易,问题是决定何时可以从集群中删除节点。
您不能根据自动缩放规则删除节点,因为您可以将消息发送到您必须使用的队列。
我决定定期执行脚本 运行 两个主节点实例:
- 检查通过 API http://node:15672/api/queues
的消息计数
- 如果所有队列的消息计数为零,我可以从负载均衡器中删除实例,然后从 rabbitmq 集群中删除实例。
这就是我所做的,希望对您有所帮助。
[编辑]
我编辑了答案,因为有这个插件可以提供帮助:
我建议看这个:https://github.com/rabbitmq/rabbitmq-autocluster
插件已移至RabbitMQ官方仓库,可以轻松解决此类问题
我们最近遇到了类似的问题。
我们尝试使用 https://github.com/rabbitmq/rabbitmq-autocluster,但发现它对于我们的用例来说过于复杂。
我创建了 terraform 配置以使用 Autoscaling Group 在 Y 子网(可用区)上旋转 X RabbitMQ 节点。
TL;DR https://github.com/ulamlabs/rabbitmq-aws-cluster
配置创建 IAM 角色以允许节点自动发现自动缩放组中的所有其他节点。
我正在尝试从 SQS 转移到 RabbitMQ 以获取消息服务。我正在寻找构建稳定的高可用性队列服务。现在我要使用集群。
当前实施, 我有三台带有 RabbitMQ 的 EC2 机器,在 AMI 中安装了管理插件,然后我明确地转到每台机器并添加
sudo rabbitmqctl join_cluster rabbit@<hostnameOfParentMachine>
将 HA 属性 设置为全部,同步工作。并且在其之上分配了一个 DNS 的负载均衡器。到目前为止,这件事有效。
预期实施:创建一个自动缩放的集群环境,其中 Up/Down 的机器必须动态地 join/Remove 集群。实现这一目标的最佳方法是什么?请帮忙。
两年前我有过类似的配置。
我决定使用 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"}"
嗯,加入“相当”容易,问题是决定何时可以从集群中删除节点。
您不能根据自动缩放规则删除节点,因为您可以将消息发送到您必须使用的队列。
我决定定期执行脚本 运行 两个主节点实例:
- 检查通过 API http://node:15672/api/queues 的消息计数
- 如果所有队列的消息计数为零,我可以从负载均衡器中删除实例,然后从 rabbitmq 集群中删除实例。
这就是我所做的,希望对您有所帮助。
[编辑]
我编辑了答案,因为有这个插件可以提供帮助:
我建议看这个:https://github.com/rabbitmq/rabbitmq-autocluster
插件已移至RabbitMQ官方仓库,可以轻松解决此类问题
我们最近遇到了类似的问题。
我们尝试使用 https://github.com/rabbitmq/rabbitmq-autocluster,但发现它对于我们的用例来说过于复杂。
我创建了 terraform 配置以使用 Autoscaling Group 在 Y 子网(可用区)上旋转 X RabbitMQ 节点。
TL;DR https://github.com/ulamlabs/rabbitmq-aws-cluster
配置创建 IAM 角色以允许节点自动发现自动缩放组中的所有其他节点。