本文共 1411 字,大约阅读时间需要 4 分钟。
今天接到一个用户反馈的问题,sharding集群,使用wiredtiger引擎,某个DB下集合全部用的hash分片,show dbs
发现其中一个shard里该DB的大小,跟其他的集合差别很大,其他基本在60G左右,而这个shard在200G左右?
由于这个DB下有大量的集合及索引,一眼也看不出问题,写了个脚本分析了一下,得到如下结论
从shard0上能找到大量 moveChunk 的记录,猜测应该是集合的数据在没有开启分片的情况下写到shard0了,然后开启分片后,从shard0迁移到其他shard了,跟用户确认的确有一批集合是最开始没有分片。
所以这个问题就转换成了,为什么复制集里集合的逻辑空间与物理空间不一致?即collection stat 里 size
与 storageSize
的区别。
mymongo:PRIMARY> db.coll.stats(){ "ns" : "test.coll", "size" : 30526664, "count" : 500808, "avgObjSize" : 33, "storageSize" : 19521536, "capped" : false, ....}
逻辑存储空间与物理存储空间有差距的主要原因
而上述case里,集合数据先分到一个shard,然后启用分片后,迁移一部分到其他shard,就是一个典型的产生大量存储碎片的例子。存储碎片对服务通常影响不大,但如果因为空间不够用了需要回收,如何去强制的回收这些碎片空间?
2017-08-03 15:42:04 update
关于 compact操作,有同学问道,
mongdb中由于删除了大量的数据,但是没有释放磁盘空间给系统,想通过compact命令来释放磁盘空间;但是对compact命令有几个疑问
转载地址:http://kvebm.baihongyu.com/