(1)碎片的产生
1、db.collection.insert() 不断插入数据,扩展新的block,文件大小不断增大
2、db.collection.remove() 从集合中删除部分数据,很多block变成free,但物理空间并没有回收
3、db.runCommand({compact:"collection"}) 对集合执行compact,可以立即整理free的碎片空间
(2)compact操作对读写的影响
compact 一个集合,会加集合所在DB的互斥写锁,会导致该DB上所有的读写请求都阻塞;因为 compact 执行的时间可能很长,跟集合的数据量相关,所以强烈建议在业务低峰期执行,避免影响业务。
MongoDB 里删除一个集合里所有文档,有两种方式:
(1)db.collection.remove({}, {multi: true}),逐个文档从 btree 里删除,最后所有文档被删除,但文件物理空间不会被回收
(2)db.collection.drop() 删除集合的物理文件,空间立即被回收
总的来说,remove 会产生逻辑的空闲空间,这些空间能立即用于写入新数据,但文件占用的总物理空间不会立即回收;通常只要持续在写入数据,有物理空间碎片问题并不大,不需要去 compact 集合,有的场景,remove 了大量的数据后,后续的写入可能并不多,这时如果想回收空间,就需要显式的调用 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 的必要。
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.
> use ucloud # 批量插入数据 > for (var i = 1; i <= 1000000; i++) { db.starcto.insert( { x : i , name: "A", name1:"B", name2:"C", name3:"D"} ) } > db.starcto.count() 1000000 # 删除文档中记录 > for (var i = 1; i <= 500000; i++) { db.starcto.remove( { "name": "A"} ) } # 查看 starcto文档 当前可以回收空间 > db.starcto.stats().wiredTiger["block-manager"]["file bytes available for reuse"] 26173440
# 清理单点MongoDB节点碎片 > use db1 > db.runCommand({compact: "collection1"}) # 在副本集primary上执行需要加 force 选项 > use ucloud > db.runCommand({compact: "starcto", force: true}) { "ok" : 1 } # 查看空间释放情况(26173440 —> 4096) > db.starcto.stats().wiredTiger["block-manager"]["file bytes available for reuse"] 4096
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/128168.html
摘要:摘要操作步骤很多,但是可以有效减少磁盘使用量。关于操作,我列了几个简单的。操作效果怎么样减少了接近的磁盘空间,这个大小应该与被删除的文档数量有关。操作步骤由于操作会阻塞的读写操作,因此应该对每个节点依次进行操作。 摘要: compact操作步骤很多,但是可以有效减少磁盘使用量。 showImg(https://segmentfault.com/img/bV5PFN?w=800&h=45...
摘要:是目前的实验收集器。也是需要暂停程序一切的工作,然后多线程执行垃圾回收。与最大的不同,它关注的是垃圾回收的吞吐量。这里的吞吐量指的是总时间与垃圾回收时间的比例。筛选回收,评估标记垃圾,根据模式回收垃圾。 《对象搜索算法与回收算法》介绍了垃圾回收的基础算法,相当于垃圾回收的方法论。接下来就详细看看垃圾回收的具体实现。 上文提到过现代的商用虚拟机的都是采用分代收集的,不同的区域用不同的收集...
摘要:复制这一工作所花费的时间,在对象存活率达到一定程度时,将会变的不可忽视。针对老年代老年代的特点是区域较大,对像存活率高。这种情况,存在大量存活率高的对像,复制算法明显变得不合适。 GC(Garbage Collection)即Java垃圾回收机制,是Java与C++的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C++程序...
垃圾回收(GC)是JVM的一大杀器,它使程序员可以更高效地专注于程序的开发设计,而不用过多地考虑对象的创建销毁等操作。但是这并不是说程序员不需要了解GC。GC只是Java编程中一项自动化工具,任何一个工具都有它适用的范围,当超出它的范围的时候,可能它将不是那么自动,而是需要人工去了解与适应地适用。 拥有一定工作年限的程序员,在工作期间肯定会经常碰到像内存溢出、内存泄露、高并发的场景。这时候在应对这...
摘要:新生代的对象为存活时间较短的对象,老生代中的对象为存活时间较长或常驻内存的对象。分别对新生代和老生代使用不同的垃圾回收算法来提升垃圾回收的效率。如果指向老生代我们就不必考虑它了。 这篇文章的所有内容均来自 朴灵的《深入浅出Node.js》及A tour of V8:Garbage Collection,后者还有中文翻译版V8 之旅: 垃圾回收器,我在这里只是做了个记录和结合 垃圾回收...
阅读 1283·2024-02-01 10:43
阅读 368·2024-01-31 14:58
阅读 432·2024-01-31 14:54
阅读 815·2024-01-29 17:11
阅读 2202·2024-01-25 14:55
阅读 1481·2023-06-02 13:36
阅读 2083·2023-05-23 10:26
阅读 469·2023-05-23 10:25