レプリカセットの書込み保証 (write concern)
レプリカセットの書込み保証 (write concern) は、書込み (write) 操作が成功として返される前に書込み (write) 操作を確認する必要があるデータ保持ノード(プライマリおよびセカンダリであるが、アービタでない)の数を示します。ノードは、書込み (write) を正常に受信して適用した後にのみ、書込み (write) 操作を確認できます。
レプリカセットの場合:
w: "majority"
の書込み保証(write concern)は、書込み操作が、データを保持し投票権のあるノードの計算された過半数に永続的にコミットされたことの確認応答を要求します。 ほとんどのレプリカセット構成では、w: "majority"
はデフォルトの書込み保証(write concern) になります。w: 1
の書込み保証 (write concern) では、書込み保証 (write concern) の確認応答を返す前に、プライマリ レプリカセット ノードからの確認応答のみが必要です。1
より大きい数値の書込み保証 (write concern) の場合は、指定された値を満たすために必要なセカンダリの数だけプライマリからの確認応答が必要です。セカンダリは投票権を持つノードでなくても、書込み保証 (write concern) のしきい値を満たすことができます。指定された書込み保証 (write concern) の値は、レプリカセット内のデータを持つノードの総数を超えることはできません。
書込み (write) 確認応答についての詳細なドキュメントは、「確認応答動作」を参照してください。
書込み保証 (write concern) 確認応答を必要とする書込み (write) 操作を発行するアプリケーションは、プライマリが、指定された書込み保証 (write concern) に必要な数のノードから確認応答を受信するまで待機します。書込み保証 (write concern) の w
が 1 または w : "majority"
の場合、プライマリは、必要な数のセカンダリが書込み (write) を確認してから、書込み保証 (write concern) 確認応答を返します。w: 1
の書込み保証 (write concern) の場合は、プライマリは要求された書込み保証 (write concern) に貢献する資格があるため、ローカルで書込み (write) が適用されるとすぐに書込み保証 (write concern) 確認応答を返すことができます。
書込み (write) を確認するノードが多いほど、プライマリに障害が発生した場合に、書込まれたデータがロールバックされる可能性は低くなります。ただし、書込み保証 (write concern) を高く指定すると、クライアントは要求されたレベルの書込み保証 (write concern) 確認応答を受信するまで待機する必要があるため、レイテンシが増加する可能性があります。
特定の書込み (write) 操作に最適な書込み保証 (write concern) を選択するかどうかは、アプリケーションのパフォーマンス目標とデータ耐久性要件によって異なります。ロールバックを防止するための書込み保証 (write concern) の構成に関する詳細なガイダンスについては、「レプリカセットのロールバックの回避」を参照してください。
レプリカセットへの書込み (write) 操作の確認
次の操作には、insertOne()
メソッドの writeConcern
オプションが含まれています。この操作では、"majority"
書込み保証 (write concern)、および 5 秒のタイムアウトを指定します。
wtimeout
書込み保証 (write concern) パラメーターは、操作が無期限にブロックされないことを保証します。
db.products.insertOne( { item: "envelopes", qty : 100, type: "Clasp" }, { writeConcern: { w: "majority" , wtimeout: 5000 } } )
アプリケーションは、プライマリが書込み保証 (write concern) 確認応答を返すまで待機します。この応答は、データを保持する投票ノードの計算された過半数が書込み (write) 操作を確認したことを示します。たとえば、3 ノードのレプリカセット(P-S-S)では、操作には 3 つのノードのうち 2 つのノードからの確認応答が必要です。レプリカセットが後で拡張され、投票するセカンダリ ノードが 2 つ追加された場合、これと同じ操作に 5 つのレプリカセット ノードのうち 3 つからの確認応答が必要です。プライマリが wtimeout
制限内に書込み保証 (write concern) 確認応答を返さない場合、書込み (write) 操作は書込み保証 (write concern) エラーで失敗します。
指定された書込み保証 (write concern) を待機している間に書込み (write) 操作がタイムアウトになるのは、必要な数のレプリカセット ノードが wtimeout
時間内に書込み (write) 操作を確認しなかったことを示しているだけです。これは必ずしもプライマリが書込み (write) 込みを適用できなかったことを示すものではありません。データは、書込み保証 (write concern) エラー発生時にレプリカセット ノードのサブセットに存在している可能性があり、クラスター内のすべてのノードにそのデータが含まれるまで複製を続けることができます。アプリケーションでは、書込み保証 (write concern) 確認応答の状況にかかわらず、書込まれたデータが利用できる可能性があることを考慮する必要があります。
書込み保証 (write concern) を指定するための正確な構文は、書込み (write) 操作によって異なります。書込み保証 (write concern) のサポートと構文の手順については、書込み (write) 操作のマニュアルを参照してください。書込み保証 (write concern) に関する詳細なドキュメントについては、「書込み保証 (write concern)」を参照してください。
デフォルトの書込み保証 (write concern) の変更
setDefaultRWConcern
コマンドを発行すると、レプリカセットのデフォルトの書込み保証 (write concern) を変更できます。
特定の書込み保証 (write concern) を使用して書込み (write) 操作を発行すると、書込み (write) 操作はデフォルトではなく独自の書込み保証 (write concern) を使用します。
カスタムの書込み保証 (write concern)
レプリカセットのノードにタグ付けし、結果のタグセットを使用してカスタムの書込み保証 (write concern) を作成できます。タグセットを使用してカスタムの書込み保証 (write concern) を構成する方法については、「レプリカセットのタグセットの構成」を参照してください。