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

devtools/2025/1/17 22:41:04/

文章目录

  • 前言:
  • 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都出问题了。
解决方案:添加节点,重启生产者服务。

RabbitMQ_57">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
注:故障节点恢复及加入到集群中

http://www.ppmy.cn/devtools/151378.html

相关文章

软件测试入门—测试流程之需求分析

在软件测试的整个流程中&#xff0c;需求分析是至关重要的第一步&#xff0c;它为后续的测试工作奠定了坚实的基础。良好的需求分析能够确保测试工作的针对性和有效性&#xff0c;帮助我们发现更多的软件缺陷&#xff0c;提高软件的质量。下面将详细阐述软件测试流程中的需求分…

《零基础Go语言算法实战》【题目 2-28】读写不安全问题

《零基础Go语言算法实战》 【题目 2-28】读写不安全问题 请说出下面的代码存在什么问题。 package main import "sync" type UserAges struct { ages map[string]int sync.Mutex } func (ua *UserAges) Add(name string, age int) { ua.Lock() defer ua.Unloc…

1.15寒假作业

web&#xff1a;nss靶场ez_ez_php 打开环境&#xff0c;理解代码 使用个体传参的方法&#xff0c;首先代码会检查file参数的前三个字符是不是php&#xff0c;如果是就输出nice&#xff0c;然后用include函数包含file&#xff0c;绕过不是则输出hacker&#xff0c;如果没有file…

区块链技术在商贸物流中的变革性作用:透明、安全与高效

区块链技术在商贸物流中的变革性作用&#xff1a;透明、安全与高效 在当今全球化的商业环境中&#xff0c;商贸物流作为商品流通的关键环节&#xff0c;其高效运作对于企业的竞争力和消费者的满意度至关重要。然而&#xff0c;传统商贸物流存在着诸多痛点&#xff0c;如信息不…

leetcode Heap/Queue

3066. 超过阈值的最少操作数 II 输入&#xff1a;nums [2,11,10,1,3], k 10 输出&#xff1a;2 解释&#xff1a;第一次操作中&#xff0c;我们删除元素 1 和 2 &#xff0c;然后添加 1 * 2 2 到 nums 中&#xff0c;nums 变为 [4, 11, 10, 3] 。 第二次操作中&#xff0c;…

【Qt】03-页面切换

前言一、按键实现界面切换1.1 创建新的类文件1.1.1 创建1.1.2 细节选择 1.2 代码以及需要注意的点mywidget.cppsecondwidget.cppmywidget.hsecondwidget.h 1.3 结果展示 二、signal关键字2.1 代码以及解释mywidget.cppsecondwidget.cppmywidget.hsecondwidget.h解释 2.2 现象 三…

软考信安20~数据库系统安全

1、数据库安全概况 1.1、数据库安全概念 数据库是网络信息系统的基础性软件,承载着各种各样的数据,成为应用系统的支撑平台。 国外主流的数据库系统有MSSQL 、MySQL 、Oracle 、DB2 等,国产数据库系统主要有人大金仓、达梦等。 1.2、数据库安全威胁 授权的误用(Misuses…

C# OpenCV机器视觉:二维码识别

在一个风平浪静却又暗藏玄机的午后&#xff0c;阿辉正坐在他那堆满各种电子元件和代码书籍的办公桌前&#xff0c;对着电脑屏幕上那一串串神秘的代码发呆。突然&#xff0c;手机铃声如同一道尖锐的闪电划破了平静的空气&#xff0c;吓得他差点把手里的咖啡杯打翻。原来是公司的…