Ubuntu 上 RabbitMQ 集群管理实操指南
一 基础准备与前置检查
- 在所有节点安装并启动 RabbitMQ,建议启用管理插件以便可视化运维(端口 15672):sudo apt update && sudo apt install -y rabbitmq-server;sudo rabbitmq-plugins enable rabbitmq_management。
- 统一 Erlang Cookie:保证集群内所有节点 /var/lib/rabbitmq/.erlang.cookie 内容一致,权限为 400,属主为 rabbitmq:rabbitmq。
- 配置 主机名与 /etc/hosts 可解析(短名或 FQDN 均可,但需一致),便于节点互相发现。
- 开放必要端口(示例):5672(AMQP)、15672(管理)、以及集群通信端口 4369(epmd)、25672(集群分发);云环境需放通安全组。
- 节点命名规范:节点名形如 rabbit@hostname,同一主机多节点需不同前缀;如使用 FQDN,需设置 RABBITMQ_USE_LONGNAME=true 并使用长节点名。
二 常用集群操作命令
- 查看状态与集群信息:
- 单节点状态:sudo rabbitmqctl status
- 集群状态:sudo rabbitmqctl cluster_status
- 加入集群(在待加入节点执行,先停应用再重置再加入):
- sudo rabbitmqctl stop_app
- sudo rabbitmqctl reset
- sudo rabbitmqctl join_cluster rabbit@目标主机名(如需内存节点加参数:–ram)
- sudo rabbitmqctl start_app
- 变更节点类型(必须先 stop_app):
- 转磁盘:sudo rabbitmqctl change_cluster_node_type disc
- 转内存:sudo rabbitmqctl change_cluster_node_type ram
- 移除节点:
- 方式 A(被移除节点本地清理):stop_app → reset → start_app
- 方式 B(从集群剔除):在任一存活节点执行 sudo rabbitmqctl forget_cluster_node rabbit@目标节点,随后在被移除节点执行 reset 与 start_app
- 镜像队列策略(高可用):
- 全部队列镜像:sudo rabbitmqctl set_policy ha-all “^” ‘{“ha-mode”:“all”,“ha-sync-mode”:“automatic”}’
- 按名称匹配:sudo rabbitmqctl set_policy ha-two “^two.” ‘{“ha-mode”:“exactly”,“ha-params”:2,“ha-sync-mode”:“automatic”}’
说明:普通集群只复制元数据,队列内容不自动复制;镜像队列用于队列级 HA。
三 负载均衡与高可用接入
- 使用 HAProxy 对外提供统一接入与健康检查:
- 安装:sudo apt-get install haproxy
- 配置示例(/etc/haproxy/haproxy.cfg):
- 前端/后端 AMQP(TCP,轮询):
listen rabbitmq_cluster
bind 0.0.0.0:5670
mode tcp
balance roundrobin
server rabbit1 10.0.0.11:5672 check inter 5000 rise 2 fall 3
server rabbit2 10.0.0.12:5672 check inter 5000 rise 2 fall 3
server rabbit3 10.0.0.13:5672 check inter 5000 rise 2 fall 3
- 管理统计页面:
listen private_monitoring
bind 0.0.0.0:8100
mode http
stats enable
stats uri /stats
stats refresh 5s
- 应用连接 HAProxy 的 5670 端口;管理界面访问 http://<haproxy_ip>:8100/stats。
四 运维与故障排查要点
- 节点命名与解析:节点名必须唯一;使用 FQDN 时启用 RABBITMQ_USE_LONGNAME=true;/etc/hosts 或 DNS 需能解析各节点主机名。
- Cookie 一致性:集群通信依赖 .erlang.cookie,内容一致且权限 400;修改后需重启节点。
- 节点类型与数量:至少保留 1 个磁盘节点(元数据必须落盘);内存节点提升吞吐但宕机不保留队列内容。
- 版本兼容:集群内 Erlang/OTP 主次版本需兼容,补丁版本差异按官方兼容矩阵评估。
- 常见报错与处理:
- 无法连接节点(nodedown):检查 /etc/hosts、主机名、Cookie、端口连通性(5672/4369/25672)。
- 插件端口冲突(如单机多节点):为各节点设置不同 RABBITMQ_NODE_PORT 与 RABBITMQ_NODENAME,必要时先禁用冲突插件再启动。
五 生产建议与参数调优
- 高可用策略:普通集群 + 镜像队列(如 ha-all 或按业务命名空间匹配),镜像队列建议开启 ha-sync-mode=automatic 减少人工介入。
- 内存与磁盘水位:通过参数控制流控与保护,例如 vm_memory_high_watermark(默认约内存的 40%)、disk_free_limit(默认与内存相关,可调为绝对值避免磁盘被写满)。
- 网络与分区:放通 4369/25672 等集群端口;分区策略可按业务选择(如 pause_minority、autoheal),并在监控中关注 partitions 指标。
- 监控与告警:启用 rabbitmq_management,结合 HAProxy 统计页与节点告警策略,持续观察 running_nodes、队列同步状态与连接数。