免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4462 | 回复: 1

[MongoDB] MongoSpy, MongoWatch及MongoDB数据压缩 [复制链接]

论坛徽章:
0
发表于 2012-02-22 19:34 |显示全部楼层
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


论坛徽章:
0
发表于 2012-02-24 17:12 |显示全部楼层
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP