簡介: 淺談專有云MQ存儲空間的清理機制
在近⼀年的項⽬保障過程當中,對專有云MQ產品的存儲⽔位清理模式⼀直存疑,總想一探究竟但又苦於工做繁忙、精力有限,直到最近⼀次項⽬保障過程當中再次出現了相似的問題,⼤家對MQ Broker的⽔位清理機制仍然⽐較模糊,因而便有了這篇⽂章。但願能經過這篇⽂章將MQ Broker的消息清理機制講清楚。
⾸先,咱們先來看⼀張MQ的消息保存時間和Broker磁盤存儲空間的⽔位趨勢圖(該圖來源於銅雀,⽬前已改名爲SRE技術保障平臺)。經過該趨勢圖,能夠看到紅線左側的消息保存時間(上⽅藍⾊趨勢線)和Broker磁盤存儲空間(下⽅綠⾊區域)呈現出規律性的波動。⽽紅線右側部分,隨着消息量的快速增長(經過Broker磁盤存儲空間快速上漲得出),開始⼀段時間消息保存時間還呈規律性波動,但接近最右側時,能夠看到消息保存時間的波動頻率加快了,⽽且消息保存時間快速降低。那麼MQ對消息的清理機制究竟是什麼呢?docker
圖1:消息保存時間&磁盤空間佔比趨勢圖性能
在介紹清理機制前,先來複習⼀下MQ的消息是如何進⾏存儲的。阿里雲
圖2:commitlogspa
Producer發送的全部消息都存放在Broker節點的
/home/admin/store/commitlog ⽬錄下(專有云場景),每一個commitlog的⼤⼩固定爲1G。隨着時間的推移,當Broker接收的消息量愈來愈多時,就會在該⽬錄下⽣成多個⼤⼩爲1G的commitlog⽂件。
ps: 特別聲明,雖然該⽬錄叫commitlog,但⽬錄中存儲的⽂件並非程序⽇志,⽽是MQ Broker⽤來存儲消息的⽂件載體,在MQ產品中這種⽂件載體叫作commitlog。之因此這⾥作特別說明,是由於歷史上出現過因爲誤認爲此⽬錄下存儲的是程序⽇志,爲了釋放磁盤存儲空間將⽬錄下的commitlog刪除致使MQ消息丟失的故障。這是⾎的教訓!這個⽬錄下的⽂件不要碰,不要碰,不要碰。
commitlog⽬錄下的⽂件讓MQ⾃行維護清理即可。那MQ⾃身是根據什麼規則來進⾏清理的呢?先來看⼀下MQ⾥⾯⼏個⽐較關鍵的閾值:code
MQ會在兩個時機對commitlog進⾏清理,⼀是前文提到的天天凌晨4點;另⼀個是消息寫⼊時。經過如下表格能夠更加清楚的看出具體的清理策略。blog
咱們回過頭來再看⼀下這個趨勢圖。rem
圖3:消息保存時間&磁盤空間佔比趨勢圖get
ps:實際在MQ的代碼實現層⾯,爲了保證消息寫⼊Broker的性能,並非每次寫⼊消息時都進⾏存儲
空間檢查和commitlog清理,⽽是經過定時任務來執⾏(該定時任務每10s執⾏⼀次)。產品
上述介紹的⼏個清理閾值中,有些是可調的,有些是內置在代碼中不可調的。⽐如「凌晨4點」,「72⼩時」,「75%」,這3個參數是⽤戶能夠調整的MQ配置,「85%」,「90%」是寫死在代碼中的,是⽆法調整的。
查看Broker配置信息的⽅式以下,在Broker的docker中執⾏it
sh /home/admin/rmq/bin/mqadmin getBrokerConfig -b ${IP}:10911
在調整配置時,deleteWhen一般選在客戶MQ業務的低峯期進⾏,儘可能避免commitlog清理對⽣產業務的影響。當Broker存儲⽔位出現快速上漲時,爲避免存儲⽔位達到90%,出現禁寫影響⽣產業務的狀況,須要同時調整fileReservedTime和diskMaxUsedSpaceRatio的默認設置,經過調整這兩個參數共同做⽤保證Broker的存儲空間能夠及時獲得清理(還有⼀種降⽔位的⽅式——關閉MQ消息軌跡)。固然這全部參數的調整都須要通過與產研的溝通與確認。
以上就是對MQ Broker消息清理機制的剖析,但願經過這篇⽂章可以讓你們理解並掌握其清理機制,可以處理實際工做中遇到的MQ Broker存儲⽔位快速上漲的問題。
咱們是阿里雲智能全球技術服務-SRE團隊,咱們致力成爲一個以技術爲基礎、面向服務、保障業務系統高可用的工程師團隊;提供專業、體系化的SRE服務,幫助廣大客戶更好地使用雲、基於雲構建更加穩定可靠的業務系統,提高業務穩定性。
做者:劉維
原文連接本文爲阿里雲原創內容,未經容許不得轉載