RabbitMQ 集群搭建完整指南(阿里云Linux3/CentOS8通用)

RabbitMQ 集群用于实现高可用、负载均衡和故障转移,核心是基于 Erlang 分布式特性,所有节点共享元数据(队列、交换机、绑定关系),但消息仅存储在创建它的节点上(镜像队列除外)。


前置准备(必做)

1. 基础环境要求

  • 准备 3台阿里云Linux3/CentOS8服务器(建议配置:2核4G以上,公网IP)
  • 所有节点已安装相同版本的 RabbitMQ(建议 3.12+ 稳定版)
  • 所有节点关闭防火墙或放行 4369(Erlang 集群端口)、25672(RabbitMQ 集群通信端口)、5672(客户端通信)、15672(管理后台)
  • 所有节点的 /etc/hosts 配置相互解析:

    # 在所有节点执行,替换为你的3台服务器IP
    cat >> /etc/hosts << EOF
    192.168.1.100 rabbitmq-node1
    192.168.1.101 rabbitmq-node2
    192.168.1.102 rabbitmq-node3
    EOF

2. 同步 Erlang Cookie(核心关键)

RabbitMQ 依赖 Erlang Cookie 进行节点认证,所有节点的 Cookie 必须完全一致:

# 在节点1(主节点)查看当前Cookie
cat /var/lib/rabbitmq/.erlang.cookie

# 将节点1的Cookie复制到节点2、节点3
# 在节点2、3执行,替换为节点1的Cookie值
echo "你的节点1Cookie值" > /var/lib/rabbitmq/.erlang.cookie
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
chmod 400 /var/lib/rabbitmq/.erlang.cookie

# 所有节点重启RabbitMQ使Cookie生效
systemctl restart rabbitmq-server

步骤1:启动所有节点并启用管理插件

所有节点 执行以下命令:

# 启用管理后台插件
rabbitmq-plugins enable rabbitmq_management

# 启动RabbitMQ服务并设置开机自启
systemctl start rabbitmq-server
systemctl enable rabbitmq-server

步骤2:搭建普通集群(无镜像队列)

1. 在节点2、3上加入节点1的集群

# 节点2执行:
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbitmq-node1
rabbitmqctl start_app

# 节点3执行:
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbitmq-node1
rabbitmqctl start_app

2. 验证集群状态

在任意节点执行:

rabbitmqctl cluster_status

输出中 running_nodes 包含所有节点(rabbit@rabbitmq-node1rabbit@rabbitmq-node2rabbit@rabbitmq-node3)即成功。


步骤3:配置镜像队列(高可用核心)

普通集群仅共享元数据,消息只存于创建它的节点,节点宕机则消息丢失。镜像队列会将消息同步到多个节点,实现高可用:

# 在任意节点执行,设置镜像队列策略
# 策略名称:ha-all
# 匹配所有队列(^.*)
# 同步到所有节点(ha-mode=all)
rabbitmqctl set_policy ha-all "^.*" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
  • ha-mode=all:消息同步到所有集群节点(适合3节点集群)
  • ha-sync-mode=automatic:自动同步队列数据到新加入的节点

步骤4:配置负载均衡(公网访问)

公网客户端需要通过负载均衡访问集群,推荐使用 Nginx阿里云SLB

Nginx 负载均衡配置示例

stream {
    upstream rabbitmq_cluster {
        server 192.168.1.100:5672 weight=1;
        server 192.168.1.101:5672 weight=1;
        server 192.168.1.102:5672 weight=1;
    }

    server {
        listen 5672;
        proxy_pass rabbitmq_cluster;
        proxy_timeout 30s;
    }
}

客户端连接 Nginx_IP:5672 即可实现负载均衡。


步骤5:集群运维常用命令

# 查看集群状态
rabbitmqctl cluster_status

# 节点退出集群(在要退出的节点执行)
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

# 移除集群中的节点(在其他节点执行)
rabbitmqctl forget_cluster_node rabbit@rabbitmq-node3

# 查看镜像队列策略
rabbitmqctl list_policies

# 添加新节点到集群
rabbitmqctl join_cluster rabbit@rabbitmq-node1 --ram  # 可选:设置为内存节点(仅存储元数据,适合高并发场景)

常见问题排查

节点无法加入集群

  • 检查 Erlang Cookie 是否完全一致
  • 检查 436925672 端口是否放行
  • 检查 /etc/hosts 配置是否正确
  • 确保所有节点的 RabbitMQ 版本一致

镜像队列不同步

  • 检查策略是否正确应用:rabbitmqctl list_policies
  • 确保节点间网络通畅,无防火墙拦截
  • 重启节点后重新设置策略

管理后台无法查看集群节点

  • 确保所有节点启用了 rabbitmq_management 插件
  • 检查 15672 端口是否放行
  • 访问任意节点的管理后台即可查看整个集群状态

标签: none

添加新评论