• 压缩 MongoDB 的数据文件


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

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

    1.通过 repairDatabase 整理数据文件

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

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

    可以创建 bar.js 文件,写入如下代码:

    // Get a the current collection size.
    var storage = db.foo.storageSize();
    var total = db.foo.totalSize();
    
    print('Storage Size: ' + tojson(storage));
    
    print('TotalSize: ' + tojson(total));
    
    print('-----------------------');
    print('Running db.repairDatabase()');
    print('-----------------------');
    
    // Run repair
    db.repairDatabase()
    
    // Get new collection sizes.
    var storage_a = db.foo.storageSize();
    var total_a = db.foo.totalSize();
    
    print('Storage Size: ' + tojson(storage_a));
    print('TotalSize: ' + tojson(total_a));

    然后运行:

    $ mongo foo bar.js

    运行结果:

    MongoDB shell version: 1.6.4
    connecting to: foo
    Storage Size: 51351
    TotalSize: 79152
    -----------------------
    Running db.repairDatabase()
    -----------------------
    Storage Size: 40960
    TotalSize: 65153

    2.如果应用可以接受,可以考虑使用capped collection

    capped collection 是 MongoDB 中的一种特殊collection,它的大小可以限定,数据在这个限定大小内循环写入,在数据集合达到上限后,新数据会覆盖老的数据。这样磁盘上的空洞在一段时间后会自动消除。

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

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

    文章转自:http://blog.nosqlfan.com/html/1062.html

  • 相关阅读:
    Python Generators vs Iterators
    python staticmethod classmethod
    静态类型、动态类型、强类型以及弱类型语言
    Python串行运算、并行运算、多线程、多进程对比实验
    python字典根据value排序
    解读Python内存管理机制
    两个list 求交集效率对比
    Python error: Unable to find vcvarsall.bat
    max-length兼容ie
    return false 与return true 困惑
  • 原文地址:https://www.cnblogs.com/likehua/p/3700674.html
Copyright © 2020-2023  润新知