RabbitMQ集群部署
RabbitMQ依赖Erlang运行环境,且版本需严格匹配,需先安装Erlang再安装RabbitMQ。
版本对应关系:https://www.rabbitmq.com/docs/which-erlang
Erlang:erlang-26.2-1.el8.x86_64.rpm
RabbitMQ:rabbitmq-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

# 启用后,可通过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 ".*" ".*" ".*"

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

三、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安装的RabbitMQ,Cookie文件默认存放在/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.21和192.168.193.27加入集群(节点类型分为“内存节点”和“磁盘节点”,默认是磁盘节点),以下操作只在192.168.193.21和192.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

六、验证集群
# 在任意节点执行以下命令,查看集群节点列表
rabbitmqctl cluster_status
# 输出结果中,nodes字段应包含3个节点(rabbit@k8s-192-168-193-18、rabbit@control-02、rabbit@control-03),表示集群搭建成功。

# Web界面验证
登录任意节点的Web管理界面,在Overview -> Nodes页面,可看到所有节点的状态(如“running”)和相关信息。
注意:重置节点状态后用户已清空,需要重新创建远程登录用户(只需在一个节点创建,其他节点会同步元数据)

七、镜像集群配置(实现高可用)
普通集群的缺陷是队列数据仅存于创建节点,若该节点宕机,队列将不可用。镜像集群通过队列数据复制到多个节点解决此问题,确保单点故障后服务不中断。
#1. 镜像策略用于定义哪些队列需要镜像、复制到多少个节点,在任意节点执行以下命令,配置“所有队列自动镜像到集群所有节点”
# 命令格式:rabbitmqctl set_policy 策略名称 队列匹配规则 策略参数
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
参数说明:
ha-all:策略名称(自定义,如“ha-all”表示“全量镜像”)。
"^":队列匹配规则(正则表达式,^表示匹配所有队列,可指定前缀如^order_仅镜像订单相关队列)。
{"ha-mode":"all"} : 策略模式为all即复制到所有节点,包括新增节点

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

#3. 查看镜像状态
在队列列表中,点击创建的test-ha-queue,进入详情页:
下方节点列表会标注“Node”(主节点,处理消息生产/消费)和“Mirrors”(从节点,同步主节点数据)。

九、测试高可用
#1. 手动停止队列的主节点(如192.168.193.18),执行:
systemctl stop rabbitmq-server
#2. web管理界面任意登录另外两个节点中一个,会发现test-ha-queue的主节点自动切换为其他节点,队列仍可正常接收和消费消息,证明高可用生效。

#3. 恢复192.168.193.18服务
systemctl start rabbitmq-server
#4. 刷新Web管理界面查看192.168.193.18节点已变成Mirrors

#5. 删除测试Queue test-ha-queue
方法 1:通过 Web 管理界面删除(直观)
- 在当前 Queues and Streams 页面,找到 test-ha-queue 队列。
- 向下滚动到队列详情页的 Delete 区域。
- 点击 Delete queue 按钮,确认删除即可。
- 若队列中有未消费的消息,会提示 Are you sure?,确认后会清空消息并删除队列。
方法 2:通过命令行删除
rabbitmqctl delete_queue test-ha-queue

浙公网安备 33010602011771号