RocketMQ高可用機制----同步刷盤、異步刷盤和同步複製、異步複製
同步刷盤、異步刷盤
RocketMQ的消息是存儲到磁盤上的,這樣既能保證斷電後恢復,又可以讓存儲的消息量超出內存的限制。
RocketMQ爲了提高性能,會儘可能地保證磁盤的順序寫。消息在通過Producer寫入RocketMQ的時候,有兩種
寫磁盤方式:
1)異步刷盤方式:在返回寫成功狀態時,消息可能只是被寫入了內存的PAGECACHE,寫操作的返回快,吞吐量大;當內存裏的消息量積累到一定程度時,統一觸發寫磁盤操作,快速寫入
優點:性能高
缺點:Master宕機,磁盤損壞的情況下,會丟失少量的消息, 導致MQ的消息狀態和生產者/消費者的消息狀態不一致
2)同步刷盤方式:在返回應用寫成功狀態前,消息已經被寫入磁盤。具體流程是,消息寫入內存的PAGECACHE後,立刻通知刷盤線程刷盤,然後等待刷盤完成,刷盤線程執行完成後喚醒等待的線程,給應用返回消息寫成功的狀態。
優點:可以保持MQ的消息狀態和生產者/消費者的消息狀態一致
缺點:性能比異步的低
同步刷盤還是異步刷盤,是通過Broker配置文件裏的flushDiskType參數設置的,這個參數被設置成SYNC_FLUSH, ASYNC_FLUSH中的一個
同步複製、異步複製
如果一個broker組有Master和Slave,消息需要從Master複製到Slave上,有同步和異步兩種複製方式。
1)同步複製方式:等Master和Slave均寫成功後才反饋給客戶端寫成功狀態
優點:如果Master出故障,Slave上有全部的備份數據,容易恢復,消費者仍可以從Slave消費, 消息不丟失
缺點:增大數據寫入延遲,降低系統吞吐量,性能比異步複製模式略低,大約低10%左右,發送單個Master的響應時間會略高
2)異步複製方式:只要Master寫成功即可反饋給客戶端寫成功狀態
優點:系統擁有較低的延遲和較高的吞吐量. Master宕機之後,消費者仍可以從Slave消費,此過程對應用透明,不需要人工干預,性能同多個Master模式幾乎一樣
缺點:如果Master出了故障,有些數據因爲沒有被寫入Slave,而丟失少量消息。
同步複製和異步複製是通過Broker配置文件裏的brokerRole參數進行設置的,這個參數可以被設置成ASYNC_MASTER、SYNC_MASTER、SLAVE三個值中的一個。
總結
消息零丟失是一把雙刃劍,要想用好,還是要視具體的業務場景,在性能和消息零丟失上做平衡
實際應用中,推薦把Master和Slave設置成ASYNC_FLUSH的異步刷盤方式,主從之間配置成SYNC_MASTER的同步複製方式,這樣即使有一臺機器出故障,仍然可以保證數據不丟。
rocketmq 同步刷盤、異步刷盤和同步複製、異步複製 - 持續在更新 - 博客園
https://www.cnblogs.com/toUpdating/p/10021372.html