温馨提示×

RabbitMQ集群Ubuntu上怎么搭建

小樊
43
2025-11-15 07:04:32
栏目: 智能运维

Ubuntu 上搭建 RabbitMQ 集群

一 环境准备与前置检查

  • 准备至少 3 台 Ubuntu 22.04/24.04 服务器(也可单机伪集群用于测试),确保各节点间 主机名可解析(建议通过 /etc/hosts 或内网 DNS),并开放必要端口:4369(epmd)、25672(集群通信)、5672(AMQP)、15672(管理界面)。
  • 各节点 Erlang/OTP 与 RabbitMQ 版本保持一致,避免不兼容导致加入集群失败。
  • 建议为集群设置固定主机名(如 node1、node2、node3),并在所有节点同步 /etc/hosts
  • 如需远程管理,启用管理插件并开放 15672;生产环境建议前置 HAProxy/Keepalived 做连接入口高可用。

二 安装与基础配置

  • 安装 Erlang 与 RabbitMQ(所有节点):
    sudo apt update
    sudo apt-get install -y erlang rabbitmq-server
    sudo systemctl enable --now rabbitmq-server
    
  • 启用管理插件(可选,便于 Web 管理与监控):
    sudo rabbitmq-plugins enable rabbitmq_management
    
  • 统一 Erlang Cookie(节点间认证密钥,必须一致):
    • 默认路径:/var/lib/rabbitmq/.erlang.cookie
    • 建议从主节点拷贝到其它节点,并保持权限与属主一致:
      # 在 node1 上查看
      sudo cat /var/lib/rabbitmq/.erlang.cookie
      # 在 node2/3 上
      sudo systemctl stop rabbitmq-server
      sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie
      sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
      # 用 scp 从 node1 覆盖 node2/3 的 .erlang.cookie
      sudo scp node1:/var/lib/rabbitmq/.erlang.cookie /var/lib/rabbitmq/.erlang.cookie
      sudo systemctl start rabbitmq-server
      
  • 主机名与 hosts 示例(所有节点一致):
    sudo hostnamectl set-hostname node1   # node2/node3 分别设置为 node2/node3
    echo "192.168.1.101 node1" | sudo tee -a /etc/hosts
    echo "192.168.1.102 node2" | sudo tee -a /etc/hosts
    echo "192.168.1.103 node3" | sudo tee -a /etc/hosts
    
  • 验证单机服务与插件:
    sudo rabbitmqctl status
    sudo rabbitmq-plugins list
    

三 组建集群

  • 选择 node1 为种子节点,在 node2、node3 上依次执行(保持 Erlang 节点运行,仅停止应用层):
    # 停止应用(不停止 Erlang VM)
    sudo rabbitmqctl stop_app
    
    # 首次加入集群时重置(清空本地 Mnesia 数据)
    sudo rabbitmqctl reset
    
    # 加入集群(使用种子节点的节点名,如 rabbit@node1)
    sudo rabbitmqctl join_cluster rabbit@node1
    
    # 启动应用
    sudo rabbitmqctl start_app
    
  • 节点类型(可选):默认是 disc 磁盘节点;如需内存节点(性能更高、重启元数据丢失),加入时指定:
    sudo rabbitmqctl join_cluster --ram rabbit@node1
    
  • 查看集群状态(任意节点):
    sudo rabbitmqctl cluster_status
    # 期望输出包含类似:
    # [{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]}]
    
  • 访问管理界面:浏览器打开 http://<任一节点IP>:15672(默认账号 guest/guest,生产请创建新用户并禁用默认账号)。

四 高可用与运维要点

  • 镜像队列(队列数据多副本,提升可用性):
    • 在任意节点设置策略,将所有队列镜像到所有节点(示例为全量策略):
      sudo rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
      
    • 也可按需设置正则匹配与副本数(如 ha-mode=exactly, ha-params=3)。
  • 网络分区处理(避免脑裂):
    • /etc/rabbitmq/rabbitmq.conf 增加:
      cluster_partition_handling = pause_minority
      
    • 保存后重启服务:sudo systemctl restart rabbitmq-server
  • 持久化与确认机制(应用侧最佳实践):
    • 队列/交换机声明为 durable=true,消息 delivery_mode=2;生产者开启 publisher confirms,消费者做好 ack
  • 扩容与缩容:
    • 扩容:新节点按上述步骤加入集群即可。
    • 缩容:先在管理界面或命令行 摘除节点,再在剩余节点执行:
      sudo rabbitmqctl forget_cluster_node rabbit@nodeX
      
  • 入口高可用(生产建议):
    • 使用 HAProxy5672/15672 做四层/七层负载均衡,并配合健康检查与虚 IP(Keepalived)。

五 常见问题排查

  • 节点无法加入集群:
    • 检查 /etc/hosts 与主机名是否一致;确认 .erlang.cookie 内容、权限(400)与属主(rabbitmq:rabbitmq)一致;云环境需放通 4369/25672/5672/15672;查看日志 /var/log/rabbitmq/rabbit@*.log
  • 管理界面打不开:
    • 确认已启用 rabbitmq_management 插件,且安全组/防火墙已放行 15672;必要时重启服务后再试。
  • 队列数据不同步:
    • 为关键队列配置 镜像策略(ha-mode=all/exactly);必要时对已有队列执行 同步sudo rabbitmqctl sync_queue <队列名>
  • 版本不一致导致异常:
    • 各节点 Erlang/OTP 与 RabbitMQ 版本需一致,否则可能出现加入失败或运行时异常。

0