RocketMQ 部署不當導致磁盤空間不釋放


背景

生產環境采用 RocketMQ 三主三從集群搭建,6 個實例部署在 3 台 Linux 服務器上(節省資源),每台服務器部署一主一從,生產上運行一段時間后,發現磁盤空間報警,發現dfdu顯示的空間不一致(相差幾十G)。

問題原因

RocketMQ在同一台服務器上,啟動一主一從 2 個實例,由於 2 個主從RocketMQ實例采用同樣的 Logback 配置文件,寫入的日志名稱及滾動策略是一樣的。

主從 2 個實例Logback在 Linux 下共享日志滾動時,會導致日志文件滾動后,但是其中一個 實例進程未釋放日志文件的磁盤空間。

PS:我自己寫了個Logback的 Demo,啟動多個實例會重現該問題。

Logback源碼分析見參考文章。

檢查方法

# 查看 rocketmq 未釋放文件
$ lsof | grep rocketmq | grep deleted

# 查看 rocketmq 未釋放文件的磁盤總大小,$7 是lsof 的 size 字段,單位 Byte
$ lsof | grep rocketmq | grep deleted |awk 'BEGIN{sum=0}{sum+=$7}END{print sum/1024/1024 "MB"}'

解決方案

臨時釋放磁盤空間

# 主從同時停止寫操作 
# -v參數:4表示為只讀,6為可讀寫,配置禁止寫入數據操作時,主備節點都需要設置禁止寫入數據的操作。
$ sh /home/mq/rocketmq-all-4.6.0-bin-release/bin/mqadmin updateBrokerConfig -b mq1:10911 -k brokerPermission -v 4
$ sh /home/mq/rocketmq-all-4.6.0-bin-release/bin/mqadmin updateBrokerConfig -b mq1:10912 -k brokerPermission -v 4

# rocketmq-console 上監控實例生產和消費情況,當消費變為0時,重啟服務

# 啟動成功后,恢復主從寫操作
$ sh /home/mq/rocketmq-all-4.6.0-bin-release/bin/mqadmin updateBrokerConfig -b mq1:10911 -k brokerPermission -v 6
$ sh /home/mq/rocketmq-all-4.6.0-bin-release/bin/mqadmin updateBrokerConfig -b mq1:10912 -k brokerPermission -v 6

徹底解決

  • 新增 3 台服務器,遷移RocketMQ的 3 個從節點到新服務器即可;
  • 不增加服務器情況下,重新復制一份RocketMQ安裝目錄,修改 Logback 中的日志路徑;
  • 分析Logback源碼,修改日志滾動實現,見參考文章。

參考文章

多項目寫入同一Logback日志文件導致的滾動混亂問題(修改Logback源碼):https://blog.csdn.net/Abysscarry/article/details/102847754


免責聲明!

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



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