关于RabbitMQ同步失败
问题背景:
项目中使用到了RabbitMQ作为消息队列,采用的方式是两台机器做镜像,配置数据同步策略到两台机器。双机都采用了磁盘节点。
问题:
在机房的两次交换机问题中,内网通讯断开链接了一段时间,RabbitMQ自动shutdown,不能再接收和获取消息,通过List queues 发现两边数据不一致,打开RabbitMQ的日志发现在heart beat一段时间后,RabbitMQ自动shutdown,网络恢复后不会重启,手动重启后生效数据恢复一致。
如果是手动stop掉镜像中的其中一台机器,RabbitMQ不会进入这样的模式,而是仍然对外提供服务,请问一下为什么会这样?怎样避免网路出问题的时候RabbitMQ不会自动shutdown或者有什么机制保证网络恢复后自动重启?
如果遇到过同样问题的同学留下联系方式一起交流。
firedew
11 years, 4 months ago
Answers
问题在于网络异常断开,状态无法同步(未知状态)。手动stop不会出现问题是因为关掉的时候,状态是已知的,因此能够恢复。
RabbitMQ的文档就有说不稳定的网络Cluster不稳定。
所以我觉得主要是引入一个监控->恢复的反馈机制(Roll your own):
- 监控主要是通过检查cluster状态,找到已被移除的node
- 恢复是在被移除的节点上,重置并重新加入到cluster中
- 至于恢复是自动还是手动看具体需求,运维也需要得到相应的事件
EDIT: 你也可以看看这篇文档(For RabbitMQ 3.1+):
https://www.rabbitmq.com/partitions.html
有autoheal和pause_minority两种模式
道长用飘柔
answered 11 years, 4 months ago