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