当前位置: 首页 > news >正文

RabbitMQ故障全解析:消费、消息及日常报错处理与集群修复

文章目录

  • 前言:
  • 1 消费慢
  • 2 消息丢失
  • 3 消息重复消费
  • 4 日常报错及解决
    • 4.1 报错“error in config file “/etc/rabbitmq/rabbitmq.config” (none): no ending found”
    • 4.2 生产者发送消息报错
    • 4.3 浏览器打开IP地址,无法访问 RabbitMQ(白屏没有结果)
    • 4.4 Web管理界面不显示信息
    • 4.5 安装Erlang时openssl版本太低报错
    • 4.6 安装时提示错误:error: Failed dependencies: socat is needed by rabbitmq-server
    • 4.7 rabbitmq启用web管理插件报错 Error: The following plugins could not be found:
    • 4.8 rabbitmq启动报错ERROR: epmd error for host xxx: timeout (timed out)
    • 4.9 rabbitmq节点加入集群报错
  • 5 集群节点故障修复

前言:

RabbitMQ注意小计(故障恢复提示):

  • 保证集群中至少有一个磁盘类型的节点以防数据丢失,在更改节点类型时尤其要注意。

  • 若整个集群被停掉了,应保证最后一个down掉的节点被最先启动,若不能则要使用forget_cluster_node命令将其移出集群。

  • 若集群中节点几乎同时以不可控的方式down 了,此时再其中一个节点使用force_boot 命令重启节点。

  • 如果加入集群后,意外关闭等造成rabbitmq-server启动不成功,可以尝试一下步骤:/var/lib/rabbitmq/mnesia 目录下存在rabbit@localhost.pid、rabbit@localhost、rabbit@localhost-plugins-expand,删除这3项后,并且删除 /var/lib/rabbitmq/ 目录下 .erlang.cookie和erl_crash.dump 再使用systemctl start rabbitmq-server启动

1 消费慢

问题分析:
rabbitmq的内存 占用达到或超过水位线
因为 vm_memory_high_watermark 值设置的是0.4 也就是物理内存的40% ;服务器为16G * 40% = 6.4G
一般在产生的原因是长期的生产者发送速率大于消费者消费速率导致. 触发了RabbitMQ 的流控;
解决方案:

  1. 增加消费者端的消费能力,或者增加消费者(根本解决)
  2. 控制消息产生者端的发送速率(不太现实)
  3. 增加mq的内存(治标不治本)

2 消息丢失

这个是RabbitMQ最常见的问题,RabbitMQ丢失分三种情况,生产者消息丢失,RabbitMQ消息丢失,消费者消息丢失.

  1. 生产者消息丢失
    生产者在发送消息给RabbitMQ,在中途有可能因为网络问题导致消息丢失,我们可以选择RabbitMQ提供的事务,也可以用confirm模式,就是生产者确认
    事务:
    channel.tsSelect开启事务;
    channel.txRollback出现问题事务回滚
    channel.txCommit成功后提交事务
    confirm模式:
    生产者发送消息,每个消息分配一个id,如果RabbitMQ接收到消息返回ack,如果没有收到放回nack,这个时候生产者只需要重新发送这个消息即可,可以结合这个机制在内存里设置消息id的状态,多长时间没有f返回ack就是失败,重新发送消息.
    事务和confirm对比:
    事务是属于同步的,在你提交一个事务会阻塞在那里,其他的消息是不能继续发送的,这样很容易影响性能,而confirm是异步的就是发送完我可以继续发送另一条消息,在正常使用中推荐使用confirm模式
  2. RabbitMQ消息丢失
    RabbitMQ数据丢失,可以用持久化分为两个步骤:
    首选创建queue的时候将其设置为持久化,这样可以保证RabbitMQ持久化queue的元数据,而不会持久化queue的数据,第二步将消息的deliveryMode设置为2,就是将消息设置为持久化,此时消息就会持久化到磁盘上,即使RabbitMQ重启,也会从磁盘上恢复queue,恢复queue里的数据
    跟生产者的confirm配合,如过持久化到磁盘上再返回ack,如果还没持久化就RabbitMQ挂掉了,生产者没有收到ack,还是会重新发送消息.
  3. 消费者消息丢失
    消费者有可能因为刚接到消息还没有处理就重启了,但是RabbitMQ以为他处理了,这样就会导致消息丢失,合理的解决方案是关闭自动ack,可以通过api来进行调用,等自己的代码处理完成之后,可以ack,这样即使你没有消费RabbitMQ也知道你是没有去消费的,这个时候RabbitMQ可以把消息交给其他的consumer进行消费,避免消息丢失

3 消息重复消费

出现原因:消费者消息消息的时候,MQ没有收到消息的ack应答。
场景:

  1. 消费者消费消息后没有ack。
  2. 消费者在消费消息后,ack时网络异常。

