背景
生產環境采用 RocketMQ
三主三從集群搭建,6 個實例部署在 3 台 Linux 服務器上(節省資源),每台服務器部署一主一從,生產上運行一段時間后,發現磁盤空間報警,發現df
與du
顯示的空間不一致(相差幾十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