背景:

         背景 一般来说,除了由于secondary延迟可能造成查询secondary节点数据不准以外,关于count的准确性问题,详情请见:https://developer.aliyun.com/article/704434

 

一、现象:db.collection.count()不准确:

         MongoDB在分片后的集合上进行db.collection.count()操作时,出现结果不准确的现象,需要采用聚合的方法获取集合的count结果,在使用MongoDB-Java客户端做简单的插入操作(10W条)以后,使用Studio 3T查看插入结果时,发现显示的count结果与插入的数据不一致,偶然会多出几条或十几条,插入操作很简单,其中table3被分片

 

发现问题后,通过在shell里面查询count,命令如下

db.table3.count()

 

二、原因:

  1. 操作的是分片的集合(前提);

  2. shard分片正在做块迁移,导致有重复数据出现;

  3. 存在孤立文档(因为不正常关机、块迁移失败等原因导致);

 

三、解决方法:

       使用聚合aggregate的方式查询count数量,shell命令如下:

db.collection.aggregate(
   [
      { $group: { _id: null, count: { $sum: 1 } } }
   ]
)

 

  1. 同时追求效率和准确性,可以设置负载均衡窗口,在窗口以外禁止move chunk

  2. 强调数据准确性的场景,使用db.collection.aggregate()方法代替count

  3. 针对带谓词条件的count操作,将mongo版本升级到4.0以上

  4. 针对出现大量孤立文档的情况,做孤立文档清理

 

 

 

 

 

 

 

 

##############################################################