RocketMQ 消息持久化

- 生産者向RocketMQ broker發送消息
- mq收到消息以後,會将消息持久化到硬碟,這樣才能保證機器當機重新開機後消息不丢失,仍然可以給消費者進行消費。這裡有兩種刷盤政策:同步刷盤、異步刷盤
- 同步刷盤:也就是mq收到消息後,必須将消息持久化到硬碟以後才向Producer端傳回ACK成功狀态,這樣就可以100%保證消息不丢失。除非硬碟也壞了。。。
- 異步刷盤:mq收到消息後,将消息存入作業系統的OS cache裡面,通過異步定時将消息刷入磁盤,這樣可能會有少部分資料丢失,因為有可能消息還在os cache裡面,但是機器突然當機了,資料就沒了,會有少量資料丢失。
- 性能上,異步刷盤肯定要比同步刷盤要快一點的。看業務需求進行
Broker配置檔案裡的flushDiskType參數設定的,這個參數被設定成SYNC_FLUSH、ASYNC_FLUSH
RocketMQ 異步複制,同步雙寫
RocketMQ broker可以幾種部署方式
單機部署
隻有一台master broker ,隻能在測試或者本地玩玩,生産會有單點故障風險。
多master broker
有多台broker, 全部都設定為master。因為一個topic可以分散在多台broker上,一台broker也可以放多個topic,是多對多的關系,可以承載更高的并發。但是其中一台broker當機後,改機器上的資料可能會丢失,或者延遲消費。
多master broker,多slave broker,異步複制,同步雙寫
rocket mq中一個master 可以有多個slave,一個slave,隻能有一個master。如上圖,master 1後面可以跟着部署一個slave1,這樣可以保證處于高可用狀态,當master 故障不能提供服務的時候,salve可以替換估計機器成為master,繼續對外提供服務。master的資料會同步至salve。
master收到消息後,會進行資料同步到slave,有兩種政策:
- 異步複制:也就是當master收到消息後,先向producer 傳回ack成功狀态,然後再異步将資料同步至salve。
- 同步雙寫:master收到消息後,需要同時将該消息同步至salve後才将ack成功狀态傳回給producer。
并發性能上肯定是異步複制要不同步雙寫要好的,但是異步複制是有可能會造成資料不一緻的,因為當master傳回ack成功狀态後,可能還沒來得及同步至salve,然後機器故障當機了,此時就會導緻該消息消費者消費不到,消息就會被延遲。
同步複制和異步複制是通過Broker配置檔案裡的brokerRole參數進行設定的,這個參數可以被設定成
ASYNC_MASTER、SYNC_MASTER、SLAVE三個值中的一個。
總結
是以,rocket mq是有可能會丢資料的,而且也是有可能因為master當機導緻消息消費延遲的,但是這都是可以通過參數調節,保證100%資料不丢失的。