RabbitMQ 与脑裂问题
2016-07-11 09:22:04 最后更新: 2016-07-11 09:22:04 访问数量:5433
2016-07-11 09:22:04 最后更新: 2016-07-11 09:22:04 访问数量:5433
上面几篇日志中,我们一步步地搭建、配置了 rabbitmq,经过在此之前的应用介绍,我们已经可以搭建一个相对复杂的多节点分布式生产-消费的分布式应用模型了
本篇日志中,主要介绍一下 rabbitmq 的网络问题
RabbitMQ 集群的网络分区容错性并不高,在网络质量较差的环境中会比较容易出现问题,其中最明显的就是脑裂问题
所谓的脑裂问题,就是在多机热备的高可用 HA 系统中,当两个节点心跳突然断开,就分裂为了两个独立的个体,由于互相失去联系,都认为对方出现了故障,因此都会去争抢对方的资源,争抢启动,由此就会发生严重的后果
举个形象的例子,A 和 B 作为一个双机热备集群的两个节点,各自持有集群的一部分数据 -- a 和 b,这时,两机器之间突然无法通信,A 认为 B 已经挂掉,B 认为 A 已经宕机,于是会出现:
总之,无论是哪一种,都不是我们希望见到的
因此,在 RabbitMQ 官方文档中,明确建议了,不要在广域网环境下使用,否则,应该使用 federation 或者 shovel 插件
当然,我们不能要求集群的可用性或网络的健康达到 100%,即使在局域网中,发生故障的可能性也是存在的
RabbitMQ 3.1 以上版本提供了配置来解决这个问题:
RabbitMQ 提供了三种配置:
使用 pause_minority 可以有效解决脑裂问题,但是会让集群在出现问题后无法使用
RabbitMQ Clustering and Network Partitions -- http://www.rabbitmq.com/partitions.html
高可用方案之脑裂问题探讨(原创) -- http://czmmiao.iteye.com/blog/1180851
RabbitMQ 网络分区问题 -- http://88250.b3log.org/rabbitmq-network-partition
欢迎关注微信公众号,以技术为主,涉及历史、人文等多领域的学习与感悟,每周三到七篇推文,只有全部原创,只有干货没有鸡汤