✅安装

✅ 项目结构(每台机器)

假设你的 docker-compose.yml 在如下结构下:

/opt/soft/
├── docker-compose.yml
└── rabbitmq/
    ├── data/
    └── erlang.cookie

✅ 统一配置说明

项目
镜像 rabbitmq:4.0.4-management
用户名密码 rabbit / 123456
cookie 内容 RABBITMQCLUSTERCOOKIE(统一)
UID:GID 999:999(RabbitMQ容器内用户)
主机 IP 192.168.1.60 / .61 / .62
节点名 rabbit1 / rabbit2 / rabbit3

✅ 每台宿主机 docker-compose.yml

只需将以下内容 复制粘贴到你的 docker-compose.yml 末尾即可,不影响其他服务。

🧾 192.168.1.60(rabbit0)

  rabbitmq:
    image: rabbitmq:4.0.4
    container_name: rabbitmq
    restart: always
    network_mode: host
    hostname: rabbit0
    environment:
      TZ: Asia/Shanghai
      RABBITMQ_DEFAULT_USER: rabbit
      RABBITMQ_DEFAULT_PASS: 123456
      RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS: "-rabbitmq_management_agent disable_metrics_collector false"
    volumes:
      - ./rabbitmq/data:/var/lib/rabbitmq
      - ./rabbitmq/erlang.cookie:/var/lib/rabbitmq/.erlang.cookie
      

🧾 192.168.1.61(rabbit1)

  rabbitmq:
    image: rabbitmq:4.0.4
    container_name: rabbitmq
    restart: always
    network_mode: host
    hostname: rabbit1
    environment:
      TZ: Asia/Shanghai
      RABBITMQ_DEFAULT_USER: rabbit
      RABBITMQ_DEFAULT_PASS: 123456
      RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS: "-rabbitmq_management_agent disable_metrics_collector false"
    volumes:
      - ./rabbitmq/data:/var/lib/rabbitmq
      - ./rabbitmq/erlang.cookie:/var/lib/rabbitmq/.erlang.cookie

🧾 192.168.1.62(rabbit2)

  rabbitmq:
    image: rabbitmq:4.0.4
    container_name: rabbitmq
    restart: always
    network_mode: host
    hostname: rabbit2
    environment:
      TZ: Asia/Shanghai
      RABBITMQ_DEFAULT_USER: rabbit
      RABBITMQ_DEFAULT_PASS: 123456
      RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS: "-rabbitmq_management_agent disable_metrics_collector false"
      TZ: Asia/Shanghai
    volumes:
      - ./rabbitmq/data:/var/lib/rabbitmq
      - ./rabbitmq/erlang.cookie:/var/lib/rabbitmq/.erlang.cookie

✅ 生成并设置 .erlang.cookie(三台一样)

# 切换到项目根目录
cd /opt/soft

# 创建 rabbitmq 文件夹(如果还没)
mkdir -p rabbitmq/data

# 写入 cookie 文件
echo "RABBITMQCLUSTERCOOKIE" > rabbitmq/erlang.cookie

# 设置权限(必须)
chmod 400 rabbitmq/erlang.cookie

# 设置所有者(必须是 999:999)
chown 999:999 rabbitmq/erlang.cookie

✅ /etc/hosts 配置(三台都要配置)

三台机器上都执行,确保可以互相通过 hostname 通信

echo "
192.168.1.60 rabbit0
192.168.1.61 rabbit1
192.168.1.62 rabbit2
" >> /etc/hosts

✅ 启动 RabbitMQ(每台)

docker-compose up -d rabbitmq

✅ 加入集群命令(只在 rabbit1 / rabbit2 上执行)

👉 在 rabbit1 上执行(192.168.1.61)

docker exec -it rabbitmq rabbitmqctl stop_app
docker exec -it rabbitmq rabbitmqctl join_cluster rabbit@rabbit0
docker exec -it rabbitmq rabbitmqctl start_app

👉 在 rabbit2 上执行(192.168.1.62)

docker exec -it rabbitmq rabbitmqctl stop_app
docker exec -it rabbitmq rabbitmqctl join_cluster rabbit@rabbit0
docker exec -it rabbitmq rabbitmqctl start_app

✅ 开启webUI

docker exec -it rabbitmq rabbitmq-plugins enable rabbitmq_management

✅ 客户端设置 queue-type=quorum

因为经典模式队列,当主节点down掉,不会自动切换新leader。客户端新建队列时必须指定queue-type=quorum

4.0.4版本已经不支持设置策略。强制queue-type=quorum

✅验证

分别从命令行、Web UI、消息收发、Quorum 队列等多个角度进行确认。


用命令行检查集群状态

在任意一个节点容器中执行(推荐 rabbit@rabbit0):

docker exec -it rabbitmq rabbitmqctl cluster_status

你应当看到类似输出:

Cluster status of node rabbit@rabbit0 ...
[{nodes,[{disc,[rabbit@rabbit0,rabbit@rabbit1,rabbit@rabbit2]}]},
 {running_nodes,[rabbit@rabbit0,rabbit@rabbit1,rabbit@rabbit2]},
 {cluster_name,<<"rabbit@rabbit0">>},
 {partitions,[]},
 ...]

🔍 核心验证点:

字段 正常状态
nodes 三个都列出来(disk/ram 都行)
running_nodes 三个节点都显示
partitions 必须为空,表示无网络分裂

访问 Web 管理控制台(Management UI)

每个节点都有 Web 管理界面,访问:

http://192.168.1.60:15672
http://192.168.1.61:15672
http://192.168.1.62:15672

默认账号:

用户名:rabbit
密码:123456

✅ 检查界面中:

  • 【Overview】:节点数是否为 3
  • 【Nodes】:是否显示 rabbit@rabbit0、rabbit1、rabbit2 且全部 green
  • 【Queues】:是否能创建并看到队列
  • 【Connections】:后续可以看到生产者/消费者连接情况

创建 Quorum 队列并验证同步

在控制台中创建:

  • 进入任一节点 Web UI
  • 点「Queues」→ Add a new queue
  • 填写:
    • Name: test-quorum
    • Durable: ✅
    • Type: Quorum

然后在【Queues】中点击进去,能看到:

  • Leader Node 是哪个
  • 同步副本列表(Replicas)

可以在其他节点上打开 Web UI,进入同样的队列页面,会看到一样的信息。


客户端连接验证

你可以用如下连接串测试客户端连接:

amqp://rabbit:123456@192.168.1.60:5672,192.168.1.61:5672,192.168.1.62:5672

任一节点宕机,其他节点仍然能连接并消费/发布消息(前提是 Quorum Queue)。


模拟宕机测试容灾

执行:

docker stop rabbitmq

比如在 rabbit@rabbit0 上停止节点:

  • 观察其他节点是否仍在运行
  • 客户端连接是否受影响
  • test-quorum 队列是否还能收发消息

如果成功说明 Quorum Queue 容灾生效

rejected Unable to publish message. Check queue limits.


查看节点之间连接关系

你也可以看每个节点之间的通信链接:

docker exec -it rabbitmq rabbitmqctl report

会看到 node list、peer、连接、内存等详细信息。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