1、rocketmq的主從切換機制
- 當master所在機器正常運行的情況之下,producer往master中寫入消息,consumer從master中讀取並消費消息
- 當master所在機器宕機之後,producer無法進行寫消息操作,consumer從該master的slaver機器中讀取並消費消息
- 當master所在機器宕機之後,需要手動重啓master機器,重啓完之後,producer從nameserver獲取到了master信息,兩者重新進行連接操作(長連接),這個時候producer可以重新往master發送消息,consumer則自動從master讀取並消費消息
相關文檔資源鏈接:https://www.jianshu.com/p/08850de70ec0
2、rocketmq的主從複製策略
- rocketmq的主從複製策略有兩種,分別是異步複製和同步複製:
ASYNC_MASTER:異步master,也就是新的消息存儲時不需要等slave同步好;
SYNC_MASTER:同步master,新消息存現時需要等slave同步好(也就是返回的 Ack Offset >= 當前消息的CommitLog Offset;)
當異步複製時,如果master宕機,則有可能丟失一部分消息;同步複製情況下,不會丟失消息(刷盤同樣如此)
3、多master和多slaver的消息策略
多master情況下,producer通過nameserver的負載均衡策略輪詢的向每個master發送消息,實現rocketmq的高可用
4、rocketmq的文件刪除策略
由於RocketMQ操作CommitLog、ConsumeQueue文件,都是基於內存映射方法並在啓動的時候,會加載commitlog、ConsumeQueue目錄下的所有文件,爲了避免內存與磁盤的浪費,不可能將消息永久存儲在消息服務器上,所以需要一種機制來刪除已過期的文件。
RocketMQ順序寫Commitlog、ConsumeQueue文件,所有寫操作全部落在最後一個CommitLog或ConsumeQueue文件上,之前的文件在下一個文件創建後,將不會再被更新。
RocketMQ清除過期文件的方法是:如果非當前寫文件在一定時間間隔內沒有再次被更新,則認爲是過期文件,可以被刪除,RocketMQ不會管這個這個文件上的消息是否被全部消費。默認每個文件的過期時間爲72小時。通過在Broker配置文件中設置fileReservedTime來改變過期時間,單位爲小時。
相關配置內容:
fileReservedTime:文件保留時間,也就是從最後一次更新時間到現在,如果超過了該時間,則認爲是過期文件,可以被刪除。
deletePhysicFilesInterval:刪除物理文件的間隔,因爲在一次清除過程中,可能需要刪除的文件不止一個,該值指定兩次刪除文件的間隔時間。
destroyMapedFileIntervalForcibly:在清除過期文件時,如果該文件被其他線程所佔用(引用次數大於0,比如讀取消息),此時會阻止此次刪除任務,同時在第一次試圖刪除該文件時記錄當前時間戳,destroyMapedFileIntervalForcibly表示第一次拒絕刪除之後能保留的最大時間,在此時間內,同樣可以被拒絕刪除,同時會將引用減少1000個,超過該時間間隔後,文件將被強制刪除。
#刪除文件時間點,默認凌晨 4點 deleteWhen=04
#commitLog每個文件的大小默認1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個文件默認存30W條,根據業務情況調整
mapedFileSizeConsumeQueue=300000
RocketMQ 會每隔10s調度一次cleanFilesPeriodically,已檢測是否需要清除過期文件。執行頻率可以通過設置cleanResourceInterval,默認爲10s。
RocketMQ在如下三種情況任意滿足之一的情況下將繼續執行刪除文件操作。
到了刪除文件的時間點,RocketMQ通過deleteWhen設置一天的固定時間執行一次刪除過期文件操作,默認爲凌晨4點。
判斷磁盤空間是否充足,如果不充足,則返回true,表示應該觸發過期文件刪除操作。
預留,手工觸發,可以通過調用excuteDeleteFilesManualy方法手工觸發過期文件刪除,目前RocketMQ暫未封裝手工觸發文件刪除的命令。
相關鏈接:https://blog.csdn.net/prestigeding/article/details/79482339