RabbitMQ集群部署

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

版本对应关系:https://www.rabbitmq.com/docs/which-erlang

Erlangerlang-26.2-1.el8.x86_64.rpm

RabbitMQrabbitmq-server-3.13.7-1.el8.noarch.rpm

一、安装Erlang

三台机器都执行

rpm -ivh erlang-26.2-1.el8.x86_64.rpm

二、安装RabbitMQ

三台机器都执行

# 配置主机解析,根据自己机器实际主机名配
vi /etc/hosts
192.168.193.18 k8s-192-168-193-18
192.168.193.21 control-02
192.168.193.27 control-03
# 安装RabbitMQ依赖插件,socat用于进程通信,logrotate用于日志轮转
rpm -ivh tcp_wrappers-7.6-98.ctl3.x86_64.rpm
rpm -ivh readline-8.1-2.ctl3.x86_64.rpm
rpm -ivh readline-devel-8.1-2.ctl3.x86_64.rpm
rpm -ivh logrotate-3.20.1-1.ctl3.x86_64.rpm
rpm -ivh --nodeps --nosignature socat-1.7.3.2-4.10.x86_64.rpm
# 安装完成后执行安装RabbitMQ
rpm -ivh rabbitmq-server-3.13.7-1.el8.noarch.rpm
# 启动RabbitMQ服务,启动较慢
systemctl start rabbitmq-server
# 设置开机自启(避免服务器重启后服务失效)
systemctl enable rabbitmq-server
# 查看服务状态:显示“active (running)”即为正常
systemctl status rabbitmq-server
#  配置Web管理界面,RabbitMQ默认不启用Web管理功能,需手动开启,方便通过浏览器可视化操作。
# 启用Web管理插件
rabbitmq-plugins enable rabbitmq_management
# 验证端口:15672为管理界面端口,显示“LISTEN”即成功
netstat -tuln | grep 15672

image

# 启用后,可通过http://主机IP:15672访问Web管理界面。默认账户:guest,默认密码:guest,仅支持本地登录(无法通过远程IP访问)。

# 创建远程登录用户

# 1. 创建用户(示例:用户名admin,密码123456,可自定义)
rabbitmqctl add_user admin Hybridcloud2025
# 2. 设置用户角色为管理员(拥有全部操作权限)
rabbitmqctl set_user_tags admin administrator
# 3. 授予用户所有资源权限(允许操作“/”虚拟主机下的所有队列、交换机)
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

image

# 验证登录,http://192.168.193.18:15672/

image

三、RabbitMQ普通集群搭建

三台机器都执行

#1. 默认情况下,RabbitMQ的数据和日志存储在/var/lib/rabbitmq/和/var/log/rabbitmq/,为便于管理,自定义存储目录
mkdir -p /data/app/mq/{data,logs}
#2. 设置权限
chmod 755 -R /data/app/mq
chown rabbitmq.rabbitmq -R /data/app/mq/
# 3. 配置目录路径(编辑环境变量文件)
vim /etc/rabbitmq/rabbitmq-env.conf
#4. 添加以下内容,指定自定义目录:
RABBITMQ_MNESIA_BASE=/data/app/mq/data
RABBITMQ_LOG_BASE=/data/app/mq/logs
#5. 重启服务使配置生效:
systemctl restart rabbitmq-server

四、同步Erlang Cookie

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

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

#1.  同步Cookie(以192.168.193.18为基准),停止所有节点的RabbitMQ服务(避免Cookie文件被占用)

systemctl stop rabbitmq-server

#2. 192.168.193.18上复制Cookie到其他节点

scp /var/lib/rabbitmq/.erlang.cookie 192.168.193.21:/var/lib/rabbitmq/

scp /var/lib/rabbitmq/.erlang.cookie 192.168.193.27:/var/lib/rabbitmq/

#3. 重启所有节点的RabbitMQ服务

systemctl start rabbitmq-server

五、设置集群

192.168.193.18为基准节点,将192.168.193.21192.168.193.27加入集群(节点类型分为“内存节点”和“磁盘节点”,默认是磁盘节点),以下操作只在192.168.193.21192.168.193.27节点上执行。

# 1. 停止节点应用(仅停止RabbitMQ服务,不停止Erlang节点)
rabbitmqctl stop_app
# 2. 重置节点状态(清除节点原有数据,避免与集群冲突)
# 注意:重置后节点上的用户、队列会被删除,需重新配置
rabbitmqctl reset
# 3. 加入集群(--ram表示作为“内存节点”,省略则为“磁盘节点”)
# 内存节点:不存储队列数据,仅存储元数据,适合高并发读取场景
# 磁盘节点:存储队列数据和元数据,集群中至少需1个磁盘节点(避免数据丢失)
rabbitmqctl join_cluster --ram rabbit@k8s-192-168-193-18
# 4. 启动节点应用
rabbitmqctl start_app

image

六、验证集群

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

rabbitmqctl cluster_status

# 输出结果中,nodes字段应包含3个节点(rabbit@k8s-192-168-193-18rabbit@control-02rabbit@control-03),表示集群搭建成功。

image

# Web界面验证

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

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

image

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

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

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

# 命令格式:rabbitmqctl set_policy 策略名称 队列匹配规则 策略参数

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

参数说明

ha-all策略名称(自定义,如“ha-all”表示全量镜像)。

"^"队列匹配规则(正则表达式,^表示匹配所有队列,可指定前缀如^order_仅镜像订单相关队列)。

{"ha-mode":"all"} : 策略模式为all即复制到所有节点,包括新增节点

image

 八、验证镜像队列

#1. 登录Web管理界面,进入Queues -> Add a new queue页面。

#2. 输入队列名称(如test-ha-queue),其他参数默认,点击Add queue创建队列。

image

#3. 查看镜像状态

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

下方节点列表会标注“Node”(主节点,处理消息生产/消费)和“Mirrors”(从节点,同步主节点数据)。

image

九、测试高可用

#1. 手动停止队列的主节点(如192.168.193.18),执行:

systemctl stop rabbitmq-server

#2. web管理界面任意登录另外两个节点中一个,会发现test-ha-queue的主节点自动切换为其他节点,队列仍可正常接收和消费消息,证明高可用生效。

image

#3. 恢复192.168.193.18服务

 systemctl start rabbitmq-server

#4. 刷新Web管理界面查看192.168.193.18节点已变成Mirrors

image

#5. 删除测试Queue test-ha-queue

方法 1:通过 Web 管理界面删除(直观)

  1. 在当前 Queues and Streams 页面,找到 test-ha-queue 队列。
  2. 向下滚动到队列详情页的 Delete 区域。
  3. 点击 Delete queue 按钮,确认删除即可。
  4. 若队列中有未消费的消息,会提示 Are you sure?,确认后会清空消息并删除队列。

方法 2:通过命令行删除

rabbitmqctl delete_queue test-ha-queue

 

posted @ 2026-03-24 11:16  sxFu9528  阅读(3)  评论(0)    收藏  举报