zoukankan      html  css  js  c++  java
  • MongoDB compact 命令详解

    为什么需要 compact

    一图胜千言

    1

    remove 与 drop 的区别

    MongoDB 里删除一个集合里所有文档,有两种方式

    • db.collection.remove({}, {multi: true}),逐个文档从 btree 里删除,最后所有文档被删除,但文件物理空间不会被回收
    • db.collection.drop() 删除集合的物理文件,空间立即被回收

    总的来说,remove 会产生逻辑的空闲空间,这些空间能立即用于写入新数据,但文件占用的总物理空间不会立即回收;通常只要持续在写入数据,有物理空间碎片问题并不大,不需要去 compact 集合,有的场景,remove 了大量的数据后,后续的写入可能并不多,这时如果想回收空间,就需要显式的调用 compact。

    compact 命令对读写的影响

    compact 一个集合,会加集合所在DB的互斥写锁,会导致该DB上所有的读写请求都阻塞;因为 compact 执行的时间可能很长,跟集合的数据量相关,所以强烈建议在业务低峰期执行,避免影响业务。

    compact 具体做了什么?

    Compact 动作最终由存储引擎 WiredTiger 完成,WiredTiger 在执行 compact 时,会不断将集合文件后面的数据往前面空闲的空间写,然后逐步 truancate 文件回收物理空间。每一轮 compact 前,WT 都会先检查是否符合 comapact 条件。

    1. 前面80%的空间里,是否有20%的空闲空间,用于写入文件后面20%的数据,或者
    2. 前面90%的空间里,是否有10%的空闲空间,用于写入文件后面10%的数据

    如果上面都不满足,说明执行compact肯定无法回收10%的物理空间,此时 compact 就回退出。所以有时候遇到对一个大集合进行 compact,compact立马就返回ok,集合的物理空间也没有变化,就是因为 WiredTiger 认为这个集合没有 compact 的必要。

    如何预估compact能回收多少空间?

    The amount of empty space available for reuse by WiredTiger is reflected in the output of db.collection.stats() under the heading wiredTiger.block-manager.file bytes available for reuse.

    mymongo:PRIMARY> db.coll.stats().wiredTiger["block-manager"]["file bytes available for reuse"]
    5033984   
    

    执行 compact

    执行前请确保你已经读懂了上面的内容,知道compact命令的原理、影响

    // compact somedb.somecollection
     use somedb
     db.runCommnd({compact: "somecollection"})
    
     // compact oplog,在副本集primary上执行需要加 force 选项
     use local
     db.runCommnd({compact: "somecollection", force: true})
    

    参考资料

    作者简介

    张友东,阿里云高级技术专家,主要关注分布式存储与数据库等技术领域,先后参与淘宝分布式文件系统TFS、阿里云数据库(PolarDB、MySQL、MongoDB、Redis)等项目的开发工作,致力于让开发者用上最好的云数据库服务。

  • 相关阅读:
    微信开发 之 开启开发模式
    微信公众号开发 之 编辑模式使用
    分析各种Android设备屏幕分辨率与适配
    【面向对象设计模式】 适配器模式 (二)
    重构 之 总结代码的坏味道 Bad Smell (一) 重复代码 过长函数 过大的类 过长参数列 发散式变化 霰弹式修改
    【Android 应用开发】Android资源文件
    java 创建并写入文件
    隐藏 HttpClient 在console的日志
    HOW TO CHANGE THE DEFAULT KEY-VALUE SEPARATOR OF A MAPREDUCE JOB
    java 时间戳转换
  • 原文地址:https://www.cnblogs.com/xibuhaohao/p/12395848.html
Copyright © 2011-2022 走看看