解决步骤:

  1. 消费者消费后,记录通过缓存记录消息的消费标识,消息id如redis的setnx
  2. 如果消费成功且ack成功,则删除记录的消息标记。
  3. 如果ack失败,消息下次被消费消息时候,先去查询消息的消费标识,已经消费则直接ack,未消费则继续消费。

4 日常报错及解决

4.1 报错“error in config file “/etc/rabbitmq/rabbitmq.config” (none): no ending found”

rabbitmq config的配置相关的官方文档: http://www.rabbitmq.com/configure.html 官方给出的一个 示例配置: https://github.com/rabbitmq/rabbitmq-server/blob/v3.8.x/deps/rabbit/docs/rabbitmq.conf.example 拷贝以上实例文档 到 对应的rabbitmq的安装目录下的文件:/etc/rabbitmq , 取名配置文件名称为 rabbitmq.config,重启rabbit,那么当前文件 就为 当前rabbit所使用。

4.2 生产者发送消息报错

channel is already closed due to channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - home node ‘rabbit@xxx’ of durable queue ‘xxx_queue’ in vhost ‘/’ is down or inaccessible, class-id=50, method-id=10)
生产者连接不上vhost’/',看报错像是服务端有问题,经排查后发现,发现服务集群有一个节点满了,导致连接到这个节点的Connection都出问题了。
解决方案:添加节点,重启生产者服务。

4.3 浏览器打开IP地址,无法访问 RabbitMQ(白屏没有结果)

服务器对应的安全组15672端口没有开启(入规则),导致浏览器无法访问到服务器的任何内容。

4.4 Web管理界面不显示信息

在这里插入图片描述

  1. 原因:cluster搭建起来后若在web管理工具中rabbitmq_management的Overview的Nodes部分看到“Node statistics not available”的信息,说明在该节点上web管理插件还未启用。
  2. 解决办法:直接在显示提示信息的节点上运行
    rabbitmq-plugins enable rabbitmq_management

4.5 安装Erlang时openssl版本太低报错

Package erlang.x86_64 0:22.0.7-1.el7 will be installed --> Processing Dependency: libcrypto.so.10(OPENSSL_1.0.2)(64bit) for package: erlang-22.0.7-1.el7.x86_64 --> Finished Dependency Resolution Error: Package: erlang-22.0.7-1.el7.x86_64 (rabbitmq_erlang)
解决方法:升级openssl版本

  1. 安装Erlang后再安装rabbitmq提示erlang>=23.3 is needed by rabbitmq-server
    解决方法:需要安装erlang与rabbitmq对应的版本,官方版本对应表
    https://www.rabbitmq.com/which-erlang.html

4.6 安装时提示错误:error: Failed dependencies: socat is needed by rabbitmq-server

解决方法:需要安装socat; # yum install socat -y

4.7 rabbitmq启用web管理插件报错 Error: The following plugins could not be found:

解决方法:进入到rabbitmq安装目录下,再次执行rabbitmq-plugins enable rabbitmq_management即可

4.8 rabbitmq启动报错ERROR: epmd error for host xxx: timeout (timed out)

解决方法:编辑/etc/hosts文件,添加对应host的映射即可

4.9 rabbitmq节点加入集群报错

在这里插入图片描述

解决方法:

  1. 检查节点之间是否能ping通
  2. 查看节点服务4369端口是否打开
  3. 检查节点防火墙是否关闭或者允许4369端口访问
  4. rabbitmq节点加入集群报错如下图

在这里插入图片描述
解决方法:

  1. 检查主机名是否匹配及hosts文件是否映射
  2. 检查cookice内容是否一致

5 集群节点故障修复

故障现象日志如下:
2022-06-15 15:41:05.244 [error] &lt;0.274.0&gt; Timeout contacting cluster nodes: ['rabbit@rabbitmq-3','rabbit@rabbitmq-1'].
......................................................................................................................
2022-06-15 15:41:05.246 [error] &lt;0.274.0&gt; attempted to contact: ['rabbit@rabbitmq-3','rabbit@rabbitmq-1']
2022-06-15 15:41:05.246 [error] &lt;0.274.0&gt; 
2022-06-15 15:41:05.246 [error] &lt;0.274.0&gt; rabbit@rabbitmq-3:
2022-06-15 15:41:05.246 [error] &lt;0.274.0&gt;   * connected to epmd (port 4369) on rabbitmq-3
2022-06-15 15:41:05.246 [error] &lt;0.274.0&gt;   * node rabbit@rabbitmq-3 up, 'rabbit' application running
2022-06-15 15:41:05.246 [error] &lt;0.274.0&gt; rabbit@rabbitmq-1:
2022-06-15 15:41:05.246 [error] &lt;0.274.0&gt;   * connected to epmd (port 4369) on rabbitmq-1
2022-06-15 15:41:05.247 [error] &lt;0.274.0&gt;   * node rabbit@rabbitmq-1 up, 'rabbit' application running
2022-06-15 15:41:05.247 [error] &lt;0.274.0&gt; 
2022-06-15 15:41:05.247 [error] &lt;0.274.0&gt; Current node details:
2022-06-15 15:41:05.247 [error] &lt;0.274.0&gt;  * node name: 'rabbit@rabbitmq-2'
2022-06-15 15:41:05.247 [error] &lt;0.274.0&gt;  * effective user's home directory: /var/lib/rabbitmq
解决方法:从故障现象日志来分析,是网络无通信问题,通过手动进行reset和start_app提示错误无法加入集群节点。快速恢复剔除故障节点重新加入集群节点
1.移除故障节点,在操作rabbit@rabbitmq-1
rabbitmqctl forget_cluster_node rabbit@rabbitmq-2
2.在故障节点删除故障节点数据
cd /var/lib/rabbitmq/
mv mnesia mnesia.bak3.启动 rabbitmq-server
systemctl start rabbitmq-server
# 查看状态
rabbitmqctl status
4.将节点添加到集群
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbitmq-1
rabbitmqctl start_app
注:故障节点恢复及加入到集群中

相关文章:

RabbitMQ故障全解析:消费、消息及日常报错处理与集群修复

文章目录 前言&#xff1a;1 消费慢2 消息丢失3 消息重复消费4 日常报错及解决4.1 报错“error in config file “/etc/rabbitmq/rabbitmq.config” (none): no ending found”4.2 生产者发送消息报错4.3 浏览器打开IP地址&#xff0c;无法访问 RabbitMQ&#xff08;白屏没有结…...

无公网IP 实现外网访问本地 Docker 部署 Navidrome

Navidrome 是一款可以在 macOS、Linux、Windows以及 Docker 等平台上运行的跨平台开源音乐服务器应用&#xff0c;它支持传输常见的 MP3、FLAC、WAV等音频格式。允许用户通过 Web 界面或 API 进行音乐库的管理和访问。本文就介绍如何快速在 Linux 系统使用 Docker 进行本地部署…...

pnpm add 和 pnpm install 的区别?

文章目录 1. pnpm add2. pnpm install3. 总结应用场景示例 在使用 pnpm 管理项目依赖时&#xff0c; pnpm add 和 pnpm install 是两个常用的命令&#xff0c;但它们的功能和使用场景有所不同。以下是详细的解释&#xff1a; 1. pnpm add 功能&#xff1a;用于向项目的 pack…...

Linux:文件描述符fd、系统调用open

目录 一、文件基础认识 二、C语言操作文件的接口 1.> 和 >> 2.理解“当前路径” 三、相关系统调用 1.open 2.文件描述符 3.一切皆文件 4.再次理解重定向 一、文件基础认识 文件 内容 属性。换句话说&#xff0c;如果在电脑上新建了一个空白文档&#xff0…...

CPU负载与CPU使用率之区别

在日常的性能测试与系统监控中&#xff0c;CPU负载和CPU使用率是两个常见的指标&#xff0c;它们经常被提及&#xff0c;但也经常被混淆。本文将为你深入解析两者的区别&#xff0c;以及它们各自的意义和应用场景&#xff0c;让你更清楚地掌握这些关键性能指标。 存储、内存和 …...

C++实现设计模式---外观模式 (Facade)

外观模式 (Facade) 外观模式 是一种结构型设计模式&#xff0c;为子系统中的一组接口提供一个一致的界面。外观模式定义了一个更高层次的接口&#xff0c;使得子系统更容易使用。 意图 简化复杂子系统的接口。为客户端提供一个统一的入口&#xff0c;屏蔽子系统的内部细节。 …...

仿射密码实验——Python实现(完整解析版)

文章目录 前言实验内容实验操作步骤1.编写主程序2.编写加密模块3.编写解密模块4.编写文件加解密模块 实验结果实验心得实验源码scirpt.pyusefile.py 前言 实验目的 1&#xff09;初步了解古典密码 2&#xff09;掌握仿射密码的实现 实验方法 根据下图仿射密码&#xff08;变换…...

【Qt 常用控件】按钮类(QPushButton、QRadioButton、QCheckBox)

按钮控件继承自抽象类QAbstractButton。 抽象类不允许实例化对象&#xff0c;内部定义纯虚函数。只能通过子类继承&#xff0c;重写纯虚函数的方式使用。 1. QPushButton 1.1 QAbstractButton中和QPushButton相关的属性 text按钮显示文本icon按钮图标iconSize按钮图标尺寸s…...

