首页 > 首页 > 应用服务 > 消息队列 > RabbitMQ > [ RabbitMQ ] 重要知识点备忘录
2024
10-10

[ RabbitMQ ] 重要知识点备忘录

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 参数的使用示例如下:

[ RabbitMQ ] 重要知识点备忘录 - 第1张  | 架构迷

3. 注意事项

镜像队列中最后一个停止的节点会是 master,启动顺序必须是 master 先启动。如果 slave先 启动,它会有 30 秒的等待时间,等待 master 的启动,然后加入到集群中。如果 30 秒内 master 没有启动,slave 会自动停止。当所有节点因故(断电等)同时离线时,每个节点都认为自己不是最后一个停止的节点,要恢复镜像队列,可以尝试在 30 秒内启动所有节点。

Rabbitmq 网络分区判定方式

1、日志方式

rabbitmq不仅会将队列、交换器及绑定等信息存储在 Mnesia 数据库中,而且许多围绕网络分区的一些细节也都和这个Mnesia的行为相关。

如果一个节点不能在下时间连上另一个节点,那么 Mnesia 通常认为这个节点已经挂了,就算之后两个节点又重新恢复了内部通信,但是这两个节点都会认为对方已经挂了,Mnesia 此时认定了发生网络分区的情况。这些会被记录到RabbitMO 的服务日志之中。

[ RabbitMQ ] 重要知识点备忘录 - 第2张  | 架构迷

2、命令查看

通过命令rabbitmqctl cluster_status 可以看到集群相关信息。

当没有发生网络分区时,在Network Partitions这一块显示无。

[ RabbitMQ ] 重要知识点备忘录 - 第3张  | 架构迷

3、监控页面提示

[ RabbitMQ ] 重要知识点备忘录 - 第4张  | 架构迷

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"

[ RabbitMQ ] 重要知识点备忘录 - 第5张  | 架构迷
最后编辑:
作者:摘星怪
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。