mongoDB更新查询花费的时间太长

mongoDB更新查询花费的时间太长,mongodb,insert-update,Mongodb,Insert Update,我们有一个分片集群,包含4个mongos、3个config和两个分片(每个分片都有3个成员的副本集)。所有mongo实例都在版本3.2上 我们有一个及时的作业,每5分钟运行一次,在当前有1.5亿条记录的集合中增加(如果不存在,则插入;如果存在,则更新)大约16K条记录。该系列在过去几年中一直保持着,每天新的插入量约为20k 直到最后一天(昨天),这个更新过程只花了30-35秒。但现在观察到,此更新时间突然增加到大约110秒 我们使用以下方法跟踪原因,但无法找到根本原因- 配置服务器是同步的。(配

我们有一个分片集群,包含4个mongos、3个config和两个分片(每个分片都有3个成员的副本集)。所有mongo实例都在版本3.2上

我们有一个及时的作业,每5分钟运行一次,在当前有1.5亿条记录的集合中增加(如果不存在,则插入;如果存在,则更新)大约16K条记录。该系列在过去几年中一直保持着,每天新的插入量约为20k

直到最后一天(昨天),这个更新过程只花了30-35秒。但现在观察到,此更新时间突然增加到大约110秒

我们使用以下方法跟踪原因,但无法找到根本原因-

  • 配置服务器是同步的。(配置服务器上的db.runCommand('dbhash'))
  • 在此时间窗口中未添加/更改任何其他操作/作业
  • 未修改任何副本集或群集配置
  • 平衡器按预期取下并释放锁
  • 目标集合在两个碎片上的分布几乎相等(一个碎片上为7300万,另一个碎片上为7700万)
  • 所有linux设备上的平均负载低于1.0
  • 我们陷入困境,无法及时找到这次突然爆发的原因。非常感谢您的帮助

    插入并更新代码-

        //dataMap is a hashMap containing all parameters.
        UpdateOptions updateOptions = new UpdateOptions().upsert(true);
        Document updateObject = new Document("$setOnInsert",new Document("cat", dataMap.get("cat"))
                                .append("$set", new Document("timeStamp",dataMap.get("timeStamp"))));
        Document query = new Document("host",dataMap.get("host"));                              
        query.append("timeStamp",dataMap.get(timeStamp));
        // collectionObject below is object of MongoCollection<Document>
        collectionObject.updateOne(query, updateObject, updateOptions);
    
    //dataMap是包含所有参数的哈希映射。
    UpdateOptions UpdateOptions=new UpdateOptions().upsert(true);
    文档更新对象=新文档($setOnInsert),新文档(“cat”,dataMap.get(“cat”))
    .append($set),新文档(“timeStamp”,dataMap.get(“timeStamp”);
    文档查询=新文档(“主机”,dataMap.get(“主机”);
    append(“timeStamp”,dataMap.get(timeStamp));
    //下面的collectionObject是MongoCollection的对象
    collectionObject.updateOne(查询、updateObject、updateOptions);
    
    感谢和问候

    维巴夫


    PS-如果有人选择否决这个问题,请在评论中说明原因。

    我们能看到插入/更新代码吗?@Trey请找到上面的代码。谢谢,不幸的是,我没有看到原因,Mongo的重量级人物将不得不接受这个问题!