Amazon Relational Database Service (RDS)

Amazon Relational Database Service (RDS) 是 AWS 提供的一项完全托管的关系数据库服务&#xff0c;旨在简化部署、管理和扩展关系型数据库应用程序。通过 RDS&#xff0c;用户可以使用多种流行的关系数据库引擎&#xff0c;如 MySQL、PostgreSQL、MariaDB、Oracle 和 Microso…...

linux分配磁盘空间命令

使用命令lsblk查询linux磁盘空间时&#xff0c;发现空间并没有被分配完 如图&#xff0c;600G&#xff0c;但实际分配了一共199G&#xff0c;剩余500G&#xff0c;我们需要通过命令进行剩余存储的分配。 思路&#xff1a;创建新的分区->更新内核分区表->初始化新分区作…...

21_Spring Boot缓存注解介绍

前面我们通过使用@EnableCaching、@Cacheable注解实现了Spring Boot默认的基于注解的缓存管理,除此之外,还有更多的缓存注解以及注解属性可以配置优化缓存管理。下面我们针对Spring Boot中的缓存注解及相关属性进行详细讲解。 1.@EnableCaching注解 @EnableCaching是由Spri…...

【linux】grep、awk、sed实战练习(1)-template

一、grep常见用法 1.1.从文件中查找关键字符串 # 比如&#xff1a;查找/etc/nginx/nginx.conf文件包含"listen"的行 [rootecs_server test]# grep "listen" -n /etc/nginx/nginx.conf 52: listen 8088; 87: listen 8096; # 比如&#xff1a;查…...

UDP报文格式

UDP是传输层的一个重要协议&#xff0c;他的特性有面向数据报、无连接、不可靠传输、全双工。 下面是UDP报文格式&#xff1a; 1&#xff0c;报头 UDP的报头长度位8个字节&#xff0c;包含源端口、目的端口、长度和校验和&#xff0c;其中每个属性均为两个字节。报头格式为二…...

联想Android面试题及参考答案

请介绍一下 Android 的架构,并谈谈对 Linux 的了解。 Android 架构主要分为四层,从下往上依次是 Linux 内核层、系统运行库层、应用框架层和应用层。 Linux 内核层是 Android 系统的基础。它提供了底层的硬件驱动程序,包括显示驱动、摄像头驱动、音频驱动等多种硬件设备的驱…...

Android CustomTextField

在 Compose 中开发用户界面时&#xff0c;需要处理输入框和键盘的交互&#xff0c;例如在键盘弹出时调整布局位置&#xff0c;避免遮挡重要内容。本篇博客将通过一个完整的示例展示如何实现这一功能。 功能概述 本例实现了一个简单的输入框。当输入框获得焦点或输入文字时&…...

网络设备安全保证计划 (NESAS) - 供应商视角 笔记

NESAS 对供应商的意义 提升产品安全性: NESAS 为供应商提供了一套全球认可的安全评估标准&#xff0c;帮助其识别和解决产品中的安全漏洞。通过 NESAS 评估&#xff0c;供应商可以证明其产品符合行业最高安全标准&#xff0c;增强客户信任。增强市场竞争力: 通过 NESAS 认证的…...

强化学习-蒙特卡洛方法

强化学习-数学理论 强化学习-基本概念强化学习-贝尔曼公式强化学习-贝尔曼最优公式强化学习-值迭代与策略迭代强化学习-蒙特卡洛方法 文章目录 强化学习-数学理论一、蒙特卡洛方法理论(Monte Carlo, MC)二、MC Basic2.1 算法拆解2.2 MC Basic算法 三、MC Exploring Starts3.1 …...

IIO(Industrial I/O)驱动介绍

文章目录 IIO&#xff08;Industrial I/O&#xff09;驱动是Linux内核中用于工业I/O设备的子系统&#xff0c;主要用于处理传感器数据采集和转换。以下是其关键点&#xff1a; 功能 数据采集&#xff1a;从传感器读取数据。数据处理&#xff1a;对原始数据进行滤波、校准等操作…...

画流程图 代码生成流程图 流程图自动运行

一&#xff1a;在线平台 典藏 drawio&#xff1a;完全免费&#xff1b;可拆入代码生成&#xff1b;使用方法 Kimi drawio生成流程图&#xff1a;Kimi里面生成Mermaid格式——>生成代码并复制——>进入drawio里面点插入"号"——>高级——>Mermaid——…...

Maven 配置本地仓库

步骤 1&#xff1a;修改 Maven 的 settings.xml 文件 找到你的 Maven 配置文件 settings.xml。 Windows: C:\Users\<你的用户名>\.m2\settings.xmlLinux/macOS: ~/.m2/settings.xml 打开 settings.xml 文件&#xff0c;找到 <localRepository> 标签。如果没有该标…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...