温馨提示×

RabbitMQ Ubuntu集群怎么搭建

小樊
33
2025-12-28 15:44:19
栏目: 智能运维

Ubuntu 上搭建 RabbitMQ 集群的标准流程


一 环境准备与网络要求

  • 准备至少 3 台 Ubuntu 22.04/20.04 服务器,主机名唯一(如:rmq1、rmq2、rmq3),并在每台机器的 /etc/hosts 写入 IP 与主机名映射,确保节点间可互相解析。
  • 使用 NTP/Chrony 同步时间,避免分布式一致性问题。
  • 开放必要端口:5672(AMQP)15672(管理插件)25672(节点间通信/集群)
  • 生产建议各节点 Erlang/OTP 与 RabbitMQ 版本完全一致,减少兼容性问题。
  • 示例 /etc/hosts(三节点):
    192.168.1.11 rmq1
    192.168.1.12 rmq2
    192.168.1.13 rmq3
    
    以上为后续所有步骤的基础前提。

二 安装 Erlang 与 RabbitMQ

  • 安装 Erlang(示例为 Ubuntu 20.04 “focal”;若为 22.04 “jammy”,将 focal 替换为 jammy):
    sudo apt update
    sudo apt install -y erlang-nox
    
  • 添加 RabbitMQ 官方 APT 仓库并安装:
    curl -sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" \
      | sudo gpg --dearmor | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg >/dev/null
    echo "deb [signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://ppa.launchpad.net/rabbitmq/rabbitmq-erlang/ubuntu focal main" \
      | sudo tee /etc/apt/sources.list.d/rabbitmq.list
    echo "deb [signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://ppa.launchpad.net/rabbitmq/rabbitmq-server/ubuntu focal main" \
      | sudo tee -a /etc/apt/sources.list.d/rabbitmq.list
    sudo apt update
    sudo apt install -y rabbitmq-server
    
  • 启用管理插件(便于 Web 可视化管理与监控):
    sudo rabbitmq-plugins enable rabbitmq_management
    
  • 防火墙放行(如使用 UFW):
    sudo ufw allow 5672/tcp
    sudo ufw allow 15672/tcp
    sudo ufw allow 25672/tcp
    sudo ufw enable
    
  • 创建管理员用户(避免使用默认 guest/guest,其仅允许本机访问):
    sudo rabbitmqctl add_user admin <StrongPassword>
    sudo rabbitmqctl set_user_tags admin administrator
    sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
    
    完成后可通过 http://<节点IP>:15672 访问管理界面。

三 配置集群核心要点

  • 统一 Erlang Cookie(节点间认证密钥,必须一致):
    • Cookie 默认路径:/var/lib/rabbitmq/.erlang.cookie
    • 选择一台作为种子节点(如 rmq1),将其 Cookie 复制到其它节点,并设置权限为 400、属主为 rabbitmq:rabbitmq
      # 在 rmq2 上执行(从 rmq1 拷贝)
      sudo systemctl stop rabbitmq-server
      sudo scp rmq1:/var/lib/rabbitmq/.erlang.cookie /var/lib/rabbitmq/.erlang.cookie
      sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie
      sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
      sudo systemctl start rabbitmq-server
      
  • 将节点加入集群(在待加入节点上执行,示例以 rmq2 加入 rmq1):
    sudo rabbitmqctl stop_app          # 仅停止应用层
    sudo rabbitmqctl reset            # 首次加入或清库时使用
    sudo rabbitmqctl join_cluster rabbit@rmq1   # 默认以磁盘节点加入;如需内存节点,追加 --ram
    sudo rabbitmqctl start_app         # 启动应用
    
  • 节点类型说明:未指定 –ram磁盘节点(disc),指定后为 内存节点(ram);建议至少保留 1 个磁盘节点 以持久化元数据。
  • 验证集群状态(在任意节点执行):
    sudo rabbitmqctl cluster_status
    
    输出应包含所有节点且状态为 running

四 高可用与负载均衡

  • 镜像队列(传统方式,适合已有业务迁移):
    • 将所有队列镜像到所有节点(示例策略):
      sudo rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
      
    • 可按业务前缀精细化策略,例如仅镜像以 ^my_queue$ 开头的队列。
  • 仲裁队列(Quorum Queues,RabbitMQ 3.8+ 推荐,基于 Raft 协议,强一致):
    • 将所有队列设置为 3 副本 的仲裁队列(示例策略):
      sudo rabbitmqctl set_policy ha-quorum "^" \
        '{"ha-mode":"exactly","ha-params":3,"ha-sync-mode":"automatic"}' \
        --priority 0 --apply-to queues
      
    • 参数说明:^ 匹配所有队列;ha-mode: “exactly” 精确指定副本数;ha-params: 3 表示 3 个副本ha-sync-mode: “automatic” 自动同步队列数据。
  • 负载均衡(以 HAProxy 为例,提供 AMQP 与管理面的统一入口):
    • 安装:
      sudo apt install -y haproxy
      
    • 示例配置片段(/etc/haproxy/haproxy.cfg):
      frontend rabbitmq-amqp
        bind *:5672
        default_backend rabbitmq_nodes
      
      backend rabbitmq_nodes
        balance roundrobin
        server rmq1 192.168.1.11:5672 check
        server rmq2 192.168.1.12:5672 check
        server rmq3 192.168.1.13:5672 check
      
      frontend rabbitmq-mgmt
        bind *:15672
        default_backend rabbitmq_mgmt_nodes
      
      backend rabbitmq_mgmt_nodes
        balance roundrobin
        server rmq1 192.168.1.11:15672 check
        server rmq2 192.168.1.12:15672 check
        server rmq3 192.168.1.13:15672 check
      
    以上策略与配置可显著提升集群可用性与吞吐能力。

五 常见问题与快速排查

  • 节点无法加入集群(nodedown):
    • 检查 /etc/hosts 主机名解析是否正确(ping 对方主机名应通)。
    • 确认 Erlang Cookie 内容一致且权限为 400、属主 rabbitmq:rabbitmq
    • 确保 4369(epmd)25672(集群通信) 端口未被防火墙拦截。
  • 管理界面无法远程登录:
    • 默认 guest/guest 仅允许 localhost 访问,需创建 管理员用户 并用其登录 http://<节点IP>:15672
  • 版本不兼容:
    • 生产环境建议各节点 Erlang/OTP 与 RabbitMQ 版本完全一致,避免集群异常。
  • 时间漂移:
    • 使用 NTP/Chrony 同步时间,避免因时钟漂移导致集群异常。
      以上为最常见的报错场景与处理方向。

0