MongoDB之compact操作详解
摘要: compact操作步驟很多,但是可以有效減少磁盤使用量。
MongoDB與磁盤
當Fundebug處理的數據越來越多,這導致MongoDB的磁盤使用量越來越多,增長也越來越快。于是,我開始定時刪除過期數據,優化算法減少冗余數據。但是,我發現,單純刪除文檔不能減少MongoDB磁盤使用量。這是為什么呢?下面是官方文檔的解釋:
對于WiredTiger存儲引擎(mongodb 3.2之后默認使用):How do I reclaim disk space in WiredTiger?
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存儲引擎,這一點也是一樣的。這樣做無可厚非,因為數據庫將會不斷存儲新的文檔,它們可以利用之前保留的磁盤空間。
但是,如果你刪除了很多文檔,需要MongoDB釋放磁盤空間,應該如何做呢?正如文檔所述,對于WiredTiger存儲引擎,我們可以使用compact操作來實現。
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操作
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.
關于compact操作,我列了幾個簡單的Q&A。
- compact是否會阻塞數據庫讀寫?會!因此不能在高峰期進行compact操作;對于復制集,應該對每個節點依次進行compact操作。
- compact是否可以釋放磁盤空間?對于WiredTiger,是可以的;但是對于WiredTiger存儲引擎,并不會,多余的磁盤空間仍然會保留給MongoDB。
- compact操作是否會占用額外的磁盤空間?根據我的觀察,基本上不會。
- paddingFactor應該設為多少?我設置的值是1.1,這樣可以為每個文檔留一些多余空間,提高修改性能。這個值可以根據實際需要進行設置。
- compact操作需要多少時間?一個400G的復制集節點,我花了不到1個小時。這樣時間應該與數據量大小有關。
- compact操作效果怎么樣?減少了接近50%的磁盤空間,這個大小應該與被刪除的文檔數量有關。
compact操作步驟
由于compact操作會阻塞MongoDB的讀寫操作,因此應該對每個節點依次進行操作。另外,MongoDB復制集的標準維護流程是將Secodary節點暫定,使用單獨的端口啟動獨立的mongo實例進行操作,這樣可以復制集完全隔離。
我們Fundebug的MongoDB集群運行在Docker中,因此操作步驟稍微簡單一些,可以為大家提供參考。
Secondary節點
- 關閉mongodb容器
- 啟動獨立的臨時mongodb容器
- 執行compact命令
- 重啟mongodb節點
Primary節點
- 將Primary節點變為Secondary節點
- 按照secondary節點進行操作
參考
- MongoDB文檔:compact
- MongoDB文檔:Perform Maintenance on Replica Set Members
總結
以上是生活随笔為你收集整理的MongoDB之compact操作详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WLA-云鹰计划加速千家创新创业企业成为
- 下一篇: 解决fixed在苹果手机抖动问题/头部底