免费注册 查看新帖 |

Chinaunix

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

[MongoDB] 压缩 MongoDB 的数据文件 [复制链接]

论坛徽章:
0
发表于 2012-02-22 19:13 |显示全部楼层
压缩 MongoDB 的数据文件




MongoDB 采用了磁盘空间预分配的机制,为了避免磁盘碎片以及使用mmap后造成的近一步的内存碎片,但是随着数据的增删除改操作,数据文件不可避免的会产生空洞,造成磁盘空间和内存的浪费。本文说的是这方面的压缩,数据使用某些压缩算法进行压缩的讨论不在此范围。

在MongoDB 中,大概有两种方法可以解决这种问题,但是都不是无痛方式,所以并不推荐使用。

1.通过 repairDatabase 整理数据文件
repairDatabase 是MongoDB 内置的一个db 上的方法,调用这个方法,MongoDB 会扫描db中的所有数据,并将通过重新插入来重新整理数据集合。

这种方法的代价是对这个 db 的读写操作会变得非常之慢,甚至会出现写操作丢失的情况。所以这个时候最好直接停掉客户端的写操作。

可以创建 bar.js 文件,写入如下代码:
  1. // Get a the current collection size.
  2. var storage = db.foo.storageSize();
  3. var total = db.foo.totalSize();

  4. print('Storage Size: ' + tojson(storage));

  5. print('TotalSize: ' + tojson(total));

  6. print('-----------------------');
  7. print('Running db.repairDatabase()');
  8. print('-----------------------');

  9. // Run repair
  10. db.repairDatabase()

  11. // Get new collection sizes.
  12. var storage_a = db.foo.storageSize();
  13. var total_a = db.foo.totalSize();

  14. print('Storage Size: ' + tojson(storage_a));
  15. print('TotalSize: ' + tojson(total_a));然后运行:

  16. $ mongo foo bar.js运行结果:

  17. MongoDB shell version: 1.6.4
  18. connecting to: foo
  19. Storage Size: 51351
  20. TotalSize: 79152
  21. -----------------------
  22. Running db.repairDatabase()
  23. -----------------------
  24. Storage Size: 40960
复制代码
TotalSize: 65153 2.如果应用可以接受,可以考虑使用capped collection
capped collection 是 MongoDB 中的一种特殊collection,它的大小可以限定,数据在这个限定大小内循环写入,在数据集合达到上限后,新数据会覆盖老的数据。这样磁盘上的空洞在一段时间后会自动消除。

参考资料:http://learnmongo.com/posts/compacting-mongodb-data-files/

事实上使用 replication 相关的功能也可以实现以上说的数据压缩,具体过程比较麻烦,还会涉及到客户端的切换等操作。有兴趣的同学可以自己研究一下。同时欢迎有更好的方法提供。

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP