You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Swarm中RabbitMQ自动集群配置失败求助

在Docker Swarm中配置RabbitMQ自动集群失败的问题排查与解决

我尝试在Docker Swarm中部署RabbitMQ集群,查阅相关文档并测试了多种配置组合,但自动集群始终无法生效,所有节点都以独立模式运行。不过手动进入容器执行rabbitmqctl命令可以完成集群配置。

当前使用的docker-compose.yml(v3.9)

version: "3.9"

services:
  rabbitmq-01:
    image: bitnami/rabbitmq:3.11
    #user: "1001"
    hostname: rabbitmq-01
    healthcheck:
      test: ["CMD", "rabbitmq-diagnostics", "check_running"]
      interval: 60s
      timeout: 10s
      retries: 3
    environment:
      - RABBITMQ_USERNAME=admin
      - RABBITMQ_PASSWORD=admin
      - RABBITMQ_FORCE_BOOT=true
      - RABBITMQ_ERL_COOKIE=$ecure$string
      - RABBITMQ_NODE_NAME=rabbit@rabbitmq-01
      - RABBITMQ_VM_MEMORY_HIGH_WATERMARK=300M
      - RABBITMQ_DISK_FREE_ABSOLUTE_LIMIT=500M
    configs:
      - source: rabbitmq-01
        target: /bitnami/rabbitmq/conf/custom.conf
        uid: "1001"
        gid: "1001"
        mode: 0644
    ports:
      - target: 15672
        published: 15672
        protocol: tcp
        mode: host
    networks:
      - rabbitmq
    volumes:
      - rabbitmq-01-data:/bitnami/rabbitmq/mnesia
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 300M
        reservations:
          cpus: '0.25'
          memory: 150M
      restart_policy:
        condition: any
        delay: 30s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node.labels.rabbitmq == 01]

  rabbitmq-02:
    image: bitnami/rabbitmq:3.11
    #user: "1001"
    hostname: rabbitmq-02
    healthcheck:
      test: ["CMD", "rabbitmq-diagnostics", "check_running"]
      interval: 60s
      timeout: 10s
      retries: 3
    environment:
      - RABBITMQ_USERNAME=admin
      - RABBITMQ_PASSWORD=admin
      - RABBITMQ_FORCE_BOOT=true
      - RABBITMQ_ERL_COOKIE=$ecure$string
      - RABBITMQ_NODE_NAME=rabbit@rabbitmq-02
      - RABBITMQ_CLUSTER_NODE_NAME=rabbit@rabbitmq-02
      - RABBITMQ_VM_MEMORY_HIGH_WATERMARK=300M
      - RABBITMQ_DISK_FREE_ABSOLUTE_LIMIT=500M
    configs:
      - source: rabbitmq-02
        target: /bitnami/rabbitmq/conf/custom.conf
        uid: "1001"
        gid: "1001"
        mode: 0644
    ports:
      - target: 15672
        published: 15672
        protocol: tcp
        mode: host
    networks:
      - rabbitmq
    volumes:
      - rabbitmq-02-data:/bitnami/rabbitmq/mnesia
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 300M
        reservations:
          cpus: '0.25'
          memory: 150M
      restart_policy:
        condition: any
        delay: 30s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node.labels.rabbitmq == 02]

  rabbitmq-03:
    image: bitnami/rabbitmq:3.11
    #user: "1001"
    hostname: rabbitmq-03
    healthcheck:
      test: ["CMD", "rabbitmq-diagnostics", "check_running"]
      interval: 60s
      timeout: 10s
      retries: 3
    environment:
      - RABBITMQ_USERNAME=admin
      - RABBITMQ_PASSWORD=admin
      - RABBITMQ_FORCE_BOOT=true
      - RABBITMQ_ERL_COOKIE=$ecure$string
      - RABBITMQ_NODE_NAME=rabbit@rabbitmq-03
      - RABBITMQ_CLUSTER_NODE_NAME=rabbit@rabbitmq-02
      - RABBITMQ_VM_MEMORY_HIGH_WATERMARK=300M
      - RABBITMQ_DISK_FREE_ABSOLUTE_LIMIT=500M
    configs:
      - source: rabbitmq-03
        target: /bitnami/rabbitmq/conf/custom.conf
        uid: "1001"
        gid: "1001"
        mode: 0644
    ports:
      - target: 15672
        published: 15672
        protocol: tcp
        mode: host
    networks:
      - rabbitmq
    volumes:
      - rabbitmq-03-data:/bitnami/rabbitmq/mnesia
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 300M
        reservations:
          cpus: '0.25'
          memory: 150M
      restart_policy:
        condition: any
        delay: 30s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node.labels.rabbitmq == 03]

