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)
  • 在每個節點上設定主機文件,以包含所有三個節點的條目。例子:

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

相關內容