1. 背景
DBA同事反饋說Mongp集群磁盤占用空間過大,超過監控告警95%閾值,因此建議刪除部分資源或者申請擴容,本着開源節流的理念,還是乖乖看哪些老數據應該刪除。但Mongo中的庫和表過多,因此如何進行統計?
2. MongoDB庫表占用空間統計
其實,MongoDB中庫表的占用空間統計方式N多種,比如通過各種語言依賴包如java的mongodb-driver、python的pymongo等支持統計,選擇個人擅長的一種即可。
由於mongo命令行支持運行js代碼,因此計划使用js代碼來執行(免得要打開各種IDE界面或命令行窗口)
2.1 庫占用統計
庫占用簡單,運行如下命令即可
show dbs;
運行結果如下
mongos> show dbs; CloudCrawler 0.000GB MarkHistory 0.025GB Medal 0.005GB Result 0.072GB ResultHistory 0.051GB admin 0.000GB admind_for_test 0.000GB
2.2 表占用統計
表占用統計,即統計每個庫下每個表的大小,運行如下命令即可,該代碼僅統計指定庫下表的分布
tabName = db.getCollectionNames(); function getReadableFileSizeString(tabName) { for(var j=0;j<tabName.length;j++){ var name=tabName[j]; var cnt=db.getCollection(name).find({}).count(); var fileSizeInBytes= db.getCollection(name).stats().size; var i = -1; var byteUnits = [' kB', ' MB', ' GB', ' TB', 'PB', 'EB', 'ZB', 'YB']; do { fileSizeInBytes = fileSizeInBytes / 1024; i++; } while (fileSizeInBytes > 1024); print(name + ' cnt:' + cnt + ' size:'+Math.max(fileSizeInBytes, 0.1).toFixed(1) + byteUnits[i]); } }; getReadableFileSizeString(tabName);
運行結果,標識edt_manage_prod庫下各個collection的統計
edu_manage_prod: CheckTask cnt:53 size:7.7 kB OCR_TMP_GFS.chunks cnt:2554250 size:96.6 GB OCR_TMP_GFS.files cnt:2529063 size:1.2 GB eduManifestQuestion cnt:709 size:15.7 MB jhi_user cnt:0 size:0.1 kB survey_result cnt:25 size:101.3 kB survey_task cnt:19 size:44.6 kB system.profile cnt:185 size:210.6 kB
3. 解決
按照如上即可統計中所有庫對應表的占用大小,找到占比最大幾張表,與業務線確認表是否仍在使用,確認后執行備份后刪除即可。
注意:
(1) 執行db.collection.remove()只是清空數據,占用的磁盤空間仍沒有釋放,因此建議使用db.collection.drop()或執行remove后對該collection重命名,即可徹底釋放