当前位置:首页 > 技术 > 正文内容

构建RabbitMQ镜像集群

访客 技术 2026年6月8日 1

本文档将指导您如何在多台服务器上配置RabbitMQ集群,并启用镜像模式以实现高可用性。

一、环境准备

在开始之前,请确保您的所有集群节点已完成以下准备工作:

  • 网络配置: 配置所有节点的 /etc/hosts 文件,使其能够通过主机名解析到正确的IP地址。例如:
    
    192.168.1.135  rabbit-master01
    192.168.1.136  rabbit-master02
    192.168.1.137  rabbit-master03
            
  • 防火墙: 确保防火墙允许RabbitMQ所需端口(默认为 5672, 15672, 25672, 4369, 5671)的通信,或暂时关闭防火墙。

二、安装RabbitMQ服务器

在集群的每一台机器上执行以下步骤:

  1. 添加YUM仓库:
    
    curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
    curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash
            
  2. 安装RabbitMQ服务器:(以下以3.8.14版本为例)
    
    yum install rabbitmq-server-3.8.14
            
  3. 启用管理插件:
    
    rabbitmq-plugins enable rabbitmq_management
            
  4. 启动并启用服务:
    
    systemctl start rabbitmq-server
    systemctl enable rabbitmq-server
            

    注意:服务配置文件(rabbitmq.conf)通常不包含在安装包中。您可以从RabbitMQ的GitHub仓库下载示例配置文件进行修改。

三、配置集群镜像模式

集群的配置分为多个步骤,需要在不同节点上执行。

1. 节点认证(Cookie共享)

在第一个节点(例如 rabbit-master01)上,执行以下命令将 .erlang.cookie 文件复制到其他节点。此文件用于节点间的身份验证。


# 在 rabbit-master01 上执行
scp /var/lib/rabbitmq/.erlang.cookie root@rabbit-master02:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie root@rabbit-master03:/var/lib/rabbitmq/.erlang.cookie

在执行加入集群命令前,可以先查看当前集群名称(通常与节点主机名相关):


rabbitmqctl cluster_status | grep 'Cluster name'

2. 加入集群

在除了第一个节点(rabbit-master01)之外的其他节点(rabbit-master02, rabbit-master03)上执行以下操作:

  1. 恢复文件权限:由于 .erlang.cookie 文件是通过 root 用户复制的,需要将其所有者更改回 rabbitmq 用户。
    
    chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
            
  2. 重启服务:使 cookie 文件生效。
    
    systemctl restart rabbitmq-server
            
  3. 停止RabbitMQ应用:(Erlang节点服务保持运行)
    
    rabbitmqctl stop_app
            

    如果节点已有数据,并且您想将其重置为新节点状态,可以使用 rabbitmqctl reset 命令。

  4. 加入集群:将当前节点加入到以 rabbit@rabbit-master01 为代表的集群中。
    
    rabbitmqctl join_cluster rabbit@rabbit-master01
            

    默认节点类型为磁盘节点(disk)。您可以通过 --ram 参数创建内存节点(RAM node)。集群中至少需要一个磁盘节点。

  5. 启动RabbitMQ应用:
    
    rabbitmqctl start_app
            

3. 配置镜像策略

在集群中的任意一个节点上执行以下命令,为所有队列(匹配正则表达式 ^,即所有队列)设置镜像策略 ha-all,使其所有副本都进行同步。


rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

您可以随时使用 rabbitmqctl cluster_status 命令查看集群状态,确认节点是否已加入以及策略是否生效。

四、用户管理与验证

