RabbitMQ 集群降配
这里写自定义目录标题
- 摘要
- 检查状态
- 1. 检查 RabbitMQ 服务状态
- 2. 检查 RabbitMQ 端口监听
- 3. 检查 RabbitMQ 管理插件是否启用
- 4. 检查开机自启状态
- 5. 确认集群高可用性
- 6. 检查使用该集群的服务是否做了断开重连
- 实操
- 1. 负载均衡配置
- 2. 逐个节点降配(滚动操作)
- 2.1 停止 RabbitMQ 服务
- 2.2 调整 ECS 配置
- 2.3 恢复节点并重新加入集群
- 2.4 恢复负载均衡流量
- 3. 全局监控与验证
- 4. 降配后优化(可选)
- 风险点与应对
- 总结
- 命令说明
- 查看集群状态命令 rabbitmqctl cluster_status
- 1. 集群节点状态
- 2. 网络分区
- 3. 告警状态
- 4. 集群名称
- 健康状态总结
- 进一步验证建议
- 1. 检查队列镜像状态
- 2. 检查资源使用情况
- 3. 检查日志
- 4. 监控连接数
- 查看节点同步状态 rabbitmqctl list_queues name pid slave_pids synchronised_slave_pids
- 字段含义
- 如何判断镜像同步完成
- 删除队列
- 在 RabbitMQ 中执行删除队列(`delete_queue`)操作时,如果出现 `Access refused` 错误,通常是由于权限问题导致的。以下是可能的原因及解决方法:
- 1. 用户权限不足
- 检查用户权限
- 解决方法
- 2. 队列被其他消费者占用
- 解决方法
- 3. 用户未绑定到正确的虚拟主机
- 检查虚拟主机
- 解决方法
摘要
背景:2025年云成本优化仍是技术团队的核心命题。当前需对遗留架构进行精细化治理,其中由前任架构师设计的RabbitMQ集群成为重点优化对象。该集群采用经典高可用架构,由3台阿里云ECS实例构成核心节点,并通过负载均衡(SLB)实现流量分发。然而,经监控分析发现,节点资源利用率长期低于40%,存在显著的配置冗余。在保障业务连续性的前提下,需通过降配调优实现成本节约。

ECS 配置:8C16G,CPU利用率 峰值18%, 内存峰值 25%
降配目标:平滑的将ECS节点降配至 2C8G

