RabbitMQ 集群文档
https://www.rabbitmq.com/clustering.html
描述了一个过程,通过该过程您可以部署一个用于集群的配置文件,以便在您的 rabbitmq 节点启动时自动创建一个集群。例如
[{rabbit,
[{cluster_nodes, {['rabbit@rabbit1', 'rabbit@rabbit2', 'rabbit@rabbit3'], ram}}]}].
您在 /etc/rabbitmq/rabbitmq.config 的 3 个节点上分别应用此文件,然后在每个节点上启动 rabbitmq,这样就会形成一个集群。
这似乎不太有效,例如
如果您启动 rabbit2,而 rabbit3 尚未启动,则该服务将不会在 rabbit2 上启动,因为它正在尝试与 rabbit3 创建集群。
同样,如果你只在 rabbit1 上应用配置,并且已经预先启动了 rabbit2 和 rabbit3,rabbit1 将只与 rabbit2 形成集群,因为根据文档(我不明白为什么):
RabbitMQ will try to cluster to each node provided, and stop after it can cluster with one of them.
唯一可行的方法是将配置文件应用于所有 3 个节点,并让它们从确切地同时。我尝试使用 Ansible 进行部署,它会按顺序创建节点,因此这不起作用。
我在这里遗漏了什么?
答案1
我还使用 Puppet 部署了 RabbitMQ 集群,实际上您不必同时启动所有节点。
我通常做的事情,并且到目前为止对我有效的是:
- 安装 RabbitMQ(RPM 或 DEB)
- 在每个节点上设置 hosts 文件,以包含所有三个的条目。例如:
。
192.168.1.11 dev-c1n01-rabbitmq.example.com dev-c1n01-rabbitmq
192.168.1.12 dev-c1n02-rabbitmq.example.com dev-c1n02-rabbitmq
192.168.1.13 dev-c1n03-rabbitmq.example.com dev-c1n03-rabbitmq
我们集群在一起的节点(因为我不想依赖可用的 DNS)* 部署 rabbitmq.config
。
[
{rabbit, [
{cluster_nodes, {['rabbit@dev-c1n01-rabbitmq', 'rabbit@dev-c1n02-rabbitmq', 'rabbit@dev-c1n03-rabbitmq'], disc}},
{cluster_partition_handling, pause_minority},
{disk_free_limit, 2147483648},
{heartbeat, 0},
{tcp_listen_options, [binary, {backlog, 1024}, {nodelay, true}, {keepalive, true} ]},
{vm_memory_high_watermark, 0.6},
{default_user, <<"admin">>},
{default_pass, <<"somedefaultpass">>}
]},
{kernel, [
]}
,
{rabbitmq_management, [
{listener, [
{port, 15672}
]}
]}
].
% EOF
- 部署 erlang.cookie
要创建 Erlang Cookie,我通常使用http://passwordsgenerator.net/并将其设置为仅由大写字母组成的 20 个字符的字符串。然后,将此字符串放入 /var/lib/rabbitmq/.erlang.cookie 中,如下所示:
echo -n 'LCQLSHVOPZFHRUXMMAPF' > /var/lib/rabbitmq/.erlang.cookie
- 启动节点(只要它们具有相同的 erlang.cookie 和 rabbitmq.config,顺序无关紧要)
这应该对你有用。已在 3.2、3.3 和 3.5 版本上测试。
答案2
我在这方面取得了一些进展。
问题似乎与使用内存节点而不是光盘rabbitmq.config 文件中的节点。摘自文档:
RAM 节点是一种高级用例;设置第一个集群时,您不应该使用它们。您应该有足够的磁盘节点来处理您的冗余要求,然后根据需要添加额外的 RAM 节点以进行扩展。
仅包含 RAM 节点的集群非常脆弱;如果集群停止,您将无法重新启动它,并且会丢失所有数据。RabbitMQ 在许多情况下会阻止创建仅包含 RAM 节点的集群,但无法完全阻止。
当我将配置文件更改为使用“disc”而不是“ram”时,集群创建变得更加稳定。
[{rabbit,
[{cluster_nodes, {['rabbit@rabbit1', 'rabbit@rabbit2', 'rabbit@rabbit3'],disc}}]}].