簡體   English   中英

MongoDB寫入問題:不同的DB顯示相同文檔的計數不同

[英]MongoDB Write Issue: Different DBs showing different count for same documents

我正在嘗試在MongoDB的2個數據庫中批量插入不同集合中的某些文檔。

MongoClient mongoClient2 = this.getMongoClient();
MongoDatabase currentDB = mongoClient2.getDatabase(splits[0]);
MongoCollection<Document> currentCollectionNew = currentDB.getCollection(splits[1])
                        .withWriteConcern(WriteConcern.MAJORITY.withJournal(true))
                        .withReadConcern(ReadConcern.MAJORITY);

BulkWriteOptions bulkWriteOptions = new BulkWriteOptions();
bulkWriteOptions.ordered(true);
bulkWriteOptions.bypassDocumentValidation(true);
try {
     BulkWriteResult bulkWriteResult = urrentCollectionNew.bulkWrite(listDoc,
                            bulkWriteOptions);

   logger.info("bulkWriteResult inserted count in MAIN: " + bulkWriteResult.getInsertedCount());
   logger.info("bulkWriteResult modified count  in MAIN: " + bulkWriteResult.getModifiedCount());
   logger.info("bulkWriteResult matched count in MAIN : " + bulkWriteResult.getMatchedCount());
   logger.info("bulkWriteResult deleted count in MAIN : " + bulkWriteResult.getDeletedCount());
    logger.info("bulkWriteResult upserted count in MAIN : " + bulkWriteResult.getUpserts().size());
    logger.info("bulkWriteResult was acknowledged in MAIN : " + bulkWriteResult.wasAcknowledged());

    mongoClient2.close()
 } catch (Exception e) {
    logger.warn("Error in bulkWriting main DB: {} ", e.getMessage());
    logger.error(e.getMessage(), e);
                }

    MongoCollection<Document> mongoStageCollection = objFactory.getCollectionObject(resourceType, true);
    String[] splitsStage = mongoStageCollection.getNamespace().getFullName().split("\\.");
    MongoClient mongoClient3 = this.getMongoClient();
    MongoDatabase newStageDB = mongoClient3.getDatabase(splitsStage[0]);
    MongoCollection<Document> stageCollectionNew = newStageDB.getCollection(splitsStage[1])
                        .withWriteConcern(WriteConcern.MAJORITY.withJournal(true))
    .withReadConcern(ReadConcern.MAJORITY);

    logger.info("mongoStageCollection.getWriteConcern(): {} ", mongoStageCollection.getWriteConcern());
    logger.info("mongoStageCollection.getReadConcern(): {} ",
      mongoStageCollection.getReadConcern().toString());
    logger.info("mongoStageCollection.getReadPreference(): {}",
                        mongoStageCollection.getReadPreference().getName());

    try {
          BulkWriteResult bulkWriteResult = stageCollectionNew.bulkWrite(listDoc, bulkWriteOptions);

          logger.info("bulkWriteResult inserted count in STAGING: " + bulkWriteResult.getInsertedCount());
          logger.info("bulkWriteResult modified count  in STAGING: " + bulkWriteResult.getModifiedCount());
           logger.info("bulkWriteResult matched count in STAGING: " + bulkWriteResult.getMatchedCount());
           logger.info("bulkWriteResult deleted count in STAGING: " + bulkWriteResult.getDeletedCount());
           logger.info("bulkWriteResult upserted count in STAGING: " + bulkWriteResult.getUpserts().size());
           logger.info("bulkWriteResult was acknowledged in STAGING: " + bulkWriteResult.wasAcknowledged());
          mongoClient3.close();
                } catch (Exception e) {
                    logger.warn("Error in bulkWriting STAGING DB: {} ", e.getMessage());
                    logger.error(e.getMessage(), e);
                }

例如2個DB是FHIR和FHIR_Stage。 在兩個數據庫中都創建了相同的集合。 FHIR.Condition和FHIR_STAGE.Condition

FHIR.Observation和FHIR_STAGE.Observation

等等...

FHIR應該具有所有數據,而FHIR_Stage應該僅具有增量數據。 但是,在初始加載中,兩個DB都應包含完全相同的數據。

我看到的是這兩個數據庫中的集合計數不匹配,即FHIR.Condition與FHIR_STAGE.Condition中的計數不相同

這里的問題是這種不匹配是隨機發生的,即有時匹配,有時不匹配(當我清理所有內容並重新運行初始負載時),並且這兩個數據庫中的不同Collection都會發生這種情況。 而且它沒有模式,隨機地有些收集計數將不匹配,有時一切都將匹配。

一個星期以來,我無法解決這個問題。 任何幫助是極大的贊賞。

MongoDB設置:

我們有一個3節點(VM)集群。 我們有3個分片正在運行,每個分片都是3個成員副本集。 每個節點都是其中一個副本集的主節點。

使用x509證書保護群集。

我在sh.status()或rs.status()中都沒有看到錯誤。 也沒有復制滯后。

數據庫和集合是根據某些業務邏輯從Java代碼動態創建的。 而且,我還將在數據庫上啟用分片,然后在代碼中啟用分片。

WriteConcern-多數

ReadPreference-主

ReadConcern-多數

Mongo版本:3.4.15 Mongo Java驅動程序:3.4.2

僅供參考-相同的代碼庫可以在獨立的MongoDB上正常工作。

謝謝您的期待。

如果需要,我很樂意分享更多信息。

聚苯乙烯

如果有什么不同,寫入MongoDB的過程就是Kafka使用者

發布此消息幾天后,我們發現了這個問題-

我們是分片的MongoDB集群。

這是因為我們沒有使用聚合管道中的count()函數,而是依賴db.collectionName.count()

轉向聚合管道,我們可以在兩個數據庫中看到相同的文檔。

參考指出了這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM