Docker + Rabbitmq 集群部署方案
一、环境准备
1. 服务器信息
| 服务器 | IP 地址 | 节点名称 | 角色 | 开放端口(防火墙) |
|---|---|---|---|---|
| server1 | 192.168.144.144 | rabbit@server1 | 主节点 | 5672(AMQP)、15672(管理界面)、4369(Erlang 节点发现)、25672(集群内部通信) |
| server2 | 192.168.144.145 | rabbit@server2 | 从节点 | 同上 |
2. 防火墙配置(两台台服务器都执行)
确保集群通信端口开放(以 firewalld 为例):
# 开放 RabbitMQ 必要端口 sudo firewall-cmd --permanent --add-port=5672/tcp # AMQP 协议 sudo firewall-cmd --permanent --add-port=15672/tcp # 管理界面 sudo firewall-cmd --permanent --add-port=4369/tcp # Erlang 节点发现(epmd) sudo firewall-cmd --permanent --add-port=25672/tcp # 集群内部通信(inter-node) sudo firewall-cmd --reload
启用IPv4转发功
临时生效方案
执行命令立即启用(重启后失效):
echo 1 > /proc/sys/net/ipv4/ip_forward
永久生效方案
修改系统配置文件:
# 编辑 vi /etc/sysctl.conf # 确保已开启 net.ipv4.ip_forward=1 # 生效 sudo sysctl -p
重启docker
systemctl restart docker
二、部署台服务器分别部署 RabbitMQ 节点
1. 在 server1(192.168.144.144)部署主节点
请按照实际修改
--name rabbitmq-node1 # docker名称
--hostname server1 # 主机名(集群识别节点的关键,需唯一)
-e RABBITMQ_ERLANG_COOKIE="QXJZRWTBHVGFACBVLUVC" # 集群 Cookie,2 节点必须一致
-e RABBITMQ_DEFAULT_USER=admin # 管理界面用户名
-e RABBITMQ_DEFAULT_PASS=mC2aF0uH3aQ3iR2qA4bM1eA4 # 管理界面密码
-v /data/rabbitmq/node1:/var/lib/rabbitmq # 数据持久化(可选,需提前创建目录)
rabbitmq:4-management # 4最新版本,可以指定版本如:rabbitmq:4.0-management 或者rabbitmq:3-management
# 拉取 RabbitMQ 镜像(带管理界面) docker pull rabbitmq:4-management # 启动主节点容器(指定数据卷久化) # 如果是arm架构的cpu需要增加参数 --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登录,确认节点rabbit@server1正常运行。
2. 在 server2(192.168.144.145)部署从节点
# 拉取镜像(同上) docker pull rabbitmq:4-management # 启动从节点容器(注意主机名和端口映射与 server1 区分) # 如果是arm架构的cpu需要增加参数 --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,确认节点rabbit@server2正常运行。
三、配置各节点主机名对应的IP
1. 各节点处理一致
# 进入 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 的节点加入 server1 的集群
1. 在 server2 中操作从节点,加入集群
# 进入 server2 的容器 docker exec -it rabbitmq-node2 bash # 停止 RabbitMQ 应用(保留 Erlang 节点运行) rabbitmqctl stop_app # 重置节点(首次加入集群需执行,清除原有数据) rabbitmqctl reset # 加入 server1 的集群(通过 server1 的 IP 或主机名访问主节点) # 格式:rabbitmqctl join_cluster 主节点名称@主节点主机名 rabbitmqctl join_cluster rabbit@server1 # 启动 RabbitMQ 应用 rabbitmqctl start_app # 退出容器 exit
- 关键说明:主节点名称格式为
rabbit@主机名(主机名是 server1 容器的--hostname参数值,即server1)。若通过主机名无法访问,可替换为 server1 的 IP
五、验证集群状态
1. 在任意节点查看集群状态
# 在 server1 执行 docker exec -it rabbitmq-node1 rabbitmqctl cluster_status # 或在 server2 执行 docker exec -it rabbitmq-node2 rabbitmqctl cluster_status
正常输出应包含 2 个节点:
Cluster status of node rabbit@server1 ... Basics Cluster name: rabbit@server1 Disk Nodes rabbit@server1 rabbit@server2 ...
2. 管理界面验证
访问任意节点的管理界面(如 http://192.168.144.144:15672),在 Admin → Cluster 中可看到两个节点均为 running 状态。
五、配置镜像队列(高可用)
为保证队列数据在 2 个节点间同步(避免单节点故障丢失数据),需配置镜像队列策略:
# 在 server1 的主节点执行(策略会自动同步到集群)
docker exec -it rabbitmq-node1 bash
# 创建策略:所有队列(^)同步到集群所有节点(ha-mode: all)
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
# 查看策略是否生效
rabbitmqctl list_policies- 策略说明:
ha-mode: all表示队列会同步到集群所有节点(2 个节点均存储数据),确保任意节点故障时,队列仍可通过另一节点访问。
六、跨主机通信注意事项
Erlang Cookie 必须一致:2 个节点的 RABBITMQ_ERLANG_COOKIE 环境变量值必须完全相同(字符串区分大小写),否则无法建立集群通信。
主机名解析:若节点间通过主机名(如 server1)通信,需在 2 台服务器的 /etc/hosts 中添加主机名与 IP 的映射:
# 在 server1 和 server2 都执行(容器内部执行) echo "192.168.1.100 server1" >> /etc/hosts echo "192.168.1.101 server2" >> /etc/hosts
数据持久化:若需重启容器后保留数据,必须通过 -v 挂载数据卷(如 /data/rabbitmq/node1:/var/lib/rabbitmq),并确保宿主机目录权限正确(chmod 777 /data/rabbitmq/node1,避免容器内权限不足)。
节点故障处理:若 server1 故障,可在 server2 中执行 rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl start_app 重置节点为独立节点,待 server1 恢复后重新加入集群。
总结
2 台服务器部署 RabbitMQ 集群的核心是:
- 开放必要端口,确保跨主机通信;
- 同步 Erlang Cookie,实现节点身份验证;
- 通过
join_cluster命令将从节点加入主节点集群; - 配置镜像队列策略,保证数据高可用。
到此这篇关于Docker + Rabbitmq 集群部署方案的文章就介绍到这了,更多相关Docker Rabbitmq 集群内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Docker中镜像构建文件Dockerfile与相关命令的详细介绍
这篇文章主要介绍了Docker中镜像构建文件Dockerfile与相关命令的相关资料,文中介绍的很详细,相信对大家具有一定的参考价值,有需要的朋友们下面来一起看看吧。2017-02-02
docker操作Permission denied无权限的问题解决
我们日常需要docker环境进入容器配置或查看一些文件,本文主要介绍了docker操作Permission denied无权限的问题解决,具有一定的参考价值,感兴趣的可以了解一下2024-06-06
Docker aufs存储驱动layer、diff、mnt目录的区别介绍
这篇文章主要介绍了Docker aufs存储驱动layer、diff、mnt目录的区别,需要的朋友可以参考下2017-04-04


最新评论