一 网络原因导致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%