mongodb 存储

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 来防止空间占据过大。

    原文作者:ddongjian0000
    原文地址: https://segmentfault.com/a/1190000003858918
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