检查状态
1. 检查 RabbitMQ 服务状态
使用 systemctl 命令查看服务是否正在运行:
sudo systemctl status rabbitmq-server
- 输出结果:
- 如果显示
active (running),表示服务已启动。 - 如果显示
inactive (dead),表示服务未运行。
- 如果显示
2. 检查 RabbitMQ 端口监听
RabbitMQ 默认监听 5672(AMQP 协议)和 15672(管理界面)端口:
# 使用 netstat 或 ss 命令检查端口
sudo netstat -tuln | grep -E '5672|15672'
# 或
sudo ss -tuln | grep -E '5672|15672'
- 输出结果:如果有
LISTEN状态的端口,说明服务正常。
3. 检查 RabbitMQ 管理插件是否启用
若需通过 Web 界面管理 RabbitMQ,需确认管理插件是否启用:
sudo rabbitmq-plugins list
- 输出结果:查找
rabbitmq_management是否标记为[E*](已启用)。
4. 检查开机自启状态
确认 RabbitMQ 是否设置为开机自启:
sudo systemctl is-enabled rabbitmq-server
- 输出结果:
enabled:已设置开机自启。disabled:未设置开机自启(可通过sudo systemctl enable rabbitmq-server启用)。
5. 确认集群高可用性
- 镜像队列配置:确保所有业务队列已配置镜像策略(如
ha-mode: all或指定副本数),避免单节点故障导致消息丢失。# 查看当前策略 rabbitmqctl list_policies # 示例:设置所有队列在3个节点镜像 rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' - 集群状态健康:确认所有节点状态为
running,且无网络分区问题。rabbitmqctl cluster_status
6. 检查使用该集群的服务是否做了断开重连
实操
1. 负载均衡配置
- 设置待降配节点的权重:在负载均衡(如 SLB)中暂时设置待操作节点的流量权重为0,确保降配期间流量仅路由到其他节点。
2. 逐个节点降配(滚动操作)
2.1 停止 RabbitMQ 服务
sudo systemctl stop rabbitmq-server
- 验证节点离线:检查集群状态,确认该节点已标记为
down。rabbitmqctl cluster_status
2.2 调整 ECS 配置
- 关机 ECS
- 降配操作:通过 ECS 控制台或 API 调整实例规格(CPU/内存)。
- 重启 ECS(如需):若配置变更需要重启,确保重启后网络和存储正常挂载。
2.3 恢复节点并重新加入集群
- 启动 RabbitMQ:
sudo systemctl start rabbitmq-server - 重新加入集群:如果节点因 IP 或主机名变化无法自动加入,需手动操作(一般不需要重新加入)
# 在新节点上重置 RabbitMQ 并重新加入集群 rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster rabbit@<主节点主机名> rabbitmqctl start_app - 验证集群状态:确保节点状态为
running,且队列镜像同步完成。
2.4 恢复负载均衡流量
- 将节点权重恢复,观察健康检查状态。
3. 全局监控与验证
- 业务监控:观察消息堆积、消费延迟、连接数等指标。
- 集群同步状态:检查镜像队列同步进度。
rabbitmqctl list_queues name messages_ready messages_unacknowledged - 日志检查:排查降配节点是否有异常报错。
tail -f /var/log/rabbitmq/rabbit@*.log
4. 降配后优化(可选)
- 调整内存阈值:根据新配置优化 RabbitMQ 内存限制(
vm_memory_high_watermark)。 - 磁盘空间监控:确保降配后的磁盘容量足够(RabbitMQ 默认需至少 50MB 剩余空间)。
风险点与应对
- 同步延迟:降配节点重启后,若队列数据量大,同步时间可能较长。建议在低峰期操作。
- 配置兼容性:确保新规格满足 RabbitMQ 最低要求(如内存不低于 1GB)。
- 网络波动:降配期间若节点 IP 变化,需更新集群节点列表和负载均衡配置。
总结
通过 逐节点滚动降配 + 负载均衡流量切换,可实现业务无感知。关键点在于确保镜像队列冗余、集群健康状态,以及操作顺序的严谨性。建议先在测试环境模拟流程,再在生产环境执行。
命令说明
查看集群状态命令 rabbitmqctl cluster_status
输出结果解析
Cluster status of node rabbit@rabbitmq-prod-03 ...
[{nodes,[{disc,['rabbit@rabbitmq-prod-01','rabbit@rabbitmq-prod-02','rabbit@rabbitmq-prod-03']}]},{running_nodes,['rabbit@rabbitmq-prod-02','rabbit@rabbitmq-prod-01','rabbit@rabbitmq-prod-03']},{cluster_name,<<"rabbit@rabbitmq-prod-01">>},{partitions,[]},{alarms,[{'rabbit@rabbitmq-prod-02',[]},{'rabbit@rabbitmq-prod-01',[]},{'rabbit@rabbitmq-prod-03',[]}]}].
1. 集群节点状态
- 所有节点均在线:
{nodes}列表显示集群包含 3 个磁盘节点(disc类型):rabbit@rabbitmq-prod-01,rabbit@rabbitmq-prod-02,rabbit@rabbitmq-prod-03。{running_nodes}列表显示这 3 个节点当前都在运行。
2. 网络分区
- 无网络分区:
{partitions,[]}表示没有发生网络分区问题。如果存在分区,partitions字段会列出被隔离的节点及其分区信息。
3. 告警状态
- 无告警:
{alarms,[{'rabbit@rabbitmq-prod-02',[]}, {'rabbit@rabbitmq-prod-01',[]}, {'rabbit@rabbitmq-prod-03',[]}]}表明所有节点均未触发任何告警(如内存、磁盘空间不足等)。
4. 集群名称
- 集群名称一致:
{cluster_name,<<"rabbit@rabbitmq-prod-01">>}显示集群的名称为rabbit@rabbitmq-prod-01,所有节点共享同一个集群名称,表明它们属于同一集群。
健康状态总结
从上述分析来看,你的 RabbitMQ 集群处于健康状态:
- 所有节点都在线且正常运行。
- 没有网络分区问题。
- 没有任何节点触发告警。
- 集群名称一致,结构完整。
进一步验证建议
虽然当前状态健康,但为了确保长期稳定运行,可以执行以下检查:
1. 检查队列镜像状态
确认队列是否在多个节点上正确镜像:
rabbitmqctl list_queues name pid slave_pids synchronised_slave_pids
- 确保关键队列的
slave_pids和synchronised_slave_pids包含至少 2 个节点。
2. 检查资源使用情况
监控节点的 CPU、内存和磁盘使用率,避免因资源不足导致性能下降或告警:
# 查看磁盘剩余空间
df -h# 查看内存使用情况
free -m# 查看 RabbitMQ 内存使用
rabbitmqctl status | grep -A 5 "memory"
3. 检查日志
查看 RabbitMQ 日志文件,排查潜在的警告或错误:
tail -n 20 /var/log/rabbitmq/rabbit@*.log
4. 监控连接数
确保各节点的连接数在合理范围内:
rabbitmqctl list_connections --node rabbit@rabbitmq-prod-03 | grep -v "Listing" | wc -l
查看节点同步状态 rabbitmqctl list_queues name pid slave_pids synchronised_slave_pids
命令输出解析
以下是 rabbitmqctl list_queues name pid slave_pids synchronised_slave_pids 的输出示例:
name: collector_event
pid: <rabbit@rabbitmq-prod-03.1606707793.6080.60>
slave_pids: [<rabbit@rabbitmq-prod-02.1607654826.19286.68>, <rabbit@rabbitmq-prod-01.1606707802.17230.4475>]
synchronised_slave_pids: [<rabbit@rabbitmq-prod-01.1606707802.17230.4475>, <rabbit@rabbitmq-prod-02.1607654826.19286.68>]
字段含义
-
name:- 队列名称。例如:
collector_event。
- 队列名称。例如:
-
pid:- 主队列所在节点的进程 ID(Process ID)。例如:
<rabbit@rabbitmq-prod-03.1606707793.6080.60>表示主队列位于rabbit@rabbitmq-prod-03节点。
- 主队列所在节点的进程 ID(Process ID)。例如:
-
slave_pids:- 副本队列所在的节点和进程 ID 列表。例如:
<rabbit@rabbitmq-prod-02.1607654826.19286.68>表示该副本位于rabbit@rabbitmq-prod-02。<rabbit@rabbitmq-prod-01.1606707802.17230.4475>表示该副本位于rabbit@rabbitmq-prod-01。
- 副本队列所在的节点和进程 ID 列表。例如:
-
synchronised_slave_pids:- 已完成数据同步的副本队列所在的节点和进程 ID 列表。例如:
<rabbit@rabbitmq-prod-01.1606707802.17230.4475>和<rabbit@rabbitmq-prod-02.1607654826.19286.68>表示这两个副本已完成同步。
- 已完成数据同步的副本队列所在的节点和进程 ID 列表。例如:
如何判断镜像同步完成
-
比较
slave_pids和synchronised_slave_pids:- 如果
synchronised_slave_pids包含所有slave_pids中的节点,则表示所有副本均已同步完成。 - 示例分析:
slave_pids:[<rabbit@rabbitmq-prod-02>, <rabbit@rabbitmq-prod-01>]synchronised_slave_pids:[<rabbit@rabbitmq-prod-01>, <rabbit@rabbitmq-prod-02>]- 结论:
synchronised_slave_pids包含了所有slave_pids,说明镜像已完全同步。
- 如果
-
检查数量是否一致:
- 如果
slave_pids和synchronised_slave_pids的数量相同,且内容一致,则镜像同步完成。
- 如果
-
异常情况:
- 如果
synchronised_slave_pids为空或少于slave_pids,则表示某些副本尚未完成同步,需等待同步完成后再继续操作。可以到管理界面queue界面查看有哪些队里没有同步完成,可点击进入队列并手动同步。
- 如果
删除队列
rabbitmqctl delete_queue -p <host> <queue_name>
在 RabbitMQ 中执行删除队列(delete_queue)操作时,如果出现 Access refused 错误,通常是由于权限问题导致的。以下是可能的原因及解决方法:
1. 用户权限不足
RabbitMQ 的用户权限分为三类:
- Configure:允许创建和删除队列、交换器等资源。
- Write:允许向队列发送消息。
- Read:允许从队列消费消息。
检查用户权限
使用以下命令查看当前用户的权限:
rabbitmqctl list_permissions -p <vhost>
<vhost>是目标虚拟主机,默认为/。- 输出示例:
Listing permissions for vhost "/" ... user configure write read guest .* .* .*
解决方法
确保当前用户对目标队列所在的虚拟主机具有足够的权限:
# 授予用户对虚拟主机的权限
rabbitmqctl set_permissions -p <vhost> <username> ".*" ".*" ".*"
<username>:当前登录 RabbitMQ 的用户名。"."*:表示匹配所有资源。
2. 队列被其他消费者占用
如果队列正在被其他消费者使用(例如有活跃的连接或未确认的消息),删除操作可能会失败。
解决方法
- 停止消费者:确保没有客户端正在消费该队列。
- 清空队列(可选):
或通过管理界面清空队列。rabbitmqadmin delete queue name=<queue_name>
3. 用户未绑定到正确的虚拟主机
RabbitMQ 支持多虚拟主机(vhost)。如果用户未绑定到目标队列所在的虚拟主机,也会导致权限拒绝。
检查虚拟主机
列出所有虚拟主机:
rabbitmqctl list_vhosts
解决方法
将用户添加到正确的虚拟主机,并授予权限:
# 添加用户到虚拟主机
rabbitmqctl add_user <username> <password>
rabbitmqctl set_permissions -p <vhost> <username> ".*" ".*" ".*"
相关文章:
RabbitMQ 集群降配
这里写自定义目录标题 摘要检查状态1. 检查 RabbitMQ 服务状态2. 检查 RabbitMQ 端口监听3. 检查 RabbitMQ 管理插件是否启用4. 检查开机自启状态5. 确认集群高可用性6. 检查使用该集群的服务是否做了断开重连 实操1. 负载均衡配置2. 逐个节点降配(滚动操作…...
uniapp工程中解析markdown文件
在uniapp中如何导入markdown文件,同时在页面中解析成html,请参考以下配置: 1. 安装以下3个依赖包 npm install marked highlight.js vite-plugin-markdown 2. 创建vite.config.js配置文件 // vite.config.js import { defineConfig } fro…...
数据结构:二叉树(一)·(重点)
前言 什么树?what? 树的概念与结构 概念: 树是⼀种⾮线性的数据结构,它是由 n ( n>0 ) 个有限结点组成⼀个具有层次关系的集合。 结构: 有⼀个特殊的结点,称为根结点&#…...
DevEco Studio的使用
目录 1.创建ArkTS工程 2.ArkTS工程目录结构(Stage模型) 构建第一个页面 构建第二个页面 实现页面间的跳转 1.创建ArkTS工程 若首次打开DevEco Studio,请点击Create Project创建工程。如果已经打开了一个工程,请在菜单栏选择…...
十七、实战开发 uni-app x 项目(仿京东)- 后端指南
前面我们已经用uniappx进行了前端实战学习 一、实战 开发uni-app x项目(仿京东)-规划-CSDN博客 二、实战 开发uni-app x项目(仿京东)-项目搭建-CSDN博客 三、实战开发 uni-app x 项目(仿京东)- 技术选型-CSDN博客 四、实战开发 uni-app x 项目(仿京东)- 页面设计-C…...
数据开发岗笔试题>>sql(hive) ,excel [2025]
sql SELECT user_id, AVG(loan_amount) AS avg_loan_amount FROM loan GROUP BY user_id HAVING AVG(loan_amount) > 20000; 授信表:credit 字段包含user_id(用户id),credit_id(授信id),credit_time(授信时间yyyy-MM-dd HH:mm:ss)&#x…...
内存模型以及分区,需要详细到每个区放什么。
1. 内存模型以及分区,需要详细到每个区放什么。 JVM 分为堆区和栈区,还有方法区,初始化的对象放在堆里面,引用放在栈里面, class 类信息常量池(static 常量和 static 变量)等放在方法区new: …...
python strip/rstrip/lstrip详细讲解(涵盖许多例子、作用以及复杂行为处理)
python strip/rstrip/lstrip详细讲解: 在Python中,strip、lstrip、rstrip 是用于字符串处理的常用方法,主要功能是去除字符串首尾的指定字符。它们的区别如下: 1. strip([chars]) 作用 :删除字符串开头和结尾 处所有属于 chars 的字符,直到遇到不属于 chars 的字符为止…...
Spring Boot集成PageHelper:轻松实现数据库分页功能
Spring Boot集成PageHelper:轻松实现数据库分页功能 1. 为什么需要分页? 分页是处理大数据量查询的核心技术,其重要性体现在: 性能优化:避免单次查询返回过多数据导致内存溢出或响应延迟。用户体验:前端展…...
OpenGL ES 入门指南:从基础到实战
引言:为什么需要 OpenGL ES? 在当今的嵌入式设备(如智能手机、汽车仪表盘、智能家居中控屏)中,流畅的图形渲染能力是用户体验的核心。OpenGL ES(OpenGL for Embedded Systems) 作为行业标准&am…...
docker安装milvus向量数据库Attu可视化界面
Docker 部署 Milvus 及 Attu 可视化工具完整指南 一、环境准备 安装 Docker 及 Docker Compose Docker 版本需 ≥20.10.12Docker Compose 版本需 ≥2.20.0(推荐 V2) 验证 Docker 环境 docker --version && docker-compose --version若出现&…...
Elasticsearch 索引
一、简介 在 Elasticsearch 中,索引(Index)是存储相关文档的地方,类似于关系数据库中的数据库。索引是 Elasticsearch 中最重要的概念之一,用于组织和存储数据。 二、索引的基本概念 索引(Index…...
ArcGIS10. 8简介与安装,附下载地址
目录 ArcGIS10.8 1. 概述 2. 组成与功能 3. 10.8 特性 下载链接 安装步骤 1. 安装准备 2. 具体步骤 3.补丁 其他版本安装 ArcGIS10.8 1. 概述 ArcGIS 10.8 是由美国 Esri 公司精心研发的一款功能强大的地理信息系统(GIS)平台。其核心功能在于…...
Idea中使用Git插件_合并当前分支到master分支_冲突解决_很简单---Git工作笔记005
由于之前用svn习惯了,用的git少,其实在idea中使用git,解决冲突,合并分支,非常的简单,一起来看一下吧. 一定要注意操作之前,一定要确保自己的分支代码,都已经commit提交了,并且push到远程了. 不要丢东西. 可以看到首先,在idea的左下角有个 git,点开以后 可以看到有显示的分支…...
Docker简易使用说明
Docker使用说明 文章目录 Docker使用说明一. 安装二. 测试三. 镜像加速 一. 安装 安装其实没什么可说的,但凡有显示界面的OS,如windows/Mac,直接上官方网站下载安装即可 二. 测试 若安装好docker后,应当先检测docker的网络通信…...
【Linux】应用层自定义协议 + 序列化和反序列化
应用层自定义协议 序列化和反序列化 一.应用层1.再谈 "协议"2.序列化 和 反序列化 二. Jsoncpp1.序列化2.反序列化 三. Tcp全双工 面向字节流四.自定义协议 保证报文的完整性1.Makefile2.Mutex.hpp3.Cond.hpp4.Log.hpp5.Thread.hpp6.ThreadPool.hpp7.Common.hpp8.…...
Matlab 雷达导引头伺服系统的建模与仿真研究
1、内容简介 Matlab 177-雷达导引头伺服系统的建模与仿真研究 可以交流、咨询、答疑 2、内容说明 略[摘 要]基于 Malah/Simuink 雷达导引|头同服系统的建模与仿真,首先对雷达导引头同服系统按照预定回路和跟踪回路的步骤分别进行建模以及相关控制参数计算,接着构建…...
华为ipd流程华为流程体系管理华为数字化转型流程数字化管理解决方案介绍81页精品PPT
华为流程体系最佳实践主要包括构建完善的流程框架,明确各层级流程要素与职责,梳理涵盖研发、采购、营销、服务、资产管理等多领域的流程,通过梳理业务场景和核心能力搭建差异化流程框架,采用自上而下与自下而上相结合的建模方法&a…...
深入理解 HTML 中的统一资源定位器(URL)
一、引言 在互联网的世界中,我们每天都在与各种网页打交道。而网页能够被准确地访问和获取,离不开一个关键的元素 —— 统一资源定位器(Uniform Resource Locators,简称 URL)。它就像是网络世界中的地址,指…...
网络流基本概念及实现算法
基本概念 流网络 对于一个有向图, 抽象成水管里的水的模型, 每根管子有容量限制, 计为 G ( V , E ) G (V, E) G(V,E), 首先不考虑反向边 对于任意无向图, 都可以将反向边转化为上述形式 如果一条边不存在, 定义为容量为 0 0 0, 形式上来说就是 c ( u , v ) 0 c(u, v) 0 c(…...
Qt程序增加Dump文件保存
qt程序出现程序闪退,对这些未能捕获的异常,存储未Dump文件方便我们定位哪块代码出的问题。利用Window API 的相关接口,具体如下 #include <QCoreApplication> #include <windows.h> #include <DbgHelp.h> #include <QD…...
【Go每日一练】猜数字游戏
👻创作者:丶重明 👻创作时间:2025年3月16日 👻擅长领域:运维 目录 1.😶🌫️题目:猜数字游戏2.😶🌫️代码开发3.😶🌫…...
SpringBoot对接DeepSeek
文章目录 Spring Boot 集成 DeepSeek API 详细步骤1. 创建API Key1.访问 [DeepSeek控制台](https://platform.deepseek.com/usage) 并登录。2.点击 Create API Key 生成新密钥。3.复制并保存密钥(需在Spring Boot配置文件中使用)。 2. 创建Spring Boot工…...
doris:审计日志
Doris 提供了对于数据库操作的审计能力,可以记录用户对数据库的登陆、查询、修改操作。在 Doris 中,可以直接通过内置系统表查询审计日志,也可以直接查看 Doris 的审计日志文件。 开启审计日志 通过全局变量 enable_audit_plugin 可以随时…...
`fetch` 和 `axios`的前端使用区别
🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉 欢迎访问的个人博客&am…...
大语言模型的多垂类快速评估与 A/B 测试
简介 行业领先的模型构建企业携手澳鹏(Appen)开展了一项极具挑战性的项目。针对 3 至 6 个大型语言模型(LLM),在广泛的通用领域及复杂专业领域(如医疗保健、法律、金融、编程、数学和汽车行业等࿰…...
【RabbitMQ】RabbitMQ如何保证消息不丢失?
为了保证消息不丢失,需要在生产者、RabbitMQ本身和消费者三个环节采取相应措施。 1.生产者端:确保消息发送成功 1.1开启消息确认机制(Publisher Confirms) 原理: 生产者发送消息后,RabbitMQ会返回一个确认(ACK),表示消息已成功…...
RAGFlow + LlamaIndex 本地知识库RAG增强架构与实现直播智能复盘
一、需求分析与架构设计 基于 RAGFlow LlamaIndex 本地知识库RAG 扩展直播话术合规与复盘系统,需构建 实时流处理、多模态合规引擎、智能复盘分析 三层能力。以下是完整架构图与技术方案: 二、核心模块技术方案 1. 直播流实时处理(输入层→…...
《UNIX网络编程卷1:套接字联网API》第2章 传输层:TCP、UDP和SCTP
《UNIX网络编程卷1:套接字联网API》第2章 传输层:TCP、UDP和SCTP 2.1 传输层的核心作用与协议选型 传输层是网络协议栈中承上启下的核心层,直接决定应用的通信质量。其主要职责包括: 端到端通信:屏蔽底层网络细节&am…...
阿里云平台服务器操作以及发布静态项目
目录: 1、云服务器介绍2、云服务器界面3、发布静态项目1、启动nginx2、ngixn访问3、外网访问测试4、拷贝静态资源到nginx目录下并重启nginx 1、云服务器介绍 2、云服务器界面 实例详情:里面主要显示云服务的内外网地址以及一些启动/停止的操作。监控&…...
