【RabbitMQ运维】集群搭建
以下是 RabbitMQ 多节点集群搭建 和 单节点集群搭建 的详细指南
一、单节点集群搭建(单机伪集群)
适用于本地测试或学习,通过多个节点模拟集群行为(所有节点在同一台机器上)。
1. 安装 RabbitMQ
# Ubuntu/Debian
sudo apt-get install -y erlang rabbitmq-server# CentOS/RHEL
sudo yum install -y erlang rabbitmq-server
2. 启动多个节点(伪集群)
# 启动节点1(AMQP端口5672,管理界面15672)
RABBITMQ_NODE_PORT=5672 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15672}]" RABBITMQ_NODENAME=rabbit1 rabbitmq-server -detached
# 启动节点2(AMQP端口5673,管理界面15673)
RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached
# 启动节点3(AMQP端口5674,管理界面15674)
RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached
3. 将节点加入集群
# 停止节点的应用(保持Erlang进程运行)
rabbitmqctl -n rabbit2 stop_app
rabbitmqctl -n rabbit3 stop_app# 重置节点(仅首次搭建时需要)
rabbitmqctl -n rabbit2 reset
rabbitmqctl -n rabbit3 reset# 将 rabbit2 和 rabbit3 加入 rabbit1 的集群
rabbitmqctl -n rabbit2 join_cluster rabbit1@localhost
rabbitmqctl -n rabbit3 join_cluster rabbit1@localhost# 启动所有节点
rabbitmqctl -n rabbit2 start_app
rabbitmqctl -n rabbit3 start_app
注意:第三步加入集群时,rabbit1@localhost 需要更改为主节点的节点名称
4. 验证集群状态
# 查看集群节点列表
rabbitmqctl -n rabbit1 cluster_status# 输出示例:
# Cluster status of node rabbit1@localhost
# [{nodes,[{disc,[rabbit1@localhost,rabbit2@localhost,rabbit3@localhost]}]}]
5. 访问管理界面
- 默认用户:
guest
/guest
- 访问地址:
- Rabbit1: :15672
- Rabbit2: :15673
- Rabbit3: :15674
二、多节点集群搭建(真实分布式集群)
适用于生产环境,节点分布在多台服务器上。
1. 前置条件
- 所有节点需满足:
- 相同的 Erlang 和 RabbitMQ 版本。
- 主机名可互相解析(通过
/etc/hosts
或 DNS)。 - 开放端口:
4369
(EPMD)、25672
(Erlang 分布式通信)、5672
(AMQP)、15672
(管理界面)。
2. 配置步骤(以 3 节点为例)
(1)修改主机名和 hosts 文件
# 在每台服务器上修改主机名(以 node1 为例)
sudo hostnamectl set-hostname node1# 编辑 /etc/hosts(所有节点均需配置)
sudo vim /etc/hosts
# 添加所有节点的IP和主机名
192.168.1.101 node1
192.168.1.102 node2
192.168.1.103 node3
(2)安装 RabbitMQ(所有节点)
# Ubuntu/Debian
sudo apt-get install -y erlang rabbitmq-server# CentOS/RHEL
sudo yum install -y erlang rabbitmq-server
(3)启动 RabbitMQ 并启用管理插件
# 启动服务
sudo systemctl start rabbitmq-server# 启用管理插件
sudo rabbitmq-plugins enable rabbitmq_management
(4)将节点加入集群
# 在 node2 和 node3 上执行以下操作:# 停止应用
sudo rabbitmqctl stop_app# 重置节点(首次加入集群时执行)
sudo rabbitmqctl reset# 加入 node1 的集群
sudo rabbitmqctl join_cluster rabbit@node1# 启动应用
sudo rabbitmqctl start_app
(5)设置镜像队列(可选)
# 在任意节点上执行,将队列镜像到所有节点
sudo rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
3. 验证集群
# 在任意节点上查看集群状态
sudo rabbitmqctl cluster_status# 输出示例:
# Cluster status of node rabbit@node1
# [{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]}]
4. 访问管理界面
- 任意节点地址:
- :15672
- :15672
- :15672
三、关键注意事项
-
节点类型:
- 磁盘节点(disc):存储元数据(推荐至少 2 个)。
- 内存节点(ram):仅缓存数据(性能高,但重启后数据丢失)。
# 加入集群时指定节点类型 rabbitmqctl join_cluster --ram rabbit@node1
-
网络分区处理:
- 配置
pause_minority_mode
或使用自动恢复插件。
# 避免网络分区导致脑裂 echo 'cluster_partition_handling = pause_minority' >> /etc/rabbitmq/rabbitmq.conf
- 配置
-
数据持久化:
- 队列和消息需设置为持久化(
durable=true
)。
- 队列和消息需设置为持久化(
-
集群扩容/缩容:
- 扩容:直接加入新节点。
- 缩容:需先移除节点(
forget_cluster_node
)。
四、常见问题解决
- 节点无法加入集群:
- 检查防火墙、Erlang Cookie 是否一致(默认路径:
/var/lib/rabbitmq/.erlang.cookie
)。
- 检查防火墙、Erlang Cookie 是否一致(默认路径:
- 管理界面无法访问:
- 确保插件已启用(
rabbitmq-plugins list
)。 - 确保云服务器已开放端口,在安全组中设置
- 确保插件已启用(
- 队列数据不同步:
- 配置镜像队列策略(
ha-mode=all
)。
- 配置镜像队列策略(