mongo 的逻辑存储和物理存储
逻辑存储空间与物理存储空间有差距的主要原因
- 存储引擎存储时,需要记录一些额外的元数据信息,这会导致物理空间总和比逻辑空间略大
- 存储引擎可能支持数据压缩,逻辑的数据块存储到磁盘时,经过压缩可能比逻辑数据小很多了(具体要看数据的特性,极端情况下压缩后数据变大也是有可能的)
- 引擎对删除空间的处理,很多存储引擎在删除数据时,考虑到效率,都不会立即去挪动数据回收删除的存储空间,这样可能导致删除很多文档后,逻辑空间变小,但物理空间并没有变小。如下图所示,灰色的文档删除表示被删除。删除的空间产生很多存储碎片,这些碎片空间不会立即被回收,但有新文档写入时,可以立即被复用。
而上述case里,集合数据先分到一个shard,然后启用分片后,迁移一部分到其他shard,就是一个典型的产生大量存储碎片的例子。存储碎片对服务通常影响不大,但如果因为空间不够用了需要回收,如何去强制的回收这些碎片空间?
- 数据清理掉重新加入复制集同步数据,或者直接执行resync命令 (确保有还有其他的数据备份)
- 对集合调用 compact 命令
转自:http://www.mongoing.com/archives/4635
在对mongo的collection做删除操作,产生空洞文件,58的分析及实例如下链接:
http://www.infoq.com/cn/articles/app-practice-of-mongodb-in-58-ten-billion-scale-data
(备注:其实58的对mongo删除数据的实战中,降级节点——》删除数据文件——》同步数据等一系列的操作,我司早在4年前也这么使用过,效果还不错。)