2013-01-23 348 views
5

我已經寫了this question in mongodb google group,沒有任何回覆在這裏發佈。需要多少額外的空間來修復數據庫需要

我們有一個單節點mongo(版本2.0.1)實例。即使每天歸檔後,我們的磁盤空間也不足,因爲mongo不會將空間返回到操作系統,並嘗試自行使用它。目前我們的設置已經變得非常稀疏,約有50%的空間閒置。您可以看到數據+索引大小約爲1170 GB,而存儲大小約爲2158 GB,文件大小約爲2368 GB。

db.stats()  
{ 
    "db" : "default",    
    "collections" : 106, 
    "objects" : 553988389, 
    "avgObjSize" : 2094.1392962010254, 
    "dataSize" : NumberLong("1160128855044"), 
    "storageSize" : NumberLong("2315777236208"), 
    "numExtents" : 1487, 
    "indexes" : 107, 
    "indexSize" : 97914435136, 
    "fileSize" : NumberLong("2543459500032"), 
    "nsSizeMB" : 16, 
    "ok" : 1 
} 

我們要回收空間,並因爲這不是一個關鍵任務系統(它像日誌傾倒場)可以維持的停機時間。我們不想花費在創建副本集上,我們也在物理數據中心,因此寧願不附加額外的磁盤來修復數據庫。
我想了解: -
- 如何需要修復數據庫
我們 - 如何多少空間可以希望修復數據庫
-Around應該花費多少時間來修復數據庫之後收回多少可用磁盤空間。
- 如果所有修復數據庫都在繼續,那麼殺死它並重新啓動數據庫是否安全?

我們的數據大量存在於單個集合中,因此緊湊集合是否優於修復數據庫。

+1

修復可能需要多達2倍的空間。 –

+0

數據大小或存儲大小的2倍? – pseudonym

+0

修復會做一個''mongodump''和''mongorestore'',因此它需要數據庫使用的磁盤空間的兩倍,即需要空間來存儲舊的和新的數據庫文件。爲了避免你可以手動執行''mongodump'',刪除數據庫文件,然後運行''mongorestore''。另外,如果你只需要回收未使用的空間,你可以運行「compact」(確保你有2GB可用空間)。 – diliop

回答

2

首先,我會建議你從2.0.1升級。如果不是2.2.2,則至少爲2.0.7。 修復需要2x文件大小。 您的文件大小應該稍大於數據大小。 需要多長時間取決於系統資源和系統的繁忙程度。 Compact不會釋放磁盤空間 - 它只是在數據文件中進行碎片整理。

在2.2.x中您可以使用 collMod

命令設置usePowerOf2Sizes,以減少文件碎片。例如插入800字節文件和1024字節將被分配。刪除該文檔並插入900字節的文檔,現在可以重新使用1024空間。如果沒有這個可能只有850個字節被分配,並且新的可用空間將被分配給900字節的文檔。

殺repairDatabase應該沒問題 - 文件複製到新的位置,然後defragg'd複製回在完成但你必須對它進行測試,以確保:)

+0

Thanks @gregor At目前我們正在定期進行歸檔,但mongo無法正確利用已釋放的空間,您可以通過數據+索引大小和存儲大小的差異來查看。如果我們繼續「壓縮」數據,那麼它會開始更有效地利用空間(mongo的空閒空間)?根據升級,目前我們不希望投資任何帶寬,因爲完整的解決方案將在幾個月左右被替換。同樣,@diliop也提出了2GB是否足夠用於'compact' – pseudonym

+0

@ApoorvaGaurav嗨,我看到有人在生產中使用MongoDB進行大寫操作,並且在每週定期的基礎上讀取壓縮文件。他們甚至寫了一個像這樣的腳本來自動執行它,而不是進行修復,因爲它永遠需要,需要x2的存儲空間。看看這個:http://blog.parse.com/2013/03/26/always-be-compacting/這裏是github上的代碼:https://github.com/ParsePlatform/Ops/blob/master/工具/ mongo_compact.rb – Maziyar