RabbitMQ镜像模式双节点部署时故障转移过程中队列中消息的状态

场景

现有节点Node1和Node2,建立Exchange:yu.exchange,创建队列yu1.queue镜像队列master位于Node1,yu2.queue镜像队列位于Node2,使用topic模式绑定到Exchange;

当队列发送时设置DeliveryMode=1 No-Persistent 不进行度列持久化时

过程:

1.客户端向Exchange发送消息10条,停掉Node1上的RabbitMQ实例,队列yu1.queue将master切换到Node2,队列正常继续接受,不影响后续的消息接收。(当前消息条数10)

2.客户端继续发送消息5条,然后启动Node1实例,Node1会以从节点的身份恢复到集群中(当前消息条数15条),Node1会以从节点的身份恢复到集群中,此时队列上显示消息不一致“+0+1”的警告,即发生主从消息不一致

RabbitMQ镜像模式双节点部署时故障转移过程中队列中消息的状态

3.客户端继续发送消息5条(此时队列内消息为20条),此时队列上依然显示消息不一致“+0+1”的警告

4.暂停Node2实例,此时队列会全部切换master到Node2,队列正常运行,但此刻队列消息条数为5,由于只剩一个节点,所以不再存在消息不一致的“+0+1”警告

5.客户端继续发送5条,启动Node1实例,队列内消息为10条,继续队列上显示消息不一致“+0+1”的警告,即发生主从消息不一致(队列条数10)

小结:对于未设置持久化的消息队列,如果无订阅客户端进行消息消费的话,当发生主从切换时,master实例在关闭到重启为slaver的过程中,如果队列持续接收消息会发生不一致的警告。同时如果该场景重复发生,如果不设置参数“ha-sync-mode: automatic”的话(默认为ha-sync-mode: manual),队列内消息不会进行同步,消息内容以最近master实例内的消息为主。(https://www.rabbitmq.com/admin-guide.html

当队列发送时设置DeliveryMode=2 Persistent 进行度列持久化时

1.客户端向Exchange发送消息10条,停掉Node1上的RabbitMQ实例,队列yu1.queue将master切换到Node2,队列正常继续接受,不影响后续的消息接收。(当前消息条数10)

2.客户端继续发送消息5条,然后启动Node1实例,Node1会以从节点的身份恢复到集群中(当前消息条数15条),Node1会以从节点的身份恢复到集群中,此时队列上显示消息不一致“+0+1”的警告,即发生主从消息不一致

3.客户端继续发送消息5条(此时队列内消息为20条),此时队列上依然显示消息不一致“+0+1”的警告

4.暂停Node2实例,此时队列会全部切换master到Node2,队列正常运行,但此刻队列消息条数为0!!!!,由于只剩一个节点,所以不再存在消息不一致的“+0+1”警告

5.客户端继续发送5条,启动Node1实例,队列内消息为5条,继续队列上显示消息不一致“+0+1”的警告,即发生主从消息不一致(队列条数5)

6.再次关闭Node2实例,master又会切回到Node1,但此处队列内消息再次归0!!!!

当镜像队列部署到多于两个节点时需要注意ha-mode的参数设置 镜像队列数量越少处理速度越快,多一些当然数据的一致性会更高,但吞吐量会下降

上一篇:JQuery实现1024小游戏


下一篇:Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题