首页 > 解决方案 > MongoDB retryWrites=true 不适用于 3.6+ 版本

问题描述

我已经阅读了https://docs.mongodb.com/manual/core/retryable-writes/并设置了所有必需的属性以使其工作,但到目前为止还没有运气。

有 3 个成员副本,当程序运行以插入记录时,我杀死了主节点,而当新主节点的选举发生时,我的代码中发生了循环,并且这些记录在新成员被选举后不会重试写入。

本地 MongoDB 版本

``
mongo --version
MongoDB shell version v3.6.6
git version: 6405d65b1d6432e138b44c13085d0c2fe235d6bd
OpenSSL version: OpenSSL 1.1.0h  27 Mar 2018
allocator: system
modules: enterprise 
build environment:
    distarch: x86_64
    target_arch: x86_64
``

Mongo Java 驱动程序

``compile group: 'org.mongodb', name: 'mongodb-driver', version: '3.6.4'
compile group: 'org.mongodb', name: 'mongodb-driver-core', version: '3.6.4'
compile group: 'org.mongodb', name: 'bson', version: '3.6.4'``

Mongo 连接字符串

``dbUri = "mongodb://localhost:28000,localhost:28001,localhost:28002/test?replicaSet=rs01&retryWrites=true&w=2";``

使用 MongoClient 创建连接

MongoClient mongoClient = new MongoClient(new MongoClientURI(dbUri));

insert 正在使用 insertOne,如下所示

``


private static void insertData(MongoClient mongoClient) {
        MongoDatabase db = mongoClient.getDatabase("test");
        MongoCollection<Document> collection = db.getCollection("customer");
//      collection.withWriteConcern(WriteConcern.W2);

        deleteOldDocumets(collection);
        int customerId = 0;

        while (customerId < 1000) {

            ++customerId;
            try {
                Document document = new Document();
                document.put("name", "user" + customerId);
                document.put("age", customerId);
                collection.insertOne(document);

                logger.info("Customer : " + customerId + "  Time is : "
                        + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")));
                Thread.sleep(10);
            } catch (Exception e) {
                logger.info("Primary connection closed, starting election in 5 secs");
            }
        }
        mongoClient.close();
    }``

### DB master props ###

``MongoDB Enterprise rs01:PRIMARY> db.isMaster();
{
    "hosts" : [
        "localhost:28000",
        "localhost:28001",
        "localhost:28002"
    ],
    "setName" : "rs01",
    "setVersion" : 1,
    "ismaster" : true,
    "secondary" : false,
    "primary" : "localhost:28000",
    "me" : "localhost:28000",
    "electionId" : ObjectId("7fffffff0000000000000001"),
    "lastWrite" : {
        "opTime" : {
            "ts" : Timestamp(1540647424, 1),
            "t" : NumberLong(1)
        },
        "lastWriteDate" : ISODate("2018-10-27T13:37:04Z"),
        "majorityOpTime" : {
            "ts" : Timestamp(1540647424, 1),
            "t" : NumberLong(1)
        },
        "majorityWriteDate" : ISODate("2018-10-27T13:37:04Z")
    },
    "maxBsonObjectSize" : 16777216,
    "maxMessageSizeBytes" : 48000000,
    "maxWriteBatchSize" : 100000,
    "localTime" : ISODate("2018-10-27T13:37:10.713Z"),
    "logicalSessionTimeoutMinutes" : 30,
    "minWireVersion" : 0,
    "maxWireVersion" : 6,
    "readOnly" : false,
    "ok" : 1,
    "operationTime" : Timestamp(1540647424, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1540647424, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
``

非常感谢任何线索。

标签: javamongodbreplicaset

解决方案


我对 java 驱动程序 3.6.3 有同样的问题,我的解决方案是将驱动程序版本升级到 3.8.2。另请检查此错误修复: https ://jira.mongodb.org/browse/JAVA-2859?jql=project%20%3D%20JAVA%20AND%20issuetype%20%3D%20Bug%20AND%20fixVersion%20%3D %203.7.1%20ORDER%20BY%20priority%20DESC


推荐阅读