networks:
  rabbitmq:
configs:
  rabbitmq-01:
    file: config/rabbitmq/rabbitmq-01.conf
  rabbitmq-02:
    file: config/rabbitmq/rabbitmq-02.conf
  rabbitmq-03:
    file: config/rabbitmq/rabbitmq-03.conf
volumes:
  rabbitmq-01-data:
  rabbitmq-02-data:
  rabbitmq-03-data:

RabbitMQ配置文件(以rabbitmq-01.conf为例)

listeners.tcp.default = 5672
loopback_users.guest = false
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-01
cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-02
cluster_formation.classic_config.nodes.3 = rabbit@rabbitmq-03
# Don't remove cluster members unknown to the peer discovery backend but log
# warnings.
#
# This setting can only be used if a compatible peer discovery plugin is enabled.
cluster_formation.node_cleanup.only_log_warning = true
# perform the check every 90 seconds
cluster_formation.node_cleanup.interval = 90
# Retry peer discovery operations up to ten times
cluster_formation.discovery_retry_limit = 10
# 500 milliseconds
cluster_formation.discovery_retry_interval = 5000

已尝试的配置组合

  • 为每个容器挂载相同的rabbitmq.conf文件
  • 为每个容器挂载不同的配置文件
  • 为每个容器挂载仅包含自身节点信息的配置文件(注释掉其他节点)
  • 不挂载配置文件,尝试通过Bitnami环境变量RABBITMQ_CLUSTER_NODE_NAME配置集群
  • 以上所有场景均切换使用RabbitMQ官方镜像测试

测试现象

  • 每次测试前都会删除所有存储卷,避免旧配置干扰
  • 使用官方镜像时,日志显示节点发现操作超时,调整重试间隔无效果
  • 使用Bitnami镜像时,配置文件被正确读取,但无集群相关日志输出,节点仍为独立状态
  • 手动进入容器执行rabbitmqctl join_cluster rabbit@rabbitmq-01等命令可成功组建集群

解决方案

1. 确保ERL Cookie完全一致

所有节点的ERL Cookie必须完全相同,这是RabbitMQ节点通信的核心凭证。建议直接写死固定值(避免环境变量引用的解析问题),示例:

- RABBITMQ_ERL_COOKIE=my_secure_fixed_cookie_123

2. 移除强制独立启动参数

RABBITMQ_FORCE_BOOT=true会强制节点以独立模式启动,直接阻止集群加入逻辑,所有节点都要删除这个环境变量。

3. 修正Bitnami镜像的集群环境变量配置

Bitnami镜像依赖特定变量实现自动集群,无需手动挂载配置文件:

  • 主节点(rabbitmq-01)无需设置RABBITMQ_CLUSTER_NODE_NAME
  • 从节点(rabbitmq-02/03)设置RABBITMQ_CLUSTER_NODE_NAME=rabbit@rabbitmq-01(指向主节点)
  • 所有节点添加RABBITMQ_CLUSTER_CREATOR=rabbit@rabbitmq-01指定集群创建者

修正后的从节点环境变量示例:

environment:
  - RABBITMQ_USERNAME=admin
  - RABBITMQ_PASSWORD=admin
  - RABBITMQ_ERL_COOKIE=my_secure_fixed_cookie_123
  - RABBITMQ_NODE_NAME=rabbit@rabbitmq-02
  - RABBITMQ_CLUSTER_NODE_NAME=rabbit@rabbitmq-01
  - RABBITMQ_CLUSTER_CREATOR=rabbit@rabbitmq-01
  - RABBITMQ_VM_MEMORY_HIGH_WATERMARK=300M
  - RABBITMQ_DISK_FREE_ABSOLUTE_LIMIT=500M

4. 调整健康检查逻辑

将健康检查改为验证节点就绪状态,确保主节点完全启动后从节点再尝试加入:

healthcheck:
  test: ["CMD", "rabbitmq-diagnostics", "check_ready"]
  interval: 10s
  timeout: 5s
  retries: 10

5. 优化部署顺序

在Docker Swarm中分阶段部署,先启动主节点并等待就绪,再部署从节点:

# 先部署主节点
docker stack deploy -c docker-compose.yml rabbitmq --prune --limit rabbitmq-01=1

# 等待主节点就绪
sleep 60

# 部署所有节点
docker stack deploy -c docker-compose.yml rabbitmq --prune

6. 官方镜像的补充配置(若使用官方镜像)

  • 确保所有节点的配置文件完全相同,包含全部集群节点信息
  • 确认rabbitmq_peer_discovery_classic_config插件已启用(默认已启用,可通过rabbitmq-plugins list验证)

内容的提问来源于stack exchange,提问作者Miklós

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 07:58:10