rocketmq 同步刷盤、異步刷盤和同步復制、異步復制


概述

RocketMQ和其他存儲系統類似,如Redis等,提供了同步和異步兩種刷盤方式,同步刷盤方式能夠保證數據被寫入硬盤,做到真正的持久化,但是也會讓系統的寫入速度受制於磁盤的IO速度;而異步刷盤方式在將數據寫入緩沖之后就返回,提供了系統的IO速度,卻存在系統發生故障時未來得及寫入硬盤的數據丟失的風險。

同步刷盤、異步刷盤

  RocketMQ的消息是存儲到磁盤上的,這樣既能保證斷電后恢復,又可以讓存儲的消息量超出內存的限制。

RocketMQ為了提高性能,會盡可能地保證磁盤的順序寫。消息在通過Producer寫入RocketMQ的時候,有兩種

寫磁盤方式:

  1)異步刷盤方式:在返回寫成功狀態時,消息可能只是被寫入了內存的PAGECACHE,寫操作的返回快,

吞吐量大;當內存里的消息量積累到一定程度時,統一觸發寫磁盤操作,快速寫入

  2)同步刷盤方式:在返回寫成功狀態時,消息已經被寫入磁盤。具體流程是,消息寫入內存的PAGECACHE后,立刻

通知刷盤線程刷盤,然后等待刷盤完成,刷盤線程執行完成后喚醒等待的線程,返回消息寫成功的狀態。

 

 

同步刷盤還是異步刷盤,是通過Broker配置文件里的flushDiskType參數設置的,這個參數被設置成SYNC_FLUSH、ASYNC_FLUSH

中的一個

 

同步復制、異步復制

  如果一個broker組有Master和Slave,消息需要從Master復制到Slave上,有同步和異步兩種復制方式。

同步復制是等Master和Slave

均寫成功后才反饋給客戶端寫成功狀態;異步復制方式是只要Master寫成功即可反饋給客戶端寫成功狀態

  這兩種復制方式各有優劣,在異步復制方式下,系統擁有較低的延遲和較高的吞吐量,但是如果Master

出了故障,有些數據因為沒有被寫入Slave,有可能會丟失;在同步復制方式下,如果Master出故障,Slave

上有全部的備份數據,容易恢復,但是同步復制會增大數據寫入延遲,降低系統吞吐量。

  同步復制和異步復制是通過Broker配置文件里的brokerRole參數進行設置的,這個參數可以被設置成

ASYNC_MASTER、SYNC_MASTER、SLAVE三個值中的一個。

  實際應用中要結合業務場景,合理設置刷盤方式和主從復制方式,尤其是SYNC_FLUSH方式,由於頻繁

的觸發寫磁盤動作,會明顯降低性能。

 

通常情況下,應該把Master和Slave設置成ASYNC_FLUSH的刷盤方式,

主從之間配置成SYNC_MASTER的復制方式,這樣即使有一台機器出故障,仍然可以保證數據不丟。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM