RabbitMQ脑裂OOM

不打扰是莪最后的温柔 提交于 2020-03-24 11:22:30

一 网络原因导致MQ脑裂:
问题重现:
Network partition detected

Mnesia reports that this RabbitMQ cluster has experienced a network partition. There is a risk of losing data. Please read RabbitMQ documentation about network partitions and the possible solutions.

当出现网络分区时,不同分区里的节点会认为不属于自身所在分区的节点都已经挂了,对 queue、exchange、binding 的操作仅对当前分区有效。在 RabbitMQ 的默认配置下,即使网络恢复了也不会自动处理网络分区带来的问题从而恢复集群。RabbitMQ(3.1+)会自动探测网络分区,并且提供了配置来解决这个问题。

[
{rabbit,
[{tcp_listeners,[5672]},
{cluster_partition_handling, ignore}]
}
].
RabbitMQ 提供了三种配置:
1、ignore:默认配置,发生网络分区时不作处理,当认为网络是可靠时选用该配置
2、autoheal:各分区协商后重启客户端连接最少的分区节点,恢复集群(CAP 中保证 AP,有状态丢失)
3、pause_minority:分区发生后判断自己所在分区内节点是否超过集群总节点数一半,如果没有超过则暂停这些节点(保证 CP,总节点数为奇数个)

解决:
在出现问题的节点上执行:
sbin/rabbitmqctl stop_app
sbin/rabbitmqctl start_app

注意:rabbitmq集群不能采用kill -9 杀死进程,否则生产者和消费者不能及时识别mq的断连,会影响生产者和消费者正常的业务处理。

二 MQ内存节点OOM
集群的节点都是4G内存,使用默认配置文件,可使用的内存是1.5G, 队列积压导致内存溢出
mq内存节点OOM原因:

1.消息堆积
2.消费服务节点OOM宕机

解决:
1消费端可以正常消费
2 保证mq集群节点正常
3 mq配置调优 
more rabbitmq.config

[
{rabbit, [
{tcp_listeners,[{"0.0.0.0",5672}]},
{loopback_users, []},
{log_levels, [{connection, error}, {channel, error}]},
{vm_memory_high_watermark_paging_ratio, 0.75},
{vm_memory_high_watermark, 0.6}
]}
].

命令行设置最高使用内存占比:
rabbitmqctl set_vm_memory_high_watermark 0.6
参数配置:
vm_memory_high_watermark : 设置内存低水位线,若低于该水位线,则开启流控机制,默认值是0.4,即内存总量的40%
vm_memory_high_watermark_paging_ratio : 设置内存低水位线消息开始持久化到磁盘,默认50%

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!