背景:
RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件。本文研究在日常测试中发现的RabbitMQ的一个问题——网络分区。叙述从发现问题,分析问题到解决问题的每一步思考,最后实现一套RabbitMQ检测恢复服务,保证RabbitMQ服务的可靠性。
发现问题——网络测试结果异常:
1、 场景复现
基本环境信息:
RabbitMQ版本 |
rabbitmq-server-3.6.6 |
erlang版本 |
erlang-R16B-03.17.el7 |
RabbitMQ集群节点数量 |
3 |
操作系统 |
CentOS 7.2 |
测试步骤以及现象:
l 在集群某两个个RabbitMQ节点执行管理网网卡闪断操作,30次,持续大概一分半钟;
l 闪断结束后,查看集群健康状态,通过RabbitMQ的web管理界面看到警告;
l 通过rabbitmqctl cluster_status命令查到的确发生网络分区,并且无法自动恢复,集群服务不可用;
2、 初步结论
环境网络异常会导致某一个或者某几个RabbitMQ节点不能与另外节点取得联系,那么Mnesia会认为另外一部分节点服务异常,同理另外一部分节点也会如此认为,在此情况下,可能出现网络分区的问题。
分析问题——网络分区从中作梗:
1、 网络分区
官网对此的描述是RabbitMQ clusters do not tolerate network partitions well,即RabbitMQ集群无法很好的应对网络分区情况。RabbitMQ会将信息保存在Erlang的分布式数据库Mnesia中。而和网络分区相关的许多细节问题都和Mnesia的行为相关。Mnesia判定某个node失效的根据是,如果其他node无法连接该node的时间达到net_ticktime定义的时间以上。当这两个node恢复到能联系上的状态时,都会认为对端node