听老歌 发表于 2012-02-22 19:34

MongoSpy, MongoWatch及MongoDB数据压缩

MongoSpy, MongoWatch及MongoDB数据压缩


本文源自openmymind博客的一篇文章,文中作者介绍了两个自己用Node.JS写的MongoDB监控小工具,MongoSpy和MongoWatch,然后提出了在对MongoDB进行文本存储时使用压缩以节约空间的设想。

这两上小工具功能并不怎么强大,实现也简单,如果你会用任何一种语言操作MongoDB的话,相信你都能写一个类似的东西。

MongoSpy:一个对MongoDB慢查询进行监控的小工具,使用node.js从MongoDB的system.profile这个Collection中不停读出最新的数据并显示在Web页面,这样你就能实时的看到MongoDB的慢查询了。当然,前提是你得配置好对应DB的profile级别。具体可见:《Mongo Database Profiler》
MongoWatch:这个脚本是定时获取MongoDB的状态信息,并将其按时间顺序排列显示在Web页面上,让你可以直接看到随着时间推移你MongoDB的各项状态指标的变化。
上面说完两个小工具,有兴趣的话你可以自己去看一看具体的用法,下面部分提出了使用压缩方法对MongoDB文本数据进行压缩的想法。

MongoDB是一个文档型数据库,其数据使用BSON结构存储,BSON支持文本型数据存储的同时也支持二进制数据存储。试想如果BSON结构会将字符串做某种压缩然后以二进制的形式存储,那将会节约很大的空间。

但是这有一个前提,那就是你不会对压缩过的字段建立索引做查询。实际上这一点在很多情况下是可以保证的,比如我们使用MongoDB存储博客的博文信息,是不会对博文做查询操作的。

但是很遗憾,MongoDB并没有提供这样的功能,虽然这个功能已经早就有人提出(SERVER-164)。

既然MongoDB不支持,那么我们可以考虑在客户端实现,目前压缩算法数不胜数,这主要取决于你使用语言的支持。比如Google’s Snappy或者是MessagePack等等。实际上这一想法并不新鲜,在一些不提供二级索引的存储,比如Memcached上,我们早就使用了类似的做法来节约内存。

比如你可以把一些纯文本的数据压缩后存成二进制,再保存一个压缩类型的字段做标识,如下:

{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' }}
]}上面数据前三条用了类型为1的压缩算法对数据进行压缩并存在二进制数据,第四条没有压缩。具体情况可以通过压缩算法在不同长度数据下的压缩率来调整,比如只有两个字符的value值,可能你就不需要压缩了,这时候你设置type为0表示未做压缩即可。

参考文章:openmymind.net


小鬼萌萌控 发表于 2012-02-24 17:12

谢谢分享
页: [1]
查看完整版本: MongoSpy, MongoWatch及MongoDB数据压缩