各种故障对RocketMQ消息的影响

        我们期望消息队列集群一直可靠稳定地运行,但有时候故障是难免的,本节我们列出可能的故障情况,看看如何处理:

1)Broker正常关闭,启动;

2)Broker异常Crash,然后启动;

3)OS Crash,重启;

4)机器断电,但能马上恢复供电;

5)磁盘损坏;

6)CPU、主板、内存等关键设备损坏。

假设现有的RocketMQ集群,每个Topic都配有多Master角色的Broker供写入,并且每个Master都至少有一个Slave机器(用两台物理机就可以实现上述配置),我们来看看在上述情况下消息的可靠性情况。

第1种情况属于可控的软件问题,内存中的数据不会丢失。如果重启过程中有持续运行的Consumer,Master机器出故障后,Consumer会自动重连到对应的Slave机器,不会有消息丢失和偏差。当Master角色的机器重启以后,Consumer又会重新连接到Master机器(注意在启动Master机器的时候,如果Consumer正在从Slave消费消息,不要停止Consumer。假如此时先停止Consumer后再启动Master机器,然后再启动Consumer,这个时候Consumer就会去读Master机器上已经滞后的offset值,造成消息大量重复)。

如果第1种情况出现时有持续运行的Producer,一台Master出故障后,Producer只能向Topic下其他的Master机器发送消息,如果Producer采用同步发送方式,不会有消息丢失。

第2、3、4种情况属于软件故障,内存的数据可能丢失,所以刷盘策略不同,造成的影响也不同,如果Master、Slave都配置成SYNC_FLUSH,可以达到和第1种情况相同的效果。

第5、6种情况属于硬件故障,发生第5、6种情况的故障,原有机器的磁盘数据可能会丢失。如果Master和Slave机器间配置成同步复制方式,某一台机器发生5或6的故障,也可以达到消息不丢失的效果。如果Master和Slave机器间是异步复制,两次Sync间的消息会丢失。

总的来说,当设置成:

1)多Master,每个Master带有Slave;

2)主从之间设置成SYNC_MASTER;

3)Producer用同步方式写;

4)刷盘策略设置成SYNC_FLUSH。

就可以消除单点依赖,即使某台机器出现极端故障也不会丢消息。

你可能感兴趣的:(RocketMQ,rocketmq,java-rocketmq,java)