compact检测机制:
compact命令发出后,其实终是由存储引擎wiredTiger来完成,在执行期间,会不断将集合文件后面的数据往前面空闲的空间写,然后逐步truncate文件回收物理空间;每一轮compact前,WiredTiger都会做如下检查:
- 前面80%的空间里,是否有20%的空闲空间,用于写入文件后面的20%的数据,或
- 前面90%的空间里,是否有10%的空闲空间,用于写入文件后面的10%的数据;
如果上述两条一条都不满足,那么执行compact肯定无法回收10%的空闲空间,此时compact就会退出执行,所以有时候对一个大集合执行了compact后很快得到ok:1,且集合空间变化不大, 那么说明此集合可能没有收缩的余地,没有必要执行compact
预估可回收空间
可通过命令db.collname.stats().wiredTiger["block-manager"] 查看
rs1:PRIMARY> db.MsgResultDto.stats().wiredTiger["block-manager"]
{
"allocations requiring file extension" : 0,
"blocks allocated" : 8559169,
"blocks freed" : 3750452,
"checkpoint size" : 99337433088,
"file allocation unit size" : 4096,
"file bytes available for reuse" : 31563096064, ---表示集合可被回收的空闲空间
"file magic number" : 120897,
"file major version number" : 1,
"file size in bytes" : 130900664320,
"minor version number" : 0
}