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%,存在显著的配置冗余。在保障业务连续性的前提下,需通过降配调优实现成本节约。
自建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.rhkb.cn/news/36792.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【正点原子K210连载】第七十六章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第七十六章 音频FFT实验 本章将介绍CanMV下FFT的应用&#xff0c;通过将时域采集到的音频数据通过FFT为频域。通过本章的学习&#xff0c;读者将学习到CanMV下控制FFT加速器进行FFT的使用。 本章分为如下几个小节&#xff1a; 32.1 maix.FFT模块介绍 32.2 硬件设计 32.3 程序设…

嵌入式开发之STM32学习笔记day08

从“门铃”到“中断”&#xff1a;手把手玩转STM32的外部中断控制器&#xff08;EXTI&#xff09; 引言&#xff1a;为什么我们需要“中断”&#xff1f; &#xff08;类比生活场景&#xff1a;用“快递按门铃”解释中断的意义&#xff09; 想象一下&#xff1a;当你在…

JVM的一些知识

JVM简介 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java 虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。常见的虚拟机&#xff1a;JVM、VMwave、Virtual Box。 JVM 和其他两个虚拟机的区别&#xff1a; VMw…

Mac:JMeter 下载+安装+环境配置(图文详细讲解)

&#x1f4cc; 下载JMeter 下载地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi &#x1f4cc; 无需安装 Apache官网下载 JMeter 压缩包&#xff0c;无需安装&#xff0c;下载解压后放到自己指定目录下即可。 按我自己的习惯&#xff0c;我会在用户 jane 目…

【简单有效!】Gradio利用html插件实现video视频流循环播放

文章目录 前言 & 思路静态资源挂载完整代码结果示例 前言 & 思路 需要利用gradio在前端搭建一个页面&#xff0c;循环播放视频。思路是直接调用gr.HTML插件实现&#xff0c;简单有效&#xff01;&#xff01;&#xff01; 静态资源挂载 app.mount("/static&quo…

⭐算法OJ⭐克隆图【BFS】(C++实现)Clone Graph

前情提要&#xff1a;图论入门【数据结构基础】&#xff1a;什么是图&#xff1f;如何表示图&#xff1f; 133. Clone Graph Given a reference of a node in a connected undirected graph. Return a deep copy (clone) of the graph. Each node in the graph contains a va…

SpringSecurity——基于角色权限控制和资源权限控制

目录 基于角色权限控制 1.1 自定义 UserDetailsService 1.2 加载用户角色 1.3. 给角色配置能访问的资源&#xff08;使用切面拦截&#xff0c;使用注解&#xff09; 总结 资源权限控制 2.2. 需要有一个用户&#xff1b;&#xff08;从数据库查询用户&#xff09; 2.2 基…

【MySQL】表的约束

目录 零、前言一、空属性二、默认值三、列描述四、zerofill五、主键六、自增长七、唯一键八、外键结尾 零、前言 表中一定要有各种约束&#xff0c;通过约束来让用户未来插入的数据是符合要求的。约束的本质就是通过计算反过来要求用户插入正确的数据。所以站在MySQL的角度上来…

SQLMesh系列教程:SQLMesh虚拟数据环境

各种工具都已将软件工程实践引入到数据工程中&#xff0c;但仍有差距存在&#xff0c;尤其是在测试和工作流等领域。SQLMesh 的目标是在这些领域开辟新的天地&#xff0c;解决像 dbt 这样的竞争产品尚未提供强大解决方案的难题。在这篇文章中&#xff0c;我将对 SQLMesh 进行简…

基于Babylon.js的Shader入门之五:让Shader支持法线贴图

如果一个比较平坦的物体表面要添加更多的凹凸细节&#xff0c;但是我们又不想通过建模实现&#xff0c;这时候法线贴图就派上用场了。法线贴图是通过与灯光的交互来让一个平坦表面造成凹凸效果假象的&#xff0c;在基于Babylon.js的Shader入门之四&#xff1a;让Shader支持基础…

活码在实际操作中的具体场景有哪些?怎么应用?

