設定したい
mongoClient.setWriteConcern(WriteConcern.REPLICAS_SAFE);
レプリカ セットが存在する場合のみ。
しかし、私が行うときのシャード環境では:
mongoClient.getReplicaSetStatus();
レプリカ セットがあっても null を返します。
mongo クライアントに mongos IP を渡しています。
設定したい
mongoClient.setWriteConcern(WriteConcern.REPLICAS_SAFE);
レプリカ セットが存在する場合のみ。
しかし、私が行うときのシャード環境では:
mongoClient.getReplicaSetStatus();
レプリカ セットがあっても null を返します。
mongo クライアントに mongos IP を渡しています。
ほとんどの 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
}