zoukankan      html  css  js  c++  java
  • Mongo分区后分片下count记录不准确

    问题描述

    image

    问题如图,后来上网查了一下,发现了这是正常现象:

    官方文档解释了这种现象的原因以及解决方法:

    不准确的原因:

    • 操作的是分片的集合(前提);
    • shard分片正在做块迁移,导致有重复数据出现
    • 存在孤立文档(因为不正常关机、块迁移失败等原因导致)

    1、count和aggregate的不同:在mongoDB中,count和aggregate是在两支不同的程序中实现的,aggregate的实现是考虑到了shard的环境的,所以官方文档是推荐使用aggregate来进行shard环境下的count。
    2、MongoDB shell下使用aggregate和使用Java MongoDB驱动使用aggregate来进行count,结果应该是一样的,因为两者都是使用的aggregate。
    您提到Issue大概是MongoDB shell和Java MongoDB驱动进行count的结果不一致。
    这种不一致,我觉得可能是:
    1)比较的过程有没有纰漏;
    2)所用的Java MongoDB驱动是否有纰漏。

    解决方法

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

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

    java代码:

    DBObject groupFields = new BasicDBObject("_id", null);
    groupFields.put("count", new BasicDBObject("$sum", 1));
    BasicDBObject group = new BasicDBObject("$group", groupFields);
    List<BasicDBObject> aggreList = new ArrayList<BasicDBObject>();
    aggreList.add(group);
    AggregateIterable<Document> output = collection.aggregate(aggreList);

    做了聚合发现好慢,其次好像数据还是对不上

     

    刚用mongo这玩意儿,发现还是有好多坑要趟~

    发现在mongos客户端下,用聚合查询查出来是准确的,count在分片的时候是真的不适用;另一个情况还要考虑java客户端在分片时候的使用。

    孤立文档

    Reference

    https://www.jianshu.com/p/c0a351927e69

  • 相关阅读:
    通用Logging框架设计
    slf4j 与各个 logging框架的适配器说明
    优雅的使用Spring
    Python : 反射
    Python: Tools
    Python : Class
    Python : Module
    Python 入门:基本语法
    docker:版本变更
    Linux: yum配置说明
  • 原文地址:https://www.cnblogs.com/tuhooo/p/9726294.html
Copyright © 2011-2022 走看看