Docker + Rabbitmq 集群部署方案
一、環(huán)境準備
1. 服務(wù)器信息
| 服務(wù)器 | IP 地址 | 節(jié)點名稱 | 角色 | 開放端口(防火墻) |
|---|---|---|---|---|
| server1 | 192.168.144.144 | rabbit@server1 | 主節(jié)點 | 5672(AMQP)、15672(管理界面)、4369(Erlang 節(jié)點發(fā)現(xiàn))、25672(集群內(nèi)部通信) |
| server2 | 192.168.144.145 | rabbit@server2 | 從節(jié)點 | 同上 |
2. 防火墻配置(兩臺臺服務(wù)器都執(zhí)行)
確保集群通信端口開放(以 firewalld 為例):
# 開放 RabbitMQ 必要端口 sudo firewall-cmd --permanent --add-port=5672/tcp # AMQP 協(xié)議 sudo firewall-cmd --permanent --add-port=15672/tcp # 管理界面 sudo firewall-cmd --permanent --add-port=4369/tcp # Erlang 節(jié)點發(fā)現(xiàn)(epmd) sudo firewall-cmd --permanent --add-port=25672/tcp # 集群內(nèi)部通信(inter-node) sudo firewall-cmd --reload
啟用IPv4轉(zhuǎn)發(fā)功
臨時生效方案
執(zhí)行命令立即啟用(重啟后失效):
echo 1 > /proc/sys/net/ipv4/ip_forward
永久生效方案
修改系統(tǒng)配置文件:
# 編輯 vi /etc/sysctl.conf # 確保已開啟 net.ipv4.ip_forward=1 # 生效 sudo sysctl -p
重啟docker
systemctl restart docker
二、部署臺服務(wù)器分別部署 RabbitMQ 節(jié)點
1. 在 server1(192.168.144.144)部署主節(jié)點
請按照實際修改
--name rabbitmq-node1 # docker名稱
--hostname server1 # 主機名(集群識別節(jié)點的關(guān)鍵,需唯一)
-e RABBITMQ_ERLANG_COOKIE="QXJZRWTBHVGFACBVLUVC" # 集群 Cookie,2 節(jié)點必須一致
-e RABBITMQ_DEFAULT_USER=admin # 管理界面用戶名
-e RABBITMQ_DEFAULT_PASS=mC2aF0uH3aQ3iR2qA4bM1eA4 # 管理界面密碼
-v /data/rabbitmq/node1:/var/lib/rabbitmq # 數(shù)據(jù)持久化(可選,需提前創(chuàng)建目錄)
rabbitmq:4-management # 4最新版本,可以指定版本如:rabbitmq:4.0-management 或者rabbitmq:3-management
# 拉取 RabbitMQ 鏡像(帶管理界面) docker pull rabbitmq:4-management # 啟動主節(jié)點容器(指定數(shù)據(jù)卷久化) # 如果是arm架構(gòu)的cpu需要增加參數(shù) --privileged docker run -d \ --name rabbitmq-node1 \ --hostname server1 \ -p 5672:5672 \ -p 15672:15672 \ -p 4369:4369 \ -p 25672:25672 \ -e RABBITMQ_ERLANG_COOKIE="QXJZRWTBHVGFACBVLUVC" \ -e RABBITMQ_DEFAULT_USER=admin \ -e RABBITMQ_DEFAULT_PASS=mC2aF0uH3aQ3iR2qA4bM1eA4 \ -v /data/rabbitmq/node1:/var/lib/rabbitmq \ rabbitmq:4-management
- 驗證:訪問
http://192.168.144.145:15672,用admin/admin123登錄,確認節(jié)點rabbit@server1正常運行。
2. 在 server2(192.168.144.145)部署從節(jié)點
# 拉取鏡像(同上) docker pull rabbitmq:4-management # 啟動從節(jié)點容器(注意主機名和端口映射與 server1 區(qū)分) # 如果是arm架構(gòu)的cpu需要增加參數(shù) --privileged docker run -d \ --name rabbitmq-node2 \ --hostname server2 \ -p 5672:5672 \ -p 15672:15672 \ -p 4369:4369 \ -p 25672:25672 \ -e RABBITMQ_ERLANG_COOKIE="QXJZRWTBHVGFACBVLUVC" \ -e RABBITMQ_DEFAULT_USER=admin \ -e RABBITMQ_DEFAULT_PASS=mC2aF0uH3aQ3iR2qA4bM1eA4 \ -v /data/rabbitmq/node2:/var/lib/rabbitmq \ rabbitmq:4-management
- 驗證:訪問
http://192.168.144.145:15672,確認節(jié)點rabbit@server2正常運行。
三、配置各節(jié)點主機名對應(yīng)的IP
1. 各節(jié)點處理一致
# 進入 server1 的容器 docker exec -it rabbitmq-node1 bash # 進入 server2 的容器同理 # docker exec -it rabbitmq-node2 bash # 增加域名映射 echo "192.168.144.144 server1" >> /etc/hosts echo "192.168.144.145 server2" >> /etc/hosts # 退出容器 exit
四、將 server2 的節(jié)點加入 server1 的集群
1. 在 server2 中操作從節(jié)點,加入集群
# 進入 server2 的容器 docker exec -it rabbitmq-node2 bash # 停止 RabbitMQ 應(yīng)用(保留 Erlang 節(jié)點運行) rabbitmqctl stop_app # 重置節(jié)點(首次加入集群需執(zhí)行,清除原有數(shù)據(jù)) rabbitmqctl reset # 加入 server1 的集群(通過 server1 的 IP 或主機名訪問主節(jié)點) # 格式:rabbitmqctl join_cluster 主節(jié)點名稱@主節(jié)點主機名 rabbitmqctl join_cluster rabbit@server1 # 啟動 RabbitMQ 應(yīng)用 rabbitmqctl start_app # 退出容器 exit
- 關(guān)鍵說明:主節(jié)點名稱格式為
rabbit@主機名(主機名是 server1 容器的--hostname參數(shù)值,即server1)。若通過主機名無法訪問,可替換為 server1 的 IP
五、驗證集群狀態(tài)
1. 在任意節(jié)點查看集群狀態(tài)
# 在 server1 執(zhí)行 docker exec -it rabbitmq-node1 rabbitmqctl cluster_status # 或在 server2 執(zhí)行 docker exec -it rabbitmq-node2 rabbitmqctl cluster_status
正常輸出應(yīng)包含 2 個節(jié)點:
Cluster status of node rabbit@server1 ... Basics Cluster name: rabbit@server1 Disk Nodes rabbit@server1 rabbit@server2 ...
2. 管理界面驗證
訪問任意節(jié)點的管理界面(如 http://192.168.144.144:15672),在 Admin → Cluster 中可看到兩個節(jié)點均為 running 狀態(tài)。
五、配置鏡像隊列(高可用)
為保證隊列數(shù)據(jù)在 2 個節(jié)點間同步(避免單節(jié)點故障丟失數(shù)據(jù)),需配置鏡像隊列策略:
# 在 server1 的主節(jié)點執(zhí)行(策略會自動同步到集群)
docker exec -it rabbitmq-node1 bash
# 創(chuàng)建策略:所有隊列(^)同步到集群所有節(jié)點(ha-mode: all)
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
# 查看策略是否生效
rabbitmqctl list_policies- 策略說明:
ha-mode: all表示隊列會同步到集群所有節(jié)點(2 個節(jié)點均存儲數(shù)據(jù)),確保任意節(jié)點故障時,隊列仍可通過另一節(jié)點訪問。
六、跨主機通信注意事項
Erlang Cookie 必須一致:2 個節(jié)點的 RABBITMQ_ERLANG_COOKIE 環(huán)境變量值必須完全相同(字符串區(qū)分大小寫),否則無法建立集群通信。
主機名解析:若節(jié)點間通過主機名(如 server1)通信,需在 2 臺服務(wù)器的 /etc/hosts 中添加主機名與 IP 的映射:
# 在 server1 和 server2 都執(zhí)行(容器內(nèi)部執(zhí)行) echo "192.168.1.100 server1" >> /etc/hosts echo "192.168.1.101 server2" >> /etc/hosts
數(shù)據(jù)持久化:若需重啟容器后保留數(shù)據(jù),必須通過 -v 掛載數(shù)據(jù)卷(如 /data/rabbitmq/node1:/var/lib/rabbitmq),并確保宿主機目錄權(quán)限正確(chmod 777 /data/rabbitmq/node1,避免容器內(nèi)權(quán)限不足)。
節(jié)點故障處理:若 server1 故障,可在 server2 中執(zhí)行 rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl start_app 重置節(jié)點為獨立節(jié)點,待 server1 恢復(fù)后重新加入集群。
總結(jié)
2 臺服務(wù)器部署 RabbitMQ 集群的核心是:
- 開放必要端口,確??缰鳈C通信;
- 同步 Erlang Cookie,實現(xiàn)節(jié)點身份驗證;
- 通過
join_cluster命令將從節(jié)點加入主節(jié)點集群; - 配置鏡像隊列策略,保證數(shù)據(jù)高可用。
到此這篇關(guān)于Docker + Rabbitmq 集群部署方案的文章就介紹到這了,更多相關(guān)Docker Rabbitmq 集群內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
prometheus監(jiān)控節(jié)點程序的安裝及卸載命令
這篇文章主要為大家介紹了prometheus監(jiān)控節(jié)點程序的安裝及卸載命令,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06
docker安裝nginx實現(xiàn)對springboot項目的負載均衡的操作方法
這篇文章主要介紹了docker安裝nginx實現(xiàn)對springboot項目的負載均衡的操作方法,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-06-06
Docker Compose搭建Redis主從復(fù)制環(huán)境的實現(xiàn)步驟
在Docker中搭建Redis主從架構(gòu)非常方便,下面是一個示例,演示如何使用Docker Compose設(shè)置一個Redis主從復(fù)制環(huán)境,文中有詳細的代碼示例,具有一定的參考價值,需要的朋友可以參考下2023-09-09
Docker的文件系統(tǒng)映射:主機與容器間目錄的雙向映射詳解
通過Docker的目錄映射功能,實現(xiàn)主機與容器間的數(shù)據(jù)共享與持久化存儲,使用-v或--mount參數(shù)在運行時設(shè)置主機與容器目錄映射,或通過DockerCompose配置文件實現(xiàn)自動化,此功能提升數(shù)據(jù)管理靈活性和效率2024-11-11

