1

設定したい

mongoClient.setWriteConcern(WriteConcern.REPLICAS_SAFE);

レプリカ セットが存在する場合のみ。

しかし、私が行うときのシャード環境では:

mongoClient.getReplicaSetStatus();

レプリカ セットがあっても null を返します。

mongo クライアントに mongos IP を渡しています。

4

2 に答える 2

1

ほとんどの MongoDB ドライバー、特に使用している Java ドライバーは、2 つ以上のノードから確認を取得できない場合に REPLICA_ACKNOWLEDGED writeConcern を設定しようとすると、例外をスローします。

ドキュメントから:

WriteConcern.REPLICA_ACKNOWLEDGED 2 つの別々のノードへの書き込みを試みます。[...] 意思
                                           2 回の書き込みが不可能な場合は、例外をスローします。

詳細については、次を参照してください。

mongo シェルを使用した私のテストでは、'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ても永久にハングするわけではありません。これは、レプリカ セットがあるが 2 つのノードが無期限に書き込みに使用できない場合にのみ発生します。

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 に答える