Ubuntu環境下RabbitMQ集群搭建步驟
rabbit1
、rabbit2
、rabbit3
),并通過/etc/hosts
文件實現主機名解析(所有節點需保持一致)。例如:192.168.1.101 rabbit1
192.168.1.102 rabbit2
192.168.1.103 rabbit3
驗證解析有效性:ping rabbit2
(應能正常訪問)。ntp
或chrony
同步所有節點時間(避免腦裂問題)。例如安裝ntp
:sudo apt update && sudo apt install -y ntp
sudo systemctl enable --now ntp
sudo apt update
sudo apt install -y erlang
# 添加RabbitMQ官方源密鑰
curl -s https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null
# 添加源列表
echo "deb [signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list
sudo apt update
# 安裝RabbitMQ(含管理插件)
sudo apt install -y rabbitmq-server
Erlang Cookie是節點間認證的憑證,所有節點的Cookie文件內容必須完全一致(默認路徑:/var/lib/rabbitmq/.erlang.cookie
)。
rabbit1
)上復制Cookie文件到其他節點:scp /var/lib/rabbitmq/.erlang.cookie rabbit2:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie rabbit3:/var/lib/rabbitmq/
sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie
sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
sudo systemctl restart rabbitmq-server
sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server
active (running)
):sudo systemctl status rabbitmq-server
sudo rabbitmq-plugins enable rabbitmq_management
管理界面默認訪問地址:http://{節點IP}:15672
(初始賬號guest
/guest
,僅限本地訪問)。rabbit2
、rabbit3
加入rabbit1
集群為例):
rabbit2
上執行:sudo rabbitmqctl stop_app
sudo rabbitmqctl reset
rabbit2
加入rabbit1
集群(rabbit1
為主節點):sudo rabbitmqctl join_cluster rabbit@rabbit1
注:rabbit@rabbit1
中的rabbit1
是主節點的主機名(需與/etc/hosts
中的配置一致)。sudo rabbitmqctl start_app
rabbit3
加入集群(命令同rabbit2
)。在任意節點(如rabbit1
)上執行以下命令,查看集群節點列表及狀態:
sudo rabbitmqctl cluster_status
正常輸出應包含所有節點(如rabbit@rabbit1
、rabbit@rabbit2
、rabbit@rabbit3
),且狀態為running
。
鏡像隊列將隊列數據復制到多個節點,避免單點故障。推薦使用仲裁隊列(Quorum Queues)(RabbitMQ 3.8+版本,替代傳統鏡像隊列,基于Raft協議保證強一致性)。
ha-mode: "exactly"
表示副本數,ha-params: 3
表示3個副本):sudo rabbitmqctl set_policy ha-all "^" '{"ha-mode":"exactly","ha-params":3,"ha-sync-mode":"automatic"}' --priority 0 --apply-to queues
參數說明:
^
:匹配所有隊列名稱;ha-mode: "exactly"
:精確指定副本數;ha-params: 3
:3個副本(需與集群節點數一致);ha-sync-mode: "automatic"
:自動同步隊列數據(避免手動同步)。test_queue
),并設置為持久化(durable: true
)。Hello, RabbitMQ Cluster
)。rabbit1
的RabbitMQ服務(sudo systemctl stop rabbitmq-server
)。rabbit2
或rabbit3
的管理界面查看test_queue
,應仍能訪問消息(說明隊列已鏡像到其他節點)。join_cluster
命令中指定--ram
參數:sudo rabbitmqctl join_cluster --ram rabbit@rabbit1
/etc/rabbitmq/rabbitmq.conf
中添加:cluster_partition_handling = pause_minority
該策略會在網絡分區時暫停少數派節點(如3節點集群中1節點分區,暫停該節點),待網絡恢復后自動同步數據。durable: true
(隊列持久化),發布消息時設置delivery_mode: 2
(消息持久化),確保節點重啟后數據不丟失。