RabbitMQ 集群自动配置

RabbitMQ 集群自动配置

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}}]}].

相关内容