rabbitmq 故障记录
1 集群某一节点内存不足导致消费异常
1 mq管理页面显示一个节点内存报警,mq官方文档说明,内存超出阈值会导致所有连接被阻塞

update memory details 显示其other 为3.8G

rabbitmqctl status 查看内存

2 零时解决方法
在broker运行过程中修改:rabbitmqctl set_vm_memory_high_watermark 0.6
查询修改是否成功:


已恢复可以使用,但是Erlang processes 分布异常需进一步跟进处理,erlang内存分析方法: https://www.cnblogs.com/yunqingtuo/p/14445682.html
2 内存高的问题
1 手动回收erlang GC 以及释放420万条消息后内存仍然没有释放,最终重启此节点,解决释放内存的问题 (重启前先将此节点从LB中摘掉,然后安全操作)
rabbitmqctl stop_app

rabbitmqctl start_app

other部分内存释放,

重启后过一段时间开发同学报rabbitmq 周期性连接失败问题,
重启此ram节点导致新的问题出现,最好将此节点从集群中剔除,
# 集群剔除节点 # 在要剔除的节点上执行 rabbitmqctl stop # 在其余俩节点分别执行 rabbitmqctl forget_cluster_node rabbit@node1 # 将节点加入集群 # 在要加入的节点上执行 rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster rabbit@rabbitpro01-fn --ram rabbitmqctl start_app
RabbitMQ 将每个队列设计为一个 Erlang 进程,Erlang 进程GC也是采用分代策略,当新老生代一起参与Major GC时,Erlang虚拟机会新开内存,根据root set将存活的对象拷贝至新空间,这个过程会造成新老内存空间同时存在,极端情况下,一个队列可能短期内需要两倍的内存占用量,所以内存流控阀值设置为0.4相对是一个比较安全的值,设置太高,有可能系统内存被全部占用导致系统进程 kill RabbitMQ进程,设置过低导致内存使用率不高。
因为RabbitMQ服务器在启动时会计算系统内存总大小。然后会根据vm_memory_high_watermark参数指定的百分比,进行控制.可通过命令 rabbitmqctl set_vm_memory_high_watermark fraction 动态设置。默认下,vm_memory_high_watermark的值为0.4,当RabbitMQ使用的内存超过40%时,系统会阻塞所有连接。一旦警报解除(消息被消费者取走,或者消息被写到硬盘中),系统重新恢复工作。32位系统的单进程内存使用最大为2G,即使系统有10G,那么内存警报线为2G*40%.
2 rabbitmq 磁盘空间打满由于某一消息队列消息积压
由于某一消息队列 消息积压(1.5亿条消息)导致 磁盘空间使用率100%(三个节点都打满)
通过web界面qeues->purge删除消息导致界面卡死,最终使用命令行删除 :rabbitmqctl purge_queue qeueuname
删除过程比较耗时,需等待一段时间,最终删除成功,三个节点的磁盘使用率降下来

浙公网安备 33010602011771号