如何解決Mongodb內存過大問題

一、MongoDB的數據庫文件主要有3種:

[1]journal 日誌文件

跟一些傳統數據庫不同,MongoDB的日誌文件只是用來在系統出現宕機時候恢復尚未來得及同步到硬盤的內存數據。日誌文件會存放在一個分開的目錄下面。啓動時候MongoDB會自動預先創建3個每個爲1G的日誌文件(初始爲空)。除非你真的有持續海量數據併發寫入,一般來說3個G已經足夠。

 

[2]namespace 表名文件dbname.ns

這個文件用來存儲整個數據庫的集合以及索引的名字。這個文件不大,默認16M,可以存儲24000個集合或者索引名以及那些集合和索引在數據文件中得具體位置。通過這個文件MongoDB可以知道從哪裏去開始尋找或插入集合的數據或者索引數據。

 

[3]data 數據及索引文件dbname.0, dbname.1,… dbname.n

MongoDB的數據以及索引都存放在一個或者多個MongoDB數據文件裏。第一個數據文件會以“數據庫名.0”命名,如 my-db.0。這個文件默認大小是64M,在接近用完這個64M之前,MongoDB 會提前生成下一個數據文件如my-db.1。數據文件的大小會2倍遞增。第二個數據文件的大小爲128M,第三個爲256M。一直到了2G以後就會停止,一直按這個2G這個大小增加新的文件。

 

二、在執行db.stats()命令後,得到數據庫大小,主要參數爲dataSize、storageSize以及fileSize。


[1] dataSize

dataSize是最接近真實數據大小的一個參數。你可以用來檢查你的數據有多少。這個大小包括了數據庫(或者集合)的每條記錄的總和。注意每條記錄除了BSON文檔外還有header及padding這些額外開銷。所以實際大小會比真正數據所佔空間會稍大。

 

[2] storageSize

這個參數等於數據庫或者某個集合所有用到的Data Extents的總和。注意這個數字會大於dataSize因爲Extent裏面會有一些刪除文檔之後留下來的碎片(deleted)。如果有新插入的文檔小於或等於碎片的大小,MongoDB會重新利用這個碎片來存儲新的文檔。不過在這之前這些碎片將一直會被保留在那裏佔用空間。由於這個原因,你刪除文檔的時候這個參數不會變小。

 

[3] fileSize

這個參數只在數據庫上有效,指的是實際文件系統中用到的文件的大小。它包括所有的數據Extents的總和,索引Extent的總和,以及一些未被分配的空間。之前提到MongoDB會對數據庫文件創建時候進行預分配,例如最小就是64M,哪怕你只有幾百個KB的數據。所以這個參數可能會比實際的數據大小會大不少。 這些額外未用空間是用來保證MongoDB可以在新的數據寫入時候快速的分配新的Extent,避免引起磁盤空間分配引起的延遲。

 

三、內存過大解決方案

(1)減小預分配文件的大小

#mongo
>use admin
>db.shutdownServer()
Ctrl+c
# mongod --config /etc/mongodb.conf –smallfiles
#mongo
>use dbname
>db.repairDatabase()

(2)將數據庫導入導出

#mongodump -d databasename
#echo 'db.dropDatabase()' | mongo databasename
#mongorestore dump/databasename

(3)禁用預分配機制(可能會導致性能降低)

#mongo
>use admin
>db.shutdownServer()
Ctrl+c
# vi /etc/mongodb.conf
在最後添加「noprealloc = true」
# mongod --config /etc/mongodb.conf
#mongo
>use dbname
>db.repairDatabase()

參考鏈接:

http://stackoverflow.com/questions/2966687/reducing-mongodb-database-file-size

http://stackoverflow.com/questions/7147739/mongodb-avoid-excessive-disk-space

http://huoding.com/2011/08/19/107

http://281816327.blog.51cto.com/907015/1598460



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章