为了验证集群是否正常工作,可以创建一个管理用户并进行测试。

  1. 创建用户:
    
    rabbitmqctl add_user admin admin123
            
  2. 设置用户角色:(例如设置为 administrator
    
    rabbitmqctl set_user_tags admin administrator
            
  3. 设置用户权限:授予对所有虚拟主机(/)下所有资源的读、写、配置权限。
    
    rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
            
  4. 验证用户列表:
    
    rabbitmqctl list_users
            
  5. 访问Web管理界面:在浏览器中访问任意节点的 http://<节点IP>:15672,使用刚创建的 admin 用户登录。

五、常用RabbitMQctl命令

以下是一些在集群管理中常用的 rabbitmqctl 命令:

  • rabbitmqctl stop: 停止RabbitMQ服务器。
  • rabbitmqctl shutdown: 终止RabbitMQ服务器的Erlang进程。
  • rabbitmqctl stop_app: 停止RabbitMQ应用,Erlang节点保持运行。
  • rabbitmqctl start_app: 启动RabbitMQ应用。
  • rabbitmqctl reset: 将节点重置为原始状态,并从集群中移除。
  • rabbitmqctl force_reset: 强制重置节点,即使数据库损坏。
  • rabbitmqctl join_cluster <clusternode> [--ram]: 将当前节点加入指定集群,可选择创建RAM节点。
  • rabbitmqctl cluster_status: 显示集群状态。
  • rabbitmqctl change_cluster_node_type <disc|ram>: 改变节点类型。
  • rabbitmqctl forget_cluster_node [--offline]: 远程移除一个节点。
  • rabbitmqctl add_user <username> <password>: 添加用户。
  • rabbitmqctl delete_user <username>: 删除用户。
  • rabbitmqctl set_user_tags <username> <tag ...>: 设置用户角色。
  • rabbitmqctl set_permissions [-p vhost] <user> <conf> <write> <read>: 设置用户权限。
  • rabbitmqctl list_permissions [-p vhost]: 列出权限。
  • rabbitmqctl add_vhost <vhost>: 添加虚拟主机。
  • rabbitmqctl delete_vhost <vhost>: 删除虚拟主机。
  • rabbitmqctl purge_queue [-p vhost] <queue>: 清空队列中的消息。
  • rabbitmqctl sync_queue [-p vhost] <queue>: 同步镜像队列。

六、高可用性增强(可选)

可以使用 Nginx/HAProxy 配合 Keepalived 实现四层代理,为集群提供统一的访问入口和高可用性。

七、集群恢复与故障转移

在镜像模式下,当集群节点发生故障时,RabbitMQ 具备一定的自动恢复能力。以下是一些常见场景及处理方案:

  • 场景1:节点A先停,节点B后停。

    方案:先启动B(Master),再启动A。或先启动A,在30秒内启动B即可恢复。

  • 场景2:节点A、B同时停机。

    方案:在30秒内连续启动A和B即可恢复。

  • 场景3:节点A先停,节点B后停,且A无法恢复。

    方案:启动B(Master),然后在B节点执行 rabbitmqctl forget_cluster_node A 移除A,再将新的Slave节点加入B。

  • 场景4:节点A先停,节点B后停,且B无法恢复。

    方案:此场景处理难度较大。在 RabbitMQ 3.4.2 及以上版本,可以使用 rabbitmqctl forget_cluster_node -offline B 命令,强制移除无法恢复的Master节点B,然后启动A,并添加新的Slave节点。

  • 场景5:节点A、B均无法恢复,但可获得磁盘文件。

    方案:将损坏节点的Mnesia数据库文件(通常在 $RABBIT_HOME/var/lib/)拷贝到新节点的对应目录下,并将新节点的 hostname 修改为原节点名。若原节点为Slave,则按场景4处理;若原节点为Master,则按场景3处理。最后将新的Slave节点加入。

  • 场景6:节点A、B均无法恢复,且无法获得磁盘文件。

    方案:此情况下恢复非常困难,通常需要重建集群。

八、开启监控

可以通过 rabbitmq_prometheus 插件来暴露监控指标。

  1. 启用插件:(无需重启)
    
    rabbitmq-plugins enable rabbitmq_prometheus
            
  2. 访问监控接口:在任意节点上通过 http://<节点IP>:15692/metrics 访问 Prometheus 格式的监控数据。

您还可以参考 Grafana 提供的 RabbitMQ 监控模板来可视化这些数据。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。