OpenStack Ceilometer用MongoDB解決占用磁盤空間過大問題
背景:Ceilometer使用MongoDB作為數據庫,不斷進行采樣,導致數據量膨脹,占用過多的磁盤空間。
知識背景
1.數據庫文件類型
1.1. journal 日志文件
跟一些傳統數據庫不同,MongoDB的日志文件只是用來在系統出現宕機時候恢復尚未來得及同步到硬盤的內存數據。日志文件會存放在一個分開的目錄下面。啟動時候MongoDB會自動預先創建3個每個為1G的日志文件(初始為空)。
1.2. namespace 表名文件 dbname.ns
這個文件用來存儲整個數據庫的集合以及索引的名字。這個文件不大,默認16M,可以存儲24000個集合或者索引名以及那些集合和索引在數據文件中得具體位置。通過這個文件MongoDB可以知道從哪里去開始尋找或插入集合的數據或者索引數據。
1.3. 數據文件 dbname.0, dbname.1,… dbname.n
MongoDB的數據以及索引都存放在一個或者多個MongoDB數據文件里。第一個數據文件會以“數據庫名.0”命名,如 my-db.0。這個文件默認大小是64M,在接近用完這個64M之前,MongoDB 會提前生成下一個數據文件如my-db.1。數據文件的大小會2倍遞增。第二個數據文件的大小為128M,第三個為256M。一直到了2G以后就會停止,一直按這個2G這個大小增加新的文件。
2.數據庫大小參數
2.1. dataSize
dataSize是最接近真實數據大小的一個參數。你可以用來檢查你的數據有多少。這個大小包括了數據庫(或者集合)的每條記錄的總和。注意每條記錄除了BSON文檔外還有header及padding這些額外開銷。所以實際大小會比真正數據所占空間會稍大。
2.2. storageSize
這個參數等于數據庫或者某個集合所有用到的Data Extents的總和。注意這個數字會大于dataSize因為Extent里面會有一些刪除文檔之后留下來的碎片。如果有新插入的文檔小于或等于碎片的大小,MongoDB會重新利用這個碎片來存儲新的文檔。不過在這之前這些碎片將一直會被保留在那里占用空間。由于這個原因,你刪除文檔的時候這個參數不會變小。
2.3. fileSize
這個參數只在數據庫上有效,指的是實際文件系統中用到的文件的大小。它包括所有的數據Extents的總和,索引Extent的總和,以及一些未被分配的空間。之前提到MongoDB會對數據庫文件創建時候進行預分配,例如最小就是64M,哪怕你只有幾百個KB的數據。所以這個參數可能會比實際的數據大小會大不少。 這些額外未用空間是用來保證MongoDB可以在新的數據寫入時候快速的分配新的Extent,避免引起磁盤空間分配引起的延遲。
解決方案
1.減少預分配的大?。ɑ蚪妙A分配)
從MongoDB的預分配機制考慮,可以減少預分配的大小,或者禁用預分配。但是這種方案是會影響數據庫行為的。如果數據庫沒有頻繁的大數據寫入動作,可以采取這種方案。
2.數據壓縮
conpact命令可以對collection進行壓縮,從而減少數據量的大小。
db.runCommand({compact:'CollectionName'})
這里需要注意的是:
1)操作進行時,會鎖住當前操作的collection;
2)compact命令不會釋放磁盤空間的,但新的磁盤請求會使用整理出來的空間;
3.將數據導出再導入
mongodump作用是將數據庫導出,mongorestore是將導出的數據庫再導入,這個過程中會重建索引,所以如果數據庫之前進行過刪除操作,空間沒有釋放,那么導入后,刪除的空間會被釋放。
4.定期刪除不用的數據
結合實際情況,ceilometer采取的sample在有效期過后是可以被消除的。
步驟:
1)通過改變/etc/ceilometer/ceilometer.conf的time_to_live參數指定sample的有效期;
2)運行ceilometer-expirer刪除過期的sample;
3)重啟openstack-ceilometer-collector服務;
4)刪除后,使用repairDatabase修復數據庫。
注意,repairDatabase操作所需要磁盤的空余空間為當前數據總量再加上2G。如果當前磁盤分區空間不足,可以嘗試用 –repairpath 參數指定一個空間足夠的分區路徑。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
新聞熱點
疑難解答
圖片精選