MongoSpy, MongoWatch及MongoDB數(shù)據(jù)壓縮
、
本文源自openmymind博客的一篇文章,文中作者介紹了兩個自己用Node.JS寫的MongoDB監(jiān)控小工具,MongoSpy和MongoWatch,然后提出了在對MongoDB進行文本存儲時使用壓縮以節(jié)約空間的設(shè)想。
這兩上小工具功能并不怎么強大,實現(xiàn)也簡單,如果你會用任何一種語言操作MongoDB的話,相信你都能寫一個類似的東西。
MongoSpy:一個對MongoDB慢查詢進行監(jiān)控的小工具,使用node.js從MongoDB的system.profile這個Collection中不停讀出最新的數(shù)據(jù)并顯示在Web頁面,這樣你就能實時的看到MongoDB的慢查詢了。當(dāng)然,前提是你得配置好對應(yīng)DB的profile級別。具體可見:《Mongo Database Profiler》
MongoWatch:這個腳本是定時獲取MongoDB的狀態(tài)信息,并將其按時間順序排列顯示在Web頁面上,讓你可以直接看到隨著時間推移你MongoDB的各項狀態(tài)指標(biāo)的變化。
上面說完兩個小工具,有興趣的話你可以自己去看一看具體的用法,下面部分提出了使用壓縮方法對MongoDB文本數(shù)據(jù)進行壓縮的想法。
MongoDB是一個文檔型數(shù)據(jù)庫,其數(shù)據(jù)使用BSON結(jié)構(gòu)存儲,BSON支持文本型數(shù)據(jù)存儲的同時也支持二進制數(shù)據(jù)存儲。試想如果BSON結(jié)構(gòu)會將字符串做某種壓縮然后以二進制的形式存儲,那將會節(jié)約很大的空間。
但是這有一個前提,那就是你不會對壓縮過的字段建立索引做查詢。實際上這一點在很多情況下是可以保證的,比如我們使用MongoDB存儲博客的博文信息,是不會對博文做查詢操作的。
但是很遺憾,MongoDB并沒有提供這樣的功能,雖然這個功能已經(jīng)早就有人提出(SERVER-164)。
既然MongoDB不支持,那么我們可以考慮在客戶端實現(xiàn),目前壓縮算法數(shù)不勝數(shù),這主要取決于你使用語言的支持。比如Google’s Snappy或者是MessagePack等等。實際上這一想法并不新鮮,在一些不提供二級索引的存儲,比如Memcached上,我們早就使用了類似的做法來節(jié)約內(nèi)存。
比如你可以把一些純文本的數(shù)據(jù)壓縮后存成二進制,再保存一個壓縮類型的字段做標(biāo)識,如下:
{account: 1231232, server: 'linode1', latest: 'Sep 23 2011', data: [
{type: 1, data: BinData(0,"iad42ZXJzaW9upTEuOC4wpnVwdGltZc4Ae3z")},
{type: 1, data: BinData(0,"iad42ZXJzaW9upTEuOC4wpnVwdGltZc4Ae3z")},
{type: 1, data: BinData(0,"iad42ZXJzaW9upTEuOC4wpnVwdGltZc4Ae3z")},
{type: 0, data: {virtual: 1889, mapped: 852, uptime: 7920098, hit: 99, date: 'Sep 23 2011' }}
]}上面數(shù)據(jù)前三條用了類型為1的壓縮算法對數(shù)據(jù)進行壓縮并存在二進制數(shù)據(jù),第四條沒有壓縮。具體情況可以通過壓縮算法在不同長度數(shù)據(jù)下的壓縮率來調(diào)整,比如只有兩個字符的value值,可能你就不需要壓縮了,這時候你設(shè)置type為0表示未做壓縮即可。
參考文章:openmymind.net
|