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