RabbitMQ 集群降配

news2025/3/20 18:57:55

这里写自定义目录标题

    • 摘要
    • 检查状态
      • 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%,存在显著的配置冗余。在保障业务连续性的前提下,需通过降配调优实现成本节约。
自建RabbitMQ集群

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 剩余空间)。

风险点与应对

  1. 同步延迟:降配节点重启后,若队列数据量大,同步时间可能较长。建议在低峰期操作。
  2. 配置兼容性:确保新规格满足 RabbitMQ 最低要求(如内存不低于 1GB)。
  3. 网络波动:降配期间若节点 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. 所有节点都在线且正常运行。
  2. 没有网络分区问题。
  3. 没有任何节点触发告警。
  4. 集群名称一致,结构完整。

进一步验证建议

虽然当前状态健康,但为了确保长期稳定运行,可以执行以下检查:

1. 检查队列镜像状态

确认队列是否在多个节点上正确镜像:

rabbitmqctl list_queues name pid slave_pids synchronised_slave_pids
  • 确保关键队列的 slave_pidssynchronised_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>]
字段含义
  1. name

    • 队列名称。例如:collector_event
  2. pid

    • 主队列所在节点的进程 ID(Process ID)。例如:<rabbit@rabbitmq-prod-03.1606707793.6080.60> 表示主队列位于 rabbit@rabbitmq-prod-03 节点。
  3. 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
  4. synchronised_slave_pids

    • 已完成数据同步的副本队列所在的节点和进程 ID 列表。例如:
      • <rabbit@rabbitmq-prod-01.1606707802.17230.4475><rabbit@rabbitmq-prod-02.1607654826.19286.68> 表示这两个副本已完成同步。

如何判断镜像同步完成
  1. 比较 slave_pidssynchronised_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,说明镜像已完全同步。
  2. 检查数量是否一致

    • 如果 slave_pidssynchronised_slave_pids 的数量相同,且内容一致,则镜像同步完成。
  3. 异常情况

    • 如果 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> ".*" ".*" ".*"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2318534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构:二叉树(一)·(重点)

前言 什么树&#xff1f;what&#xff1f; 树的概念与结构 概念&#xff1a; 树是⼀种⾮线性的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09; 个有限结点组成⼀个具有层次关系的集合。 结构&#xff1a; 有⼀个特殊的结点&#xff0c;称为根结点&#…

DevEco Studio的使用

目录 1.创建ArkTS工程 2.ArkTS工程目录结构&#xff08;Stage模型&#xff09; 构建第一个页面 构建第二个页面 实现页面间的跳转 1.创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择…

数据开发岗笔试题>>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; 授信表&#xff1a;credit 字段包含user_id(用户id)&#xff0c;credit_id(授信id)&#xff0c;credit_time(授信时间yyyy-MM-dd HH:mm:ss)&#x…

OpenGL ES 入门指南:从基础到实战

引言&#xff1a;为什么需要 OpenGL ES&#xff1f; 在当今的嵌入式设备&#xff08;如智能手机、汽车仪表盘、智能家居中控屏&#xff09;中&#xff0c;流畅的图形渲染能力是用户体验的核心。OpenGL ES&#xff08;OpenGL for Embedded Systems&#xff09; 作为行业标准&am…

docker安装milvus向量数据库Attu可视化界面

Docker 部署 Milvus 及 Attu 可视化工具完整指南 一、环境准备 安装 Docker 及 Docker Compose Docker 版本需 ≥20.10.12Docker Compose 版本需 ≥2.20.0&#xff08;推荐 V2&#xff09; 验证 Docker 环境 docker --version && docker-compose --version若出现&…

ArcGIS10. 8简介与安装,附下载地址

目录 ArcGIS10.8 1. 概述 2. 组成与功能 3. 10.8 特性 下载链接 安装步骤 1. 安装准备 2. 具体步骤 3.补丁 其他版本安装 ArcGIS10.8 1. 概述 ArcGIS 10.8 是由美国 Esri 公司精心研发的一款功能强大的地理信息系统&#xff08;GIS&#xff09;平台。其核心功能在于…

Idea中使用Git插件_合并当前分支到master分支_冲突解决_很简单---Git工作笔记005

由于之前用svn习惯了,用的git少,其实在idea中使用git,解决冲突,合并分支,非常的简单,一起来看一下吧. 一定要注意操作之前,一定要确保自己的分支代码,都已经commit提交了,并且push到远程了. 不要丢东西. 可以看到首先,在idea的左下角有个 git,点开以后 可以看到有显示的分支…

【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 雷达导引|头同服系统的建模与仿真&#xff0c;首先对雷达导引头同服系统按照预定回路和跟踪回路的步骤分别进行建模以及相关控制参数计算,接着构建…

华为ipd流程华为流程体系管理华为数字化转型流程数字化管理解决方案介绍81页精品PPT

华为流程体系最佳实践主要包括构建完善的流程框架&#xff0c;明确各层级流程要素与职责&#xff0c;梳理涵盖研发、采购、营销、服务、资产管理等多领域的流程&#xff0c;通过梳理业务场景和核心能力搭建差异化流程框架&#xff0c;采用自上而下与自下而上相结合的建模方法&a…

网络流基本概念及实现算法

基本概念 流网络 对于一个有向图, 抽象成水管里的水的模型, 每根管子有容量限制, 计为 G ( V , E ) G (V, E) G(V,E), 首先不考虑反向边 对于任意无向图, 都可以将反向边转化为上述形式 如果一条边不存在, 定义为容量为 0 0 0, 形式上来说就是 c ( u , v ) 0 c(u, v) 0 c(…

SpringBoot对接DeepSeek

文章目录 Spring Boot 集成 DeepSeek API 详细步骤1. 创建API Key1.访问 [DeepSeek控制台](https://platform.deepseek.com/usage) 并登录。2.点击 Create API Key 生成新密钥。3.复制并保存密钥&#xff08;需在Spring Boot配置文件中使用&#xff09;。 2. 创建Spring Boot工…

大语言模型的多垂类快速评估与 A/B 测试

简介 行业领先的模型构建企业携手澳鹏&#xff08;Appen&#xff09;开展了一项极具挑战性的项目。针对 3 至 6 个大型语言模型&#xff08;LLM&#xff09;&#xff0c;在广泛的通用领域及复杂专业领域&#xff08;如医疗保健、法律、金融、编程、数学和汽车行业等&#xff0…

RAGFlow + LlamaIndex 本地知识库RAG增强架构与实现直播智能复盘

一、需求分析与架构设计 基于 RAGFlow LlamaIndex 本地知识库RAG 扩展直播话术合规与复盘系统&#xff0c;需构建 实时流处理、多模态合规引擎、智能复盘分析 三层能力。以下是完整架构图与技术方案&#xff1a; 二、核心模块技术方案 1. 直播流实时处理&#xff08;输入层→…

阿里云平台服务器操作以及发布静态项目

目录&#xff1a; 1、云服务器介绍2、云服务器界面3、发布静态项目1、启动nginx2、ngixn访问3、外网访问测试4、拷贝静态资源到nginx目录下并重启nginx 1、云服务器介绍 2、云服务器界面 实例详情&#xff1a;里面主要显示云服务的内外网地址以及一些启动/停止的操作。监控&…

【大模型实战篇】使用GPTQ量化QwQ-32B微调后的推理模型

1. 量化背景 之所以做量化&#xff0c;就是希望在现有的硬件条件下&#xff0c;提升性能。量化能将模型权重从高精度&#xff08;如FP32&#xff09;转换为低精度&#xff08;如INT8/FP16&#xff09;&#xff0c;内存占用可减少50%~75%。低精度运算&#xff08;如INT8&#xf…

基于springboot医疗平台系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 信息化时代&#xff0c;各行各业都以网络为基础飞速发展&#xff0c;而医疗服务行业的发展却进展缓慢&#xff0c;传统的医疗服务行业已经逐渐不满足民众的需求&#xff0c;有些还在以线下预约挂号的方式接待病人&#xff0c;为此设计一个医疗平台系统很有必要。此类系统…

Stable Diffusion lora训练(一)

一、不同维度的LoRA训练步数建议 2D风格训练 数据规模&#xff1a;建议20-50张高质量图片&#xff08;分辨率≥10241024&#xff09;&#xff0c;覆盖多角度、多表情的平面风格。步数范围&#xff1a;总步数控制在1000-2000步&#xff0c;公式为 总步数 Repeat Image Epoch …

网络空间安全(37)获取webshell方法总结

一、直接上传获取Webshell 这是最常见且直接的方法&#xff0c;利用网站对上传文件的过滤不严或存在漏洞&#xff0c;直接上传Webshell文件。 常见场景&#xff1a; 许多PHP和JSP程序存在此类漏洞。例如&#xff0c;一些论坛系统允许用户上传头像或心情图标&#xff0c;攻击者可…

第十三次CCF-CSP认证(含C++源码)

第十三次CCF-CSP认证 跳一跳满分题解 碰撞的小球满分题解遇到的问题 棋局评估满分题解 跳一跳 题目链接 满分题解 没什么好说的 基本思路就是如何用代码翻译题目所给的一些限制&#xff0c;以及变量应该如何更新&#xff0c;没像往常一样给一个n&#xff0c;怎么读入数据&…