摘要: compact操做步驟不少,可是能夠有效減小磁盤使用量。算法
當Fundebug處理的數據愈來愈多,這致使MongoDB的磁盤使用量愈來愈多,增加也愈來愈快。因而,我開始定時刪除過時數據,優化算法減小冗餘數據。可是,我發現,單純刪除文檔不能減小MongoDB磁盤使用量。這是爲何呢?下面是官方文檔的解釋:mongodb
對於WiredTiger存儲引擎(mongodb 3.2以後默認使用):How do I reclaim disk space in WiredTiger?docker
The WiredTiger storage engine maintains lists of empty records in data files as it deletes documents. This space can be reused by WiredTiger, but will not be returned to the operating system unless under very specific circumstances.數據庫
也就是說,被刪除的文檔所佔用的磁盤空間仍然由MongoDB保留,不會釋放。對於舊版MongoDB的MMAPv1存儲引擎,這一點也是同樣的。這樣作無可厚非,由於數據庫將會不斷存儲新的文檔,它們能夠利用以前保留的磁盤空間。bash
可是,若是你刪除了不少文檔,須要MongoDB釋放磁盤空間,應該如何作呢?正如文檔所述,對於WiredTiger存儲引擎,咱們可使用compact操做來實現。less
To allow the WiredTiger storage engine to release this empty space to the operating system, you can de-fragment your data file. This can be achieved using the compact command.性能
compact操做會從新整理碎片化的磁盤,釋放多餘的空間。優化
Rewrites and defragments all data and indexes in a collection. On WiredTiger databases, this command will release unneeded disk space to the operating system.this
關於compact操做,我列了幾個簡單的Q&A。spa
因爲compact操做會阻塞MongoDB的讀寫操做,所以應該對每一個節點依次進行操做。另外,MongoDB複製集的標準維護流程是將Secodary節點暫定,使用單獨的端口啓動獨立的mongo實例進行操做,這樣能夠複製集徹底隔離。
咱們Fundebug的MongoDB集羣運行在Docker中,所以操做步驟稍微簡單一些,能夠爲你們提供參考。
sudo docker stop mongo
複製代碼
sudo docker run -it -d -p 37017:27017 -v /data/db:/data/db --name mongo_tmp mongo:3.2
複製代碼
mongo 127.0.0.1:37017
db.runCommand( { compact : 'events',paddingFactor: 1.1 } )
複製代碼
sudo docker rm -f mongo_tmp
sudo docker start mongo
複製代碼
rs.stepDown()
複製代碼