Docker + Rabbitmq 集群部署方案

 更新时间:2025年12月15日 11:29:30   作者:路過的好心人  
本文详细描述了如何在两台服务器上部署RabbitMQ集群,包括环境准备、防火墙配置、节点部署、集群配置、镜像队列配置以及节点故障处理,感兴趣的朋友跟随小编一起看看吧

一、环境准备

1. 服务器信息

服务器IP 地址节点名称角色开放端口(防火墙)
server1192.168.144.144rabbit@server1主节点5672(AMQP)、15672(管理界面)、4369(Erlang 节点发现)、25672(集群内部通信)
server2192.168.144.145rabbit@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 集群的核心是:

  1. 开放必要端口,确保跨主机通信;
  2. 同步 Erlang Cookie,实现节点身份验证;
  3. 通过 join_cluster 命令将从节点加入主节点集群;
  4. 配置镜像队列策略,保证数据高可用。

到此这篇关于Docker + Rabbitmq 集群部署方案的文章就介绍到这了,更多相关Docker Rabbitmq 集群内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何使用docker极简打包java.jar镜像并启动

    如何使用docker极简打包java.jar镜像并启动

    这篇文章主要介绍了如何使用docker极简打包java.jar镜像并启动,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • prometheus监控节点程序的安装及卸载命令

    prometheus监控节点程序的安装及卸载命令

    这篇文章主要为大家介绍了prometheus监控节点程序的安装及卸载命令,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • docker安装nginx实现对springboot项目的负载均衡的操作方法

    docker安装nginx实现对springboot项目的负载均衡的操作方法

    这篇文章主要介绍了docker安装nginx实现对springboot项目的负载均衡的操作方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • Docker Compose搭建Redis主从复制环境的实现步骤

    Docker Compose搭建Redis主从复制环境的实现步骤

    在Docker中搭建Redis主从架构非常方便,下面是一个示例,演示如何使用Docker Compose设置一个Redis主从复制环境,文中有详细的代码示例,具有一定的参考价值,需要的朋友可以参考下
    2023-09-09
  • 解决docker拉取mysql镜像太慢的情况

    解决docker拉取mysql镜像太慢的情况

    这篇文章主要介绍了解决docker拉取mysql镜像太慢的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Docker的文件系统映射:主机与容器间目录的双向映射详解

    Docker的文件系统映射:主机与容器间目录的双向映射详解

    通过Docker的目录映射功能,实现主机与容器间的数据共享与持久化存储,使用-v或--mount参数在运行时设置主机与容器目录映射,或通过DockerCompose配置文件实现自动化,此功能提升数据管理灵活性和效率
    2024-11-11
  • docker容器无法解析域名的解决方案

    docker容器无法解析域名的解决方案

    这篇文章主要介绍了docker容器无法解析域名的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-10-10
  • Linux下Docker版本升级的保姆级教程

    Linux下Docker版本升级的保姆级教程

    之前docker直接使用centos的yum -y install docker安装的,安装源的版本比较老,最近项目计划使用docker的一些新特性,所以需要将docker版本做一下升级,本文详细记录了升级的过程,需要的朋友可以参考下
    2025-08-08
  • Docker 中 MySQL 的部署与管理技巧

    Docker 中 MySQL 的部署与管理技巧

    这篇文章主要介绍了Docker 中 MySQL 的部署与管理技巧,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • docker-compose安装及执行命令

    docker-compose安装及执行命令

    Docker Compose是一个用来定义和运行复杂应用的Docker工具,这篇文章主要介绍了docker-compose安装方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09

最新评论