db.collection.count()为MongoDB中的分片集合返回了更多文档

Ale*_*x P 5 sharding mongodb

我有2个带有复制集的分片(每个3个实例).当我count()对分片集合进行处理时,我得到的内容远远超过实际数量的文档(超过250万个文档的差异).我只是find()forEach()循环中递增计数器时也一样.

我怎么知道真实的文件数量?首先,我知道增长的趋势,即它不能如此急剧增加.其次,当我使用以下M/R脚本计算文档时,我得到了真实数量的文档(我假设).我用这个脚本来查看重复的文档.重复数量是几千甚至几百万.test_duplicate_collection减去重复数的计数给了我真实数量的文件.

var map = function(){
   emit(this.doc_id, 1);
};

var reduce = function(key, values){
   var result = 0;
   values.forEach(function(value) {
     result += value;
   });

   return result;
};

db.test_collection.mapReduce(map, reduce, "test_duplicate_collection",null );
Run Code Online (Sandbox Code Playgroud)

现在,我知道在平衡期间,可能会发生一些块在将其转移到另一个分片时尚未删除的情况.但我在status(sh.status())中看到所有块都是平均分布的.我也尝试暂停写操作以查看是否需要一些时间,但什么都没发生.

您可能会说删除已移动的块仍在继续,实际上当我刚开始使用分片时,我看到了分片收集的轻微减少(没有写入操作).但目前,随着时间的推移没有变化,它只是停滞不前.我还试图使用orphanage.js希望找到孤立的文档(使用https://groups.google.com/forum/#!topic/mongodb-user/OKH5_KDO04I中的脚本),但是没有找到这样的文档.

我的问题是,可能是什么原因,count()find().forEach()提供超过实际数量的文件(即对M/R脚本).

感谢您的帮助.

EDIT1

在其中一个分片中配置复制集时出现问题.具体而言,配置文件中未设置任何主服务器.在MMS仪表板中,而不是Primary我总是看到Slave由其他复制主机监听的主机.当我们修复它时,forEach循环计数开始显示与上面的M/R脚本中相同数量的文档.所以目前唯一的问题就是count()它本身.

在MongoDB JIRA中,我在分片环境中发现了以下未解决的count()错误问题https://jira.mongodb.org/browse/SERVER-3645 但它确实与平衡期间的count()有关,即count可能计算当前的块数由平衡器移动.作为一种解决方法,这个bug建议将查询始终保持为真.我也尝试了但仍然像以前一样返回计数.

eri*_*ric -1

尝试使用较慢的(但显然更准确).itcount()