RabbitMQ高可用方案在CentOS上的實現指南
RabbitMQ的高可用性(High Availability, HA)通過集群部署和鏡像隊列實現,確保消息不丟失、服務不中斷。以下是在CentOS系統上搭建RabbitMQ高可用集群的詳細步驟:
RabbitMQ基于Erlang編寫,需先安裝兼容版本的Erlang。以CentOS 7/8為例,可通過Erlang Solutions官方倉庫安裝:
# 添加Erlang倉庫
sudo tee /etc/yum.repos.d/erlang.repo <<EOF
[erlang-solutions]
name=Erlang Solutions repository for CentOS-$releasever - $basearch
baseurl=https://packages.erlang-solutions.com/erlang/rpm/centos/$releasever/$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.erlang-solutions.com/erlang/solutions.asc
EOF
# 安裝Erlang
sudo yum install -y erlang
# 驗證安裝
erl -version # 應輸出Erlang版本信息
添加RabbitMQ官方倉庫并安裝:
# 添加RabbitMQ倉庫
sudo tee /etc/yum.repos.d/rabbitmq.repo <<EOF
[rabbitmq-server]
name=RabbitMQ repository for CentOS-$releasever - $basearch
baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/$releasever/$basearch
repo_gpgcheck=1
gpgcheck=1
enabled=1
gpgkey=https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
EOF
# 安裝RabbitMQ
sudo yum install -y rabbitmq-server
# 啟動服務并設置開機自啟
sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server
確保節點間能通過主機名互相解析(替換node1、node2等為實際主機名,IP為節點IP):
# 編輯/etc/hosts文件(所有節點執行)
cat >> /etc/hosts <<EOF
192.168.1.10 node1
192.168.1.11 node2
192.168.1.12 node3
EOF
# 設置主機名(每節點對應自己的主機名)
sudo hostnamectl set-hostname node1 # node1節點執行
sudo hostnamectl set-hostname node2 # node2節點執行
# ...其他節點同理
開放RabbitMQ必需端口(5672:AMQP、15672:管理界面、4369:epmd、25672:集群通信):
sudo firewall-cmd --permanent --zone=public --add-port=5672/tcp
sudo firewall-cmd --permanent --zone=public --add-port=15672/tcp
sudo firewall-cmd --permanent --zone=public --add-port=4369/tcp
sudo firewall-cmd --permanent --zone=public --add-port=25672/tcp
sudo firewall-cmd --reload
SELinux可能阻止節點間通信,建議臨時關閉:
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
sudo setenforce 0
RabbitMQ節點通過Erlang Cookie(位于/var/lib/rabbitmq/.erlang.cookie)實現身份認證,所有節點的Cookie內容必須完全一致。
從主節點(如node1)復制Cookie到其他節點:
# 主節點查看Cookie
cat /var/lib/rabbitmq/.erlang.cookie
# 將Cookie復制到其他節點(替換user為實際用戶名)
scp /var/lib/rabbitmq/.erlang.cookie user@node2:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie user@node3:/var/lib/rabbitmq/
確保Cookie文件權限為400,屬主為rabbitmq:
# 所有節點執行
sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie
sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
在所有節點上啟動RabbitMQ并設置開機自啟:
sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server
通過Web界面監控集群狀態:
# 所有節點執行
sudo rabbitmq-plugins enable rabbitmq_management
# 訪問地址:http://<節點IP>:15672(默認賬號/密碼:guest/guest)
選擇主節點(如node1),其他節點(node2、node3)加入該集群:
# 在主節點(node1)上確認狀態(查看節點名稱,如rabbit@node1)
sudo rabbitmqctl cluster_status
# 在從節點(如node2)上執行:
sudo rabbitmqctl stop_app # 停止應用
sudo rabbitmqctl reset # 重置節點(清除本地數據)
sudo rabbitmqctl join_cluster rabbit@node1 # 加入主節點集群
sudo rabbitmqctl start_app # 啟動應用
# 重復上述步驟讓node3加入集群
在任意節點上執行以下命令,確認所有節點已加入集群:
sudo rabbitmqctl cluster_status
# 輸出應包含所有節點(如node1、node2、node3)的狀態信息
鏡像隊列將隊列數據復制到多個節點,確保節點故障時消息不丟失。以下配置將所有隊列鏡像到所有節點(ha-mode: all):
# 所有節點執行
sudo rabbitmq-plugins enable rabbitmq_mirroring_queue
在任意節點上執行以下命令,將所有隊列(匹配^正則表達式,即所有隊列)設置為鏡像隊列:
sudo rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all", "ha-sync-mode":"automatic"}'
# 參數說明:
# - ha-mode: all(所有節點鏡像);可選exactly(指定數量節點)、nodes(指定節點列表)
# - ha-sync-mode: automatic(自動同步);可選manual(手動同步,適合大數據量場景)
查看已設置的策略:
sudo rabbitmqctl list_policies
# 應輸出ha-all策略,應用于所有隊列("^")
durable=true,發送消息時設置delivery_mode=2,確保消息不因節點重啟丟失。ulimit -n 65536)和進程數限制(ulimit -u 4096),避免高并發下資源耗盡。通過以上步驟,即可在CentOS上搭建高可用的RabbitMQ集群,確保消息中間件的穩定性和可靠性。