MongoDB:有一段时间我得到的文档比我使用哈希分片键插入的文档多。使用复合分片键不会发生这种情况

MongoDB: for a while I get more documents than I inserted using hashed shard keys. This don't happen using compounds shard keys

我在 Ubuntu 服务器 14.04 64 位操作系统上使用 MongoDB 3.2.15 和 python 以及 pymongo 驱动程序。 我使用批量方法插入的文档类似于以下内容:

{
   "_id" : ObjectId("59d7d59bf1566a1f541d42d5"),
   "monitor" : 5,
   "tiempo" : 1,
   "senial1" : {
                 "0" : 0.164844,
                 "1" : 0.325524
               }
   "senial2" : {
                 "0" : 0.569832,
                 "1" : 0.128563
               }
}

每个批量插入 100 个此类文档。当一个批量的执行结束时,另一个批量开始。执行 43200 个批处理,所以我总共插入了 4320000 个文档。

由于我使用的是分片集群作为测试,同样的过程执行两次。 我第一次为字段 id_ 使用散列分片键。 我第二次使用复合分片键,用于 monitortiempo 字段。

我的问题: 马上执行完43200个批量我用count()方法看是否所有的文件都插入正确了。当我使用复合分片键时,我得到了正确的结果:4320000 个文档。但是当我使用分片键散列时,结果是 4328872 个文档。几分钟后,我又开始使用 count() 方法,这次文档的数量是正确的。 为什么 'count' 方法计算的文档比我插入的文档多?为什么我对一种类型的密钥有此行为,而对另一种类型的密钥却没有?

非常感谢。

注意:我的集群有 2 个分片副本集。

与复合键相比,散列键分布更均匀,尤其是基数较低的键。

Balancer 在某个时候开始迁移块,因此在迁移期间您在两个分片上都有相同的文档。

https://docs.mongodb.com/manual/sharding/#sharding-strategy 和相关文档对幕后发生的事情有很好的解释。