概述
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的復制方式,這樣即使有一台機器出故障,仍然可以保證數據不丟。