温馨提示×

RabbitMQ高可用性Ubuntu方案

小樊
32
2025-12-12 23:13:30
栏目: 智能运维

Ubuntu 上构建 RabbitMQ 高可用方案

一 架构选型与节点规划

  • 推荐采用3 节点集群(奇数节点便于达成多数派),节点类型包含磁盘节点内存节点:至少保留1 个磁盘节点以持久化元数据,生产常用组合为2 磁盘 + 1 内存以兼顾可靠性与吞吐。
  • 队列类型优先选择仲裁队列(Quorum Queues),基于 Raft 共识算法,提供更强的一致性与自动故障转移;经典镜像队列(Classic Mirrored Queues)已不推荐,且在 3.13+ 默认禁用。
  • 典型拓扑与适用场景如下:
    方案 节点类型 适用场景 关键点
    经典稳健型 2 磁盘 + 1 内存 通用生产 元数据冗余,性能与可靠性平衡
    极致性能型 1 磁盘 + 2 内存 高吞吐、可接受元数据风险 唯一磁盘节点为单点,维护需严格顺序
    极致可靠型 3 磁盘 强一致与容灾要求高 容错更强,写入受磁盘 IO 约束
    仲裁队列要求集群规模≥3,更利于在分区时保持数据安全与可用性。

二 环境准备与安装

  • 系统要求:Ubuntu 22.04/20.04,节点间可互通,建议通过 /etc/hosts 或 DNS 完成主机名解析;开放端口:5672(AMQP)、15672(管理)、15692(Prometheus)。
  • 安装步骤(以 Ubuntu 22.04 为例):
    1. 安装 Erlang(推荐 OTP 24+)与 RabbitMQ 官方仓库:
      sudo apt-get update
      sudo apt-get install -y curl gnupg apt-transport-https
      echo “deb https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/deb/ubuntu $(lsb_release -cs) main” | sudo tee /etc/apt/sources.list.d/rabbitmq.list
      wget -O- https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/gpg.E495BB49CC4BBE5B.key | sudo apt-key add -
      sudo apt-get update && sudo apt-get install -y rabbitmq-server
    2. 启用管理插件并验证:
      sudo rabbitmq-plugins enable rabbitmq_management
      访问 http://<节点IP>:15672(默认账号 guest/guest,仅本机可访问,生产请创建管理员并限制来源)。
    3. 基础配置(/etc/rabbitmq/rabbitmq.conf):
      listeners.tcp.default = 5672
      management.tcp.port = 15672
      vm_memory_high_watermark.relative = 0.7
      disk_free_limit.absolute = 50MB
    4. 如需指标监控,启用 Prometheus 插件:
      sudo rabbitmq-plugins enable rabbitmq_prometheus
      抓取 http://<节点IP>:15692/metrics

三 集群搭建与网络分区策略

  • 统一 Erlang Cookie(节点间认证):
    确保 /var/lib/rabbitmq/.erlang.cookie 内容一致,权限 400,属主 rabbitmq:rabbitmq
  • 主机名解析(示例):
    echo “192.168.1.10 node1\n192.168.1.11 node2\n192.168.1.12 node3” | sudo tee -a /etc/hosts
  • 加入集群(在 node2、node3 上执行,node1 为磁盘节点):
    sudo rabbitmqctl stop_app
    sudo rabbitmqctl reset
    sudo rabbitmqctl join_cluster rabbit@node1 --ram # 不加 --ram 为磁盘节点
    sudo rabbitmqctl start_app
    sudo rabbitmqctl cluster_status # 验证集群成员与运行状态
  • 网络分区处理(生产建议):
    在 /etc/rabbitmq/rabbitmq.conf 设置:cluster_partition_handling = pause_minority(少数分区自动暂停,避免脑裂)。
  • 单机多实例演练(可选,便于本地验证):
    RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit rabbitmq-server -detached
    RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit1 rabbitmq-server -detached
    RABBITMQ_NODE_PORT=5674 RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached
    之后按上述步骤将 rabbit1、rabbit2 加入 rabbit 集群。

四 高可用队列与策略配置

  • 仲裁队列(推荐):在客户端声明队列时指定参数 x-queue-type=quorum,例如(Java 伪代码):
    channel.queueDeclare(“my-quorum-queue”, true, false, false,
    ImmutableMap.of(“x-queue-type”, “quorum”));
    特点:基于 Raft 的一致性复制、自动选主、分区时优先数据安全。
  • 经典镜像队列(不推荐,仅存量兼容):通过策略将队列镜像到多个节点,例如:
    rabbitmqctl set_policy ha-all “^ha\.” ‘{“ha-mode”:“all”,“ha-sync-mode”:“automatic”}’
    注意:经典镜像队列在现代版本中已不推荐,存在分区场景数据丢失风险。
  • 运维提示:仲裁队列以磁盘 IO 为主,确保磁盘性能与空间;镜像队列以内存为主,需关注内存压力。

五 负载均衡与监控告警

  • 负载均衡(HAProxy 示例,面向 AMQP 5672 与管理 15672):
    frontend rabbitmq-amqp
    bind *:5672
    default_backend rabbitmq-nodes
    backend rabbitmq-nodes
    balance roundrobin
    server node1 192.168.1.10:5672 check
    server node2 192.168.1.11:5672 check
    server node3 192.168.1.12:5672 check

    frontend rabbitmq-mgmt
    bind *:15672
    default_backend rabbitmq-mgmt-nodes
    backend rabbitmq-mgmt-nodes
    balance roundrobin
    server node1 192.168.1.10:15672 check
    server node2 192.168.1.11:15672 check
    server node3 192.168.1.12:15672 check

  • 监控与告警:启用 Prometheus 插件,抓取 15692/metrics,重点监控队列积压、节点内存与磁盘剩余;结合 Grafana 可视化并设置阈值告警。

  • 快速验证:

    • 管理界面:访问 http://<LB或节点IP>:15672 查看节点、队列与连接状态;
    • 集群状态:执行 rabbitmqctl cluster_status 检查成员与运行状态;
    • 端口连通:netstat -tulnp | grep -E “5672|15672”。

0