问题描述
三节点集群(版本3.9.7),有一台拔网线恢复后,绑定的q出现问题,有个queue消息投不进去,管理界面查看队列状态,发现存在一个rk对应三个队列的多重绑定用法,三个队列只有一个投不进去。
注:topic类型的ex,队列属性是autodelete,但是公司内部使用的客户端库实现了自动重连,也就是说断网后会重新创建出队列
认为是脑裂后rmq服务器数据库不一致引起的故障,通过解绑或重启临时解决,但毕竟不是长久之策,而且该问题已经出现了三四次
排查流程(涉及公司机密不放相关图片)
1.往publish方法里加打印,发现route返回结果不包含问题队列
2.通过mnesia及ets函数直接查找route,发现三个节点都能查到,并未发现明显的不一致
3.分析rmq服务器逻辑,topic类型的route和direct、fanout不同,它需要先进行正则匹配,并最终通过mnesia:select进行查找
而其他类型的ex则是直接通过ets:select(2.5版本之前也是mnesia:select)
4.为topic的route补充像其他类型ex一样直接查找的结果,取并集,重新编译rmq服务器
5.替换故障集群中一个节点进行测试,发现补充的方式查找成功,此时通过被替换的节点投消息也能投进
解决方案
按上述方法补充route方式即可