温馨提示×

RabbitMQ在Ubuntu上的集群管理怎么操作

小樊
41
2025-10-16 22:08:35
栏目: 智能运维

RabbitMQ在Ubuntu上的集群管理操作指南

一、集群搭建前准备

  1. 环境要求:所有节点需安装相同版本的Erlang(RabbitMQ依赖)和Ubuntu系统;节点间网络互通(防火墙开放**4369(Erlang端口映射)、25672(Erlang集群通信)、15672(管理界面)、5672(AMQP协议)**端口)。
  2. 主机名与hosts配置:为每个节点设置唯一主机名(如rabbit1rabbit2),并在所有节点的/etc/hosts文件中添加集群节点IP与主机名的映射(如192.168.1.101 rabbit1192.168.1.102 rabbit2),确保可通过主机名互相访问。
  3. 安装Erlang与RabbitMQ:在所有节点执行以下命令安装:
    sudo apt update sudo apt install -y erlang sudo apt install -y rabbitmq-server 

二、启动RabbitMQ服务与启用管理插件

  1. 启动服务:在每个节点启动RabbitMQ并设置开机自启:
    sudo systemctl start rabbitmq-server sudo systemctl enable rabbitmq-server 
  2. 启用管理插件:为方便远程管理,启用rabbitmq_management插件(默认监听15672端口):
    sudo rabbitmq-plugins enable rabbitmq_management 

三、同步Erlang Cookie(集群通信关键)

RabbitMQ节点通过Erlang Cookie(默认路径/var/lib/rabbitmq/.erlang.cookie)进行身份验证,所有节点的Cookie文件必须内容一致权限正确400、属主为rabbitmq:rabbitmq)。

  • 操作步骤:选择一台节点(如rabbit1)作为Cookie源,复制其Cookie内容到其他节点:
    # 在rabbit1上查看Cookie sudo cat /var/lib/rabbitmq/.erlang.cookie # 将内容复制到rabbit2、rabbit3(需替换为实际IP或主机名) sudo scp /var/lib/rabbitmq/.erlang.cookie user@rabbit2:/var/lib/rabbitmq/.erlang.cookie sudo scp /var/lib/rabbitmq/.erlang.cookie user@rabbit3:/var/lib/rabbitmq/.erlang.cookie # 在其他节点设置Cookie权限 sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie 

四、将节点加入集群

  1. 初始化集群节点:在从节点(如rabbit2rabbit3)上停止RabbitMQ应用并重置(首次加入时需重置,会清除节点原有数据):
    sudo rabbitmqctl stop_app sudo rabbitmqctl reset sudo rabbitmqctl start_app 
  2. 加入主节点集群:在从节点上执行join_cluster命令,指定主节点的Erlang节点名称(格式为主机名@节点IP或主机名,如rabbit@rabbit1):
    sudo rabbitmqctl stop_app sudo rabbitmqctl join_cluster rabbit@rabbit1 # 加入rabbit1的集群 sudo rabbitmqctl start_app 
  3. 验证集群状态:在任意节点执行cluster_status命令,查看running_nodes是否包含所有集群节点:
    sudo rabbitmqctl cluster_status 
    输出示例(成功加入后):
    Cluster status of node rabbit@rabbit1 [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]}, {running_nodes,[rabbit@rabbit3,rabbit@rabbit2,rabbit@rabbit1]}] 

五、配置镜像队列(实现队列高可用)

默认情况下,RabbitMQ队列仅在单个节点存储,需通过镜像队列策略将队列复制到多个节点。以下命令将所有队列镜像到集群所有节点,并开启自动同步:

sudo rabbitmqctl set_policy ha-all "^.*" '{"ha-mode":"all","ha-sync-mode":"automatic"}' --priority 0 --apply-to queues 
  • 参数说明
    • ha-mode: all:队列复制到所有节点;
    • ha-sync-mode: automatic:新节点加入时自动同步队列数据;
    • ^.*:匹配所有队列(可修改为特定前缀,如ha-order仅镜像order开头队列);
    • --apply-to queues:策略应用于队列。

六、集群节点管理操作

1. 扩容集群(添加新节点)

  1. 新节点安装Erlang、RabbitMQ,配置主机名、hosts文件、同步Cookie;
  2. 启动RabbitMQ服务,启用管理插件;
  3. 在新节点上执行stop_appresetjoin_cluster(指向集群中任意在线节点)→start_app
  4. 通过cluster_status验证新节点是否加入。

2. 删除集群节点

  1. 目标节点(如rabbit4)上停止应用:
    sudo rabbitmqctl stop_app 
  2. 集群中其他节点(如rabbit1)执行forget_cluster_node命令,移除目标节点:
    sudo rabbitmqctl forget_cluster_node rabbit@rabbit4 
  3. 在目标节点上执行reset(清除所有状态信息)→start_app(重启服务):
    sudo rabbitmqctl reset sudo rabbitmqctl start_app 

七、常见问题排查

  1. 节点无法加入集群
    • 检查Erlang Cookie是否一致(路径/var/lib/rabbitmq/.erlang.cookie);
    • 检查防火墙是否开放所需端口(4369、25672、15672、5672);
    • 检查节点主机名是否正确解析(ping rabbit2测试)。
  2. 管理界面无法访问
    • 确认rabbitmq_management插件已启用(rabbitmq-plugins list查看);
    • 检查云服务器安全组是否放行15672端口。
  3. 队列数据不同步
    • 确认已配置镜像队列策略(ha-mode: all);
    • 检查队列是否设置为持久化(创建队列时添加durable=true参数)。

八、注意事项

  • 节点类型:建议至少部署2个磁盘节点disc,存储元数据),避免单点故障;内存节点(ram,提升性能)可作为辅助节点;
  • 网络分区处理:在/etc/rabbitmq/rabbitmq.conf中添加cluster_partition_handling = pause_minority,避免网络分区导致脑裂;
  • 数据持久化:队列和消息需设置为持久化(durable=true),防止节点重启数据丢失。

0