1

我想设置

mongoClient.setWriteConcern(WriteConcern.REPLICAS_SAFE);

仅当存在副本集时。

但是当我这样做时,在分片环境中:

mongoClient.getReplicaSetStatus();

即使我有副本集,它也会返回 null。

对于 mongo 客户端,我正在传递 mongos IP。

4

2 回答 2

1

如果您在无法从两个或更多节点获得确认时尝试设置 REPLICA_ACKNOWLEDGED writeConcern,大多数 MongoDB 驱动程序,特别是您正在使用的 Java 驱动程序将引发异常。

从文档:

WriteConcern.REPLICA_ACKNOWLEDGED 尝试写入两个单独的节点。[...] 将要
                                           如果无法进行两次写入,则抛出异常。

有关详细信息,请参阅以下内容:

在我使用 mongo shell 进行的测试中,如果您向“getlasterror”命令提供 REPLICA_ACKNOWLEDGED(以前称为 REPLICA_SAFE)问题,那么当您不与副本集通信时,您将收到错误消息。与进程交谈时mongos,错误将是:

{
    "singleShard" : "localhost:30001",
    "n" : 0,
    "connectionId" : 3,
    "wnote" : "no replication has been enabled, so w=2.0 won't work",
    "err" : "norepl",
    "ok" : 1
}

客户端不会在没有wtimeout指定的情况下永远挂起,只有在存在副本集但两个节点不能无限期地写入时才会出现这种情况。

请注意,使用“多数”作为w写入关注的值正常工作mongos- 请注意 writeConcern 响应的差异:

mongos> db.coll.insert({}); db.runCommand({getlasterror:1,w:"majority"})
{
    "singleShard" : "localhost:30001",
    "n" : 0,
    "connectionId" : 3,
    "err" : null,
    "ok" : 1
}
于 2013-10-29T15:47:06.880 回答
0

首先使用 mongo shell 命令验证您的副本集是否具有 PRIMARYrs.status()

然后,如果可行,请验证您是否正确连接到数据库:

MongoClient mongoClient = new MongoClient( "hostname" , 27017 );

如果这两个都是真的,那么应该没有理由mongoClient.getReplicaSetStatus()返回 NULL。它应该返回一个ReplicaSetStatus对象。

于 2013-10-29T06:05:28.673 回答