Rabbitmq 集群异常故障处理流程
1. slave 挂掉
当 slave 挂掉之后,除了与 slave 相连的客户端连接全部断开,没有其他影响。
2. master 挂掉
当 master 挂掉之后,会有以下连锁反应:
(1)与 master 连接的客户端连接全部断开。
(2)选举最老的 slave 作为新的 master。如果此时所有 slave 处于未同步状态,则未同步的消息会丢失。
(3)出于消息可靠性的考虑,新的 master 会重新入队所有 unack 的消息,此时客户端可能会有重复消息。
(4)如果客户端连接着 slave,并且 Basic.Consume 消费时指定了 x-cancel-on-ha-failover 参数,那么断开之时客户端会收到一个 Consumer Cancellation Notification 的通知,消费者客户端中会回调 Consumer 接口的 handleCancel 方法。如果未指定 x-cancel-on-ha-failover 参数,那么消费者将无法感知 master 宕机。
x-cancel-on-ha-failover 参数的使用示例如下:
3. 注意事项
镜像队列中最后一个停止的节点会是 master,启动顺序必须是 master 先启动。如果 slave先 启动,它会有 30 秒的等待时间,等待 master 的启动,然后加入到集群中。如果 30 秒内 master 没有启动,slave 会自动停止。当所有节点因故(断电等)同时离线时,每个节点都认为自己不是最后一个停止的节点,要恢复镜像队列,可以尝试在 30 秒内启动所有节点。
Rabbitmq 网络分区判定方式
1、日志方式
rabbitmq不仅会将队列、交换器及绑定等信息存储在 Mnesia 数据库中,而且许多围绕网络分区的一些细节也都和这个Mnesia的行为相关。
如果一个节点不能在下时间连上另一个节点,那么 Mnesia 通常认为这个节点已经挂了,就算之后两个节点又重新恢复了内部通信,但是这两个节点都会认为对方已经挂了,Mnesia 此时认定了发生网络分区的情况。这些会被记录到RabbitMO 的服务日志之中。
2、命令查看
通过命令rabbitmqctl cluster_status 可以看到集群相关信息。
当没有发生网络分区时,在Network Partitions这一块显示无。
3、监控页面提示
4、API查看
- 第三种,通过 HTTP API 的方式调取节点信息来检测是否发生网络分区。
- 其中会有 partitions 的相关项,如果在其中发现 partitions 项中有内容则为发生了网络分区。举例,将 node2 分离出 nodel和 node3的主分区之后,调用/api/nodes 这个接口的部分信息
#在node1节点上查看,partitions一栏显示有node2节点,说明node1和node2节点发生了网络分区。[root@node1 ~]# curl -XGET http://192.168.130.129:15672/api/nodes?pretty -i -u qingjun:citms -H "content-type:application/json"
- 本文固定链接: http://www.jiagou.cc/1043/
- 转载请注明: 摘星怪 于 架构迷 发表