RabbitMQ高可用集群搭建教程(基于CentOS 7.9 + Erlang 23.2.7 + RabbitMQ 3.8.8)

文章目录

  • 前言
  • 一、部署环境准备
    • [1.1 主机信息](#1.1 主机信息)
    • [1.2 环境初始化(三台主机均执行)](#1.2 环境初始化(三台主机均执行))
      • [1.2.1 修改主机名](#1.2.1 修改主机名)
      • [1.2.2 配置主机解析](#1.2.2 配置主机解析)
      • [1.2.3 关闭防火墙与SELinux](#1.2.3 关闭防火墙与SELinux)
  • 二、RabbitMQ基础环境安装(三台主机均执行)
    • [2.1 准备本地RPM包](#2.1 准备本地RPM包)
    • [2.2 安装Erlang](#2.2 安装Erlang)
    • [2.3 安装RabbitMQ](#2.3 安装RabbitMQ)
    • [2.4 启动RabbitMQ服务](#2.4 启动RabbitMQ服务)
    • [2.5 配置Web管理界面](#2.5 配置Web管理界面)
  • 三、RabbitMQ普通集群搭建
    • [3.1 配置数据及日志目录(三台主机均执行)](#3.1 配置数据及日志目录(三台主机均执行))
    • [3.2 同步Erlang Cookie](#3.2 同步Erlang Cookie)
      • [3.2.1 Cookie文件路径](#3.2.1 Cookie文件路径)
      • [3.2.2 同步Cookie(以rabbit-node1为基准)](#3.2.2 同步Cookie(以rabbit-node1为基准))
    • [3.3 加入集群(在rabbit-node2和rabbit-node3上执行)](#3.3 加入集群(在rabbit-node2和rabbit-node3上执行))
    • [3.4 验证集群状态](#3.4 验证集群状态)
      • [3.4.1 命令行验证](#3.4.1 命令行验证)
      • [3.4.2 Web界面验证](#3.4.2 Web界面验证)
  • 四、镜像集群配置(实现高可用)
    • [4.1 创建镜像策略](#4.1 创建镜像策略)
    • [4.2 验证镜像队列](#4.2 验证镜像队列)
      • [4.2.1 创建测试队列](#4.2.1 创建测试队列)
      • [4.2.2 查看镜像状态](#4.2.2 查看镜像状态)
      • [4.3 测试高可用](#4.3 测试高可用)
  • 五、本地安装常见问题解决
    • [5.1 "依赖失败"报错](#5.1 “依赖失败”报错)
    • [5.2 "签名验证失败"警告](#5.2 “签名验证失败”警告)
    • [5.3 Erlang版本不匹配](#5.3 Erlang版本不匹配)
    • [5.4 节点无法加入集群](#5.4 节点无法加入集群)
  • 总结

前言

在分布式系统中,消息队列中间件是实现服务解耦、异步通信的核心组件,而RabbitMQ凭借其稳定的性能、丰富的功能(如交换机、队列、绑定等),成为主流选择之一。但单点部署的RabbitMQ存在宕机风险,一旦服务中断将直接影响业务流程。因此,搭建高可用集群是生产环境的必要需求。

本文基于 CentOS 7.9 操作系统,使用 Erlang 23.2.7RabbitMQ 3.8.8,详细讲解从基础环境安装到普通集群搭建、镜像集群配置的完整流程,步骤清晰可复现,适合运维人员和开发人员参考。

一、部署环境准备

1.1 主机信息

本次搭建使用3台CentOS 7.9虚拟机,节点信息如下(需根据实际环境替换IP):

主机名 IP地址 部署服务 操作系统
rabbit-node1 192.168.10.16 RabbitMQ CentOS 7.9
rabbit-node2 192.168.10.17 RabbitMQ CentOS 7.9
rabbit-node3 192.168.10.18 RabbitMQ CentOS 7.9

1.2 环境初始化(三台主机均执行)

1.2.1 修改主机名

分别在三台主机上执行命令,设置对应的主机名(确保主机名唯一):

shell 复制代码
# 192.168.10.16 执行
hostnamectl set-hostname rabbit-node1 && bash

# 192.168.10.17 执行
hostnamectl set-hostname rabbit-node2 && bash

# 192.168.10.18 执行
hostnamectl set-hostname rabbit-node3 && bash

1.2.2 配置主机解析

编辑/etc/hosts文件,添加IP与主机名的映射,确保集群节点间可通过主机名通信:

shell 复制代码
vim /etc/hosts

添加以下内容(替换为实际IP和主机名):

复制代码
192.168.10.16 rabbit-node1
192.168.10.17 rabbit-node2
192.168.10.18 rabbit-node3

1.2.3 关闭防火墙与SELinux

RabbitMQ集群节点间需要通过多个端口通信(如4369、5672、15672等),为避免网络拦截,临时关闭防火墙和SELinux:

shell 复制代码
# 停止并禁用防火墙
systemctl stop firewalld && systemctl disable firewalld

# 临时关闭SELinux(重启后失效,生产环境需按需配置永久规则)
setenforce 0

二、RabbitMQ基础环境安装(三台主机均执行)

RabbitMQ依赖Erlang运行环境,且版本需严格匹配,需先安装Erlang再安装RabbitMQ。

2.1 准备本地RPM包

已提前下载以下两个RPM包(需确保版本对应):

将两个包上传至三台主机的同一目录(如/root/rabbitmq-packages/),后续安装从本地读取。

注意:Rabbitmq和Erlang是由版本对应的。参考表可在RabbitMQ中获取。

注意安装的顺序:

  • ①先安装Erlang的rpm包
  • ②安装socat和logrotate等依赖
  • ③安装RabiitMQ包

2.2 安装Erlang

shell 复制代码
# 进入RPM包存放目录(替换为实际路径)
cd /root/rabbitmq-packages/

# 安装Erlang本地RPM包
rpm -ivh erlang-23.2.7-2.el7.x86_64.rpm

# 补充Erlang依赖(避免缺失依赖导致功能异常)
yum -y install erlang

# 验证安装:输出"Erlang/OTP 23 [erts-11.1.8]"即成功
erl -v

2.3 安装RabbitMQ

shell 复制代码
# 1. 安装RabbitMQ依赖插件(socat用于进程通信,logrotate用于日志轮转)
yum install -y socat wget logrotate

# 2. 导入RabbitMQ官方签名密钥(避免"未验证的签名"警告)
rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc

# 3. 安装RabbitMQ本地RPM包(进入包存放目录执行)
cd /root/rabbitmq-packages/
rpm -ivh rabbitmq-server-3.8.8-1.el7.noarch.rpm

# 4. 补充安装RabbitMQ依赖(确保服务可正常启动)
yum -y install rabbitmq-server

2.4 启动RabbitMQ服务

shell 复制代码
# 启动RabbitMQ服务
systemctl start rabbitmq-server

# 设置开机自启(避免服务器重启后服务失效)
systemctl enable rabbitmq-server

# 查看服务状态:显示"active (running)"即为正常
systemctl status rabbitmq-server

2.5 配置Web管理界面

RabbitMQ默认不启用Web管理功能,需手动开启,方便通过浏览器可视化操作。

2.5.1 启用管理插件

shell 复制代码
# 启用Web管理插件
rabbitmq-plugins enable rabbitmq_management

# 验证端口:15672为管理界面端口,显示"LISTEN"即成功
netstat -tuln | grep 15672
  • 启用后,可通过http://主机IP:15672访问Web管理界面。
  • 默认账户:guest,默认密码:guest仅支持本地登录(无法通过远程IP访问)。

2.5.2 创建远程登录用户

为实现远程访问管理界面,需创建自定义用户并授予管理员权限:

shell 复制代码
# 1. 创建用户(示例:用户名admin,密码123456,可自定义)
rabbitmqctl add_user admin 123456

# 2. 设置用户角色为管理员(拥有全部操作权限)
rabbitmqctl set_user_tags admin administrator

# 3. 授予用户所有资源权限(允许操作"/"虚拟主机下的所有队列、交换机)
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
补充:RabbitMQ用户角色说明
  • administrator:超级管理员,可登录管理界面、查看所有信息、管理集群(如添加节点、删除用户)。
  • monitoring:监控者,可登录管理界面,查看集群状态、消息 metrics 等,但无修改权限。
  • policymaker:策略制定者,可登录管理界面,配置队列镜像策略、交换机绑定规则等。
  • management:普通管理员,仅可登录管理界面,查看自己有权限的队列和交换机。
常用用户操作命令
shell 复制代码
# 修改用户密码(示例:将admin的密码改为654321)
rabbitmqctl change_password admin 654321

# 删除用户(示例:删除guest用户)
rabbitmqctl delete_user guest

# 查看所有用户列表(验证用户是否创建成功)
rabbitmqctl list_users

2.5.3 验证登录

打开浏览器,访问http://192.168.10.16:15672(或其他节点IP),输入创建的admin账户和密码,成功进入管理界面即表示Web配置完成。

三、RabbitMQ普通集群搭建

普通集群 的核心是共享元数据、分担连接压力,但队列数据仅存储在创建它的节点上(无高可用能力),需作为镜像集群的基础。

3.1 配置数据及日志目录(三台主机均执行)

默认情况下,RabbitMQ的数据和日志存储在/var/lib/rabbitmq//var/log/rabbitmq/,为便于管理,自定义存储目录:

shell 复制代码
# 1. 创建自定义目录
mkdir -p /data/rabbitmq/data  # 数据存储目录(如队列元数据、消息)
mkdir -p /data/rabbitmq/logs  # 日志存储目录(如启动日志、错误日志)

# 2. 设置权限(确保rabbitmq用户可读写)
chmod 755 -R /data/rabbitmq
chown rabbitmq.rabbitmq -R /data/rabbitmq

# 3. 配置目录路径(编辑环境变量文件)
vim /etc/rabbitmq/rabbitmq-env.conf

添加以下内容,指定自定义目录:

复制代码
RABBITMQ_MNESIA_BASE=/data/rabbitmq/data
RABBITMQ_LOG_BASE=/data/rabbitmq/logs

重启服务使配置生效:

shell 复制代码
systemctl restart rabbitmq-server

RabbitMQ集群依赖Erlang集群,而Erlang集群通过Cookie实现节点认证------所有节点的Cookie必须完全一致,否则无法通信。

3.2.1 Cookie文件路径

yum安装的RabbitMQ,Cookie文件默认存放在/var/lib/rabbitmq/.erlang.cookie,文件权限为400(仅所有者可读)。

3.2.2 同步Cookie(以rabbit-node1为基准)

  1. 停止所有节点的RabbitMQ服务(避免Cookie文件被占用):

    shell 复制代码
    systemctl stop rabbitmq-server
  2. 在rabbit-node1上复制Cookie到其他节点

    shell 复制代码
    # 复制Cookie到rabbit-node2
    scp /var/lib/rabbitmq/.erlang.cookie root@rabbit-node2:/var/lib/rabbitmq/
    
    # 复制Cookie到rabbit-node3
    scp /var/lib/rabbitmq/.erlang.cookie root@rabbit-node3:/var/lib/rabbitmq/
  3. 重启所有节点的RabbitMQ服务

    shell 复制代码
    systemctl start rabbitmq-server

3.3 加入集群(在rabbit-node2和rabbit-node3上执行)

rabbit-node1为基准节点,将rabbit-node2rabbit-node3加入集群(节点类型分为"内存节点"和"磁盘节点",默认是磁盘节点):

shell 复制代码
# 1. 停止节点应用(仅停止RabbitMQ服务,不停止Erlang节点)
rabbitmqctl stop_app

# 2. 重置节点状态(清除节点原有数据,避免与集群冲突)
# 注意:重置后节点上的用户、队列会被删除,需重新配置
rabbitmqctl reset

# 3. 加入集群(--ram表示作为"内存节点",省略则为"磁盘节点")
# 内存节点:不存储队列数据,仅存储元数据,适合高并发读取场景
# 磁盘节点:存储队列数据和元数据,集群中至少需1个磁盘节点(避免数据丢失)
rabbitmqctl join_cluster --ram rabbit@rabbit-node1

# 4. 启动节点应用
rabbitmqctl start_app

3.4 验证集群状态

3.4.1 命令行验证

在任意节点执行以下命令,查看集群节点列表:

shell 复制代码
rabbitmqctl cluster_status

输出结果中,nodes字段应包含3个节点(rabbit@rabbit-node1rabbit@rabbit-node2rabbit@rabbit-node3),表示集群搭建成功。

3.4.2 Web界面验证

登录任意节点的Web管理界面,在Overview -> Nodes页面,可看到所有节点的状态(如"running")和相关信息。

注意:重置节点状态后用户已清空,需要重新创建远程登录用户(只需在一个节点创建,其他节点会同步元数据)

四、镜像集群配置(实现高可用)

普通集群的缺陷是队列数据仅存于创建节点 ,若该节点宕机,队列将不可用。镜像集群 通过队列数据复制到多个节点解决此问题,确保单点故障后服务不中断。

4.1 创建镜像策略

镜像策略用于定义哪些队列需要镜像复制到多少个节点,在任意节点执行以下命令,配置"所有队列自动镜像到集群所有节点":

shell 复制代码
# 命令格式:rabbitmqctl set_policy 策略名称 队列匹配规则 策略参数
rabbitmqctl set_policy  ha-all "^" '{"ha-mode":"all"}'

参数说明

  • ha-all:策略名称(自定义,如"ha-all"表示"全量镜像")。
  • "^":队列匹配规则(正则表达式,^表示匹配所有队列,可指定前缀如^order_仅镜像订单相关队列)。
  • {"ha-mode":"all"} : 策略模式为all即复制到所有节点,包括新增节点

4.2 验证镜像队列

4.2.1 创建测试队列

  1. 登录Web管理界面,进入Queues -> Add a new queue页面。
  2. 输入队列名称(如test-ha-queue),其他参数默认,点击Add queue创建队列。

4.2.2 查看镜像状态

在队列列表中,点击创建的test-ha-queue,进入详情页:

  • Replicas字段中,显示"3 nodes"(表示队列已复制到3个节点)。
  • 下方节点列表会标注"Node"(主节点,处理消息生产/消费)和"Mirrors"(从节点,同步主节点数据)。

4.3 测试高可用

手动停止队列的主节点(如rabbit-node1),执行:

shell 复制代码
systemctl stop rabbitmq-server

此时刷新Web管理界面,会发现test-ha-queue的主节点自动切换为其他节点(如rabbit-node2),队列仍可正常接收和消费消息,证明高可用生效。

五、本地安装常见问题解决

5.1 "依赖失败"报错

执行rpm -ivh安装RPM包时,若提示"libssl.so.10()(64bit) is missing"等依赖错误,改用yum localinstall命令(自动补全依赖):

shell 复制代码
# 示例:安装Erlang依赖缺失时
yum localinstall -y erlang-23.2.7-2.el7.x86_64_.rpm

5.2 "签名验证失败"警告

安装RabbitMQ时若提示"RPM signature verification failed",重新导入官方签名密钥:

shell 复制代码
rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc

5.3 Erlang版本不匹配

执行erl -v若显示版本不是23.2.7,说明系统中存在旧版本Erlang,需先卸载再重新安装:

shell 复制代码
# 卸载旧版本Erlang
yum remove -y erlang

# 重新安装指定版本
rpm -ivh erlang-23.2.7-2.el7.x86_64_.rpm

5.4 节点无法加入集群

若执行rabbitmqctl join_cluster时报错"unable to connect to node",检查以下几点:

  1. 防火墙是否关闭(或是否开放4369端口,Erlang集群通信端口)。
  2. 各节点的Cookie是否一致(重新同步Cookie)。
  3. 主机解析是否正确(ping rabbit-node1能否通)。

总结

本文从"环境准备→基础安装→普通集群→镜像集群"逐步讲解RabbitMQ高可用集群的搭建过程,核心要点如下:

  1. 环境初始化:确保主机名、解析、防火墙配置正确,为集群通信奠定基础。
  2. 版本匹配:Erlang 23.2.7与RabbitMQ 3.8.8是官方推荐组合,避免因版本不兼容导致服务异常。
  3. 普通集群:通过同步Cookie实现节点通信,主要作用是分担连接压力,无高可用能力。
  4. 镜像集群:通过配置镜像策略,将队列数据复制到多个节点,解决单点故障问题,满足生产环境高可用需求。

生产环境中,还可搭配HAProxy 实现集群负载均衡(统一客户端连接入口),结合Keepalived避免HAProxy单点故障,进一步提升集群稳定性。通过本文步骤,可快速搭建一套可靠的RabbitMQ高可用集群,支撑分布式业务的消息通信需求。

相关推荐
zxsz_com_cn3 小时前
基于AI的设备健康诊断:工业设备智能运维的破局之钥
运维·人工智能
de之梦-御风5 小时前
【Linux】 开启关闭MediaMTX服务
linux·运维·服务器
IT 小阿姨(数据库)6 小时前
PostgreSQL通过pg_basebackup物理备份搭建流复制备库(Streaming Replication Standby)
运维·服务器·数据库·sql·postgresql·centos
旗讯数字7 小时前
企业OCR实战:基于OCR技术实现双节差旅报销单表格解析与文字信息自动化采集
运维·自动化·ocr·表格识别
bst@微胖子7 小时前
Harmony中EventHub实现发布订阅
linux·运维·ubuntu
毕业设计论文8 小时前
个人备忘录的设计与实现
运维·服务器·网络
Justin_199 小时前
nginx反向代理与缓存功能
运维·nginx
尹蓝锐9 小时前
在学校Linux服务器上配置go语言环境
linux·运维·服务器
XUE-521131410 小时前
组播实验-IGMP、IGMP Snooping及PIM-DM协议
运维·网络·网络协议·智能路由器