当传统二维码因“内容固定、无法追踪、流量拥堵”等问题逐渐失效时&#xff0c;活码正在成为企业破解运营痛点的关键工具。 无论是需要实时更新内容的线下物料&#xff0c;还是面临用户分流压力的线上客服&#xff0c;动态二维码都能通过“一码多用、灵活配置”的特性&#xf…

极空间NAS部署gitea教程

极空间NAS部署gitea步骤教程 背景1. 准备镜像1.1 极空间官方1.2 Win系统docker再上传1.3 镜像转录 2. MySql配置2.1 容器配置2.2 命令行配置 3. gitea配置3.1 容器配置3.2 打开网页3.3 网页配置安装 参考资料 背景 极空间Nas和别的Nas不同的地方就在于&#xff0c;他不是那种标…

Wireshark:在 显示过滤器中“加入条件”过滤后,出现其他类型的数据包,为什么?

一、 在Wireshark中使用“tcp协议”过滤后&#xff0c;仍出现TLSv1.2协议的数据包&#xff0c;原因如下&#xff1a; 1. ‌协议层次关系‌ ‌TCP是传输层协议‌&#xff0c;而‌TLS属于应用层协议‌&#xff0c;后者直接运行于TCP之上‌28。因此&#xff0c;所有TLS流量&…

【医学影像 AI】大型语言模型生成 ROP 患者信息材料的能力

【医学影像 AI】大型语言模型生成 ROP 患者信息材料的能力 0. 论文简介0.1 基本信息0.2 摘要 1. 引言2. 材料与方法2.1 大语言模型的使用2.2 可读性标准2.3 统计分析 3. 结果3.1 Bezirci-Yılmaz可读性评分3.2 Ateşman可读性评分3.3 全面性评分3.4 准确性评分 4. 讨论4.1 可读…

设计模式(行为型)-策略模式

目录 定义 类图 角色 角色详解 Strategy&#xff08;抽象策略类&#xff09;​ Context&#xff08;环境类 / 上下文类&#xff09;​ ConcreteStrategy&#xff08;具体策略类&#xff09;​ 优缺点 优点​ 缺点​ 使用场景 类行为差异场景​ 动态算法选…

服装零售行业数字化时代的业务与IT转型规划P111(111页PPT)(文末有下载方式)

服装零售行业数字化时代的业务与IT转型规划P111 详细资料请看本解读文章的最后内容。 随着数字化技术的迅猛发展&#xff0c;服装零售行业正经历着前所未有的变革。本文将对《服装零售行业数字化时代的业务与IT转型规划P111》进行详细解读&#xff0c;探讨未来几年内该行业的…

【大语言模型_6】mindie启动模型错误整理

一、启动报 [hccl_runner.cpp:141] AllGatherHcclRunner:0 HcclCommInitRootInfo fa il, error:2, rank:0, rankSize:2 背景&#xff1a;运行DeepSeek-R1-Distill-Qwen-14B模型&#xff0c;在2张300 P卡可以运行&#xff0c;单独一张启动报以上错误。 问题分析&…

STM32F429单片机FMC接口驱动TFT LCD和SDRAM

1、FMC接口介绍 FMC 接口&#xff08;即可变存储控制器&#xff09;是一种用于管理外部存储器的外设接口&#xff0c;支持多种类型的存储器&#xff0c;主要分为三大类&#xff1a;NOR/SRAM/PSRAM设备&#xff08;TFTLCD相当于SRAM&#xff09;、NOR FLASH/NAND FLASH/PC卡设备…

ollama不安装到c盘,安装到其他盘

ollama 安装包默认安装到c盘&#xff0c;安装程序并没有提供选择文件夹安装功能&#xff0c;本来c盘就快满了&#xff0c;下几个模型c盘都快爆了&#xff0c;如何将ollma安装到其他盘呢&#xff1f; ollama 默认安装位置 C:\Users\Admin\.ollama 是 Ollama 用来放大模型的文件夹…

java项目之基于ssm的少儿编程在线培训系统(源码+文档)

项目简介 少儿编程在线培训系统实现了以下功能&#xff1a; 用户信息管理&#xff1a; 用户信息新增 用户信息修改 教师信息管理&#xff1a; 教师信息添加 教师信息删除 教师信息修改 课程信息管理&#xff1a; 课程信息添加 课程信息修改 课程信息删除 课程类型管理&…