如何从JAVA客户端了解分片环境中副本集的存在

时间:2013-10-29 05:33:07

标签: mongodb mongo-java

我想设置

mongoClient.setWriteConcern(WriteConcern.REPLICAS_SAFE);

仅当副本集存在时才会出现。

但在我做的时候在分片环境中:

mongoClient.getReplicaSetStatus();

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

对于mongo客户端我传递了mongos IP。

2 个答案:

答案 0 :(得分:1)

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

来自文档:

WriteConcern.REPLICA_ACKNOWLEDGED          Tries to write to two separate nodes. [...] will
                                           throw an exception if two writes are not possible.

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

在我使用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
}

答案 1 :(得分:0)

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

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

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

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