mongodb 存储
db.stats() {
"db" : "exemplum",
"collections" : 10,
"objects" : 110857,
"avgObjSize" : 239.9243349540399,
"dataSize" : 26597292,
"storageSize" : 43438080,
"numExtents" : 25,
"indexes" : 10,
"indexSize" : 4210640,
"fileSize" : 2666528768,
"nsSizeMB" : 16,
"dataFileVersion" : {
"major" : 4,
"minor" : 5
},
"extentFreeList" : {
"num" : 47,
"totalSize" : 2457366528
},
"ok" : 1
}
概念
storgaesize 是分类的存储来hold the doc 43438080 BYTE /1024/1024– 41M
filesize 是数据文件的大小。2666528768 — 2.48g
策略
收取的策略:是一旦分配了就不再回收,类似于“如果有人往里面放了1000亿条记录,那么还有可能再放入一次”。这个free space 被记录在extentFreeList,我们发现有2457366528 — 2.28g,这就是我们大部分的filesize 的所在。
我们能对这个extentfreelist做什么呢? 跑一下db.repairDatabase() 是最好的方法。这个操作会禁止数据的访问,所以不能够轻易地执行。因为当执行的时候,会对每一个collection来执行compact命令,这个命令的作用是将collection重写到一个新的collection,重建索引,然后交换回来。
执行以下。
exemplum/19:13:10>db.stats() {
"db" : "exemplum",
"collections" : 10,
"objects" : 110857,
"avgObjSize" : 239.9301442398766,
"dataSize" : 26597936,
"storageSize" : 41345024,
"numExtents" : 24,
"indexes" : 10,
"indexSize" : 3589264,
"fileSize" : 117440512,
"nsSizeMB" : 16,
"dataFileVersion" : {
"major" : 4,
"minor" : 5
},
"extentFreeList" : {
"num" : 0,
"totalSize" : 0
},
"ok" : 1
}
repairDatabase not working?
repairdatabase 有两个明显的缺点。
必须禁止访问数据库一段时间。如果是在线实例,很难接受。
需要同等的硬盘及2g plus。如果是因为磁盘慢了,清理磁盘则无法使用。
这里可以参考链接。提供了两种思路
使用compact。这里支持了原地来做,而不需要更多的空间。
通过path来做整个的repair。
Padding Power
padding 在2.6之前的设计是用padding factor, 计算公式是 storage size = record size * padding factor. 在2.6之后出现了另一种方式就是 power of 2 . 意思就是取2的倍数附近作为storage size。
最后。。。
可以通过构建capped collection 来防止空间占据过大。