在mongo中刪除數據并不會直接釋放磁盤,而是產生很多碎片。這些碎片會被mongo繼續利用。當有新數據插入時,會重復利用這些碎片,而不需要新申請磁盤空間。
但是這會導致的問題是,磁盤可能一直處于高水位的使用水平,對運維來說是一個定時炸彈。因為碎片只會被所屬的庫使用,但我們經常會新建很多庫,這就導致磁盤越來越緊張。
目前我摸索出的是三種方法
在備節點同步的過程中,碎片空間會被整理。備節點同步過去的是完全的數據和索引。
之后再進行一次主備切換。
使備節點成為主節點。
再將主節點數據清空,同步一次。
最終使主備都達到釋放碎片的目的。
優點:服務一直可用
缺點:動作過大。要保證同步過程在同步窗口之內。建議將oplog盡量設置大一點
compact是mongo中的壓縮命令。可以整理刪除數據產生的碎片。
在WiredTiger 數據庫引擎下,該命令會將整理出的空間釋放給操作系統。
在MMAPv1引擎下,compact會整理碎片,重建索引,但不會將未使用的空間釋放給系統,后續新插入的數據依然可以使用這些空間
命令:
進入要執行的數據庫
db.runCommand({ compact: <collection name>,force:<boolen> } )
對主備節點分別執行一次該命令
在復制集模式下的一些注意:
該命令會阻塞運行該命令的庫,一定要選擇好執行的時間
compact命令不會自動復制到secondary節點執行,compact在每個節點成員中都是獨立的,在Primary,secondary中執行時都要使用force參數,
當在secondary的collection上執行compact命令時,此secondary節點會變成RECOVERING狀態,且無法提供讀操作
在capped collection中不必使用compact命令,因為它本身就是固定空間
實驗:
當前庫占了大約5.8G的磁盤
然后我刪除了部分數據
shard1:PRIMARY> db.runCommand({ compact: "fs.files"} )
{
"ok" : 0,
"errmsg" : "will not run compact on an active replica set primary as this is a slow blocking operation. use force:true to force"
}
shard1:PRIMARY> db.runCommand({ compact: "fs.files",force:true} )
這里會卡很久,數據庫操作會被鎖住
實踐證明:能夠壓縮一些,但并不能達到數據實際的磁盤占用量
這個命令我沒有嘗試,謹慎使用。
做repairDatabase要求剩余磁盤要足夠大。
但是當我的磁盤告警時,已經不會有足夠的磁盤做repairDatabase了
db.runCommand({repairDatabase:1})
注:這個命令一定要謹慎使用,能不用的情況下盡量不用,因為會花費很多時間和性能
官網的一句話是這樣說的:
The repairDatabase command compacts all collections in the database. It is identical to running the compact command on each collection individually
不建議直接repairDatabase,不如對需要做壓縮的集合進行compact
個人覺得mongo的這種機制真的很蛋疼。
大家還有沒有什么好方法,歡迎交流
在之前的文章中介紹過MongoDB的可視化管理工具,有Web端的,也有桌面端的,怎么用都大同小異,今天介紹的adminMongo也是一個MongoDB的Web端可視化管理工具,界面美觀,安裝操作簡單。而且依舊是開源免費的。
官網:
https://adminmongo.markmoffat.com/
Github:
https://github.com/mrvautin/adminMongo
由于我是在本地使用,環境自然是windows 10 1903,首先我們需要到Github上下載發布好的release版本,我們這里選擇windows版本的,同時還支持MacOS
https://github.com/mrvautin/adminMongo/releases
你可以選擇適合自己系統的版本下載,下載好后解壓
解壓好后我們可以直接打開adminMongo.exe,這個時候可能是我機器問題,也可能是軟件本身問題,我打開后顯示空白,這個時候不用擔心,既然我們說了是Web端那么,我們打開瀏覽器
http://127.0.0.1:1234/app/Local
我本地已經利用windows服務注冊工具nssm將adminMongo.exe注冊成windows服務了
你可以添加連接
基本的增刪改查都是可以的
服務器端監控
你可以自己克隆源碼自己構建部署
adminMongo將默認偵聽:localhost和port:1234。這可以通過在/config/app.json中添加配置文件來覆蓋,例如
{ "app": { "host": "10.0.0.1", "port": 4321, "password": "secureadminpassword", "locale": "de", "context": "dbApp", "monitoring": false } }
國際化功能本身不提供中文的,但是你可以通過自己添加語言文件來實現本地化,沒有翻譯的話默認是英文版本。
使用adminMongo,也是因為之前文章介紹的YAPI(API客戶化平臺)的后臺數據庫使用的就是MongDB,剛好看到這個,然后就試用了下,目前已經在本地使用了,感覺非常方便,因此在此分享!