因果整合性と、読み取り保証(read concern)および書込み保証(write concern)
MongoDB の因果関係がコンシステントなクライアント セッションでは、読み取り保証 (read concern) と書込み保証 (write concern) の異なる組み合わせによって、さまざまな因果整合性の保証 が提供されます。
次の表は、さまざまな組み合わせによって提供される具体的な保証を示しています。
読み取り保証(read concern) | 書込み保証 (write concern) | 自分の書込み (write) 操作の結果を読み取る | 単調な読み取り | 単調書込み | 書込み操作の前に読み取り操作をする |
---|---|---|---|---|---|
✅ | ✅ | ✅ | ✅ | ||
✅ | ✅ | ||||
✅ |
データの耐久性と因果整合性が必要な場合は、表からわかるように、"majority"
読み取り保証 (read concern) のある読み取り操作と、"majority"
書込み保証 (write concern) のある書き込み操作のみが、4 つの因果整合性保証をすべて保証できます。つまり、因果関係の整合性があるクライアント セッションは、以下の場合のみ因果整合性が保証されます。
"majority"
読み取り保証 (read concern) のある読み取り操作。つまりレプリカセット ノードの過半数によって確認されたデータを返し、耐久性がある読み取り操作。"majority"
書き込み保証付き書込み操作。つまり、レプリカセットの投票ノードの過半数に操作が適用済みであることを確認するようリクエストする書込み操作です。
データの耐久性を持たずに因果整合性を維持したい(つまり、書込み (write) がロールバックされる可能性がある)場合は、{ w: 1 }
書込み保証 (write concern) のある書き込み操作でも因果整合性を提供できます。
注意
読み取り保証 (read concern) と書込み保証 (write concern) の他の組み合わせでも、状況によっては 4 つの因果整合性の保証がすべて満たされる場合がありますが、必ずしもすべての状況に当てはまるとは限りません。
読み取り保証 (read concern) "majority"
と書込み保証 (write concern) "majority"
により、レプリカセット内の 2 つのノードが一時的にプライマリであると認識する状況(ネットワークパーティションがあるなど)でも、4 つの因果整合性の保証が保持されます。両方のプライマリが{ w: 1 }
書き込み懸念で書き込みを完了できますが、 "majority"
書き込み懸念で書き込みを完了できるのは 1 つのプライマリのみです。
たとえば、ネットワークパーティションが 5 つのノードのレプリカセットを分割する状況を考えます。
例
上記のパーティションで
"majority"
書込み保証 (write concern) を使用する書込み (write) は、P
new では完了できますが、P
old では完了できません。{ w: 1 }
書込み保証 (write concern) を使用する書込み (write) は、P
old またはP
new のいずれかで完了できます。ただし、P
old への書込み(およびS
1 に複製された書込み)は、これらのノードが残りのレプリカセットとの通信を回復するとロールバックされます。P
new に対して"majority"
書込み保証 (write concern) を使用した 書込み (write) が成功すると、"majority"
読み取り保証 (read concern) を使用した因果整合性のある読み取りは、P
new、S
2 およびS
3 に対する書込みを観察できます。読み取りは、残りのレプリカセットと通信できるようになり、レプリカセットの他のノードと同期できるようになると、P
old とS
1 に対する書込みも観察できます。パーティション中にP
old に行われた書込みやS
1 に複製された書込みはすべてロールバックされます。
Scenarios
読み取り保証 (read concern)/書込み保証 (write concern) に関する要件を説明するため、次のシナリオで、レプリカセットに対しさまざまな読み取り保証と書込み保証の組み合わせを使用して操作のシーケンスを発行するクライアントを示します。
読み取り保証 (read concern)
"majority"
と書込み保証 (write concern)"majority"
読み取り保証 (read concern)
"majority"
と書込み保証 (write concern){w: 1}
読み取り保証 (read concern)
"local"
と書込み保証 (write concern)"majority"
読み取り保証 (read"majority"
concern と書込み保証 (write concern)"majority"
因果整合性のあるセッションで読み取り保証 (read concern) "majority"
と書込み保証 (write concern) "majority"
を使用すると、次の因果整合性が保証されます。
✅ 自分の書込み操作結果の読み取り ✅ 単調な読み取り ✅ 単調な書込み ✅ 読み取り操作の結果の書込み
注意
シナリオ 1(読み取り保証 (read concern) "majority" と書込み保証 (write concern) "majority")
2 つのプライマリがある過渡期間中、P
new ノードのみが { w: "majority" }
書込み保証 (write concern) で書込み (write) を実行できるため、クライアント セッションは次の操作のシーケンスを正常に発行できます。
シーケンス | 例 |
---|---|
1. Write 1 with write concern "majority" to P new2. Read 1 with read concern "majority" to S 23. Write 2 with write concern "majority" to P new4. Read 2 with read concern "majority" to S 3 | For item A , update qty to 50 .Read item A .For items with qty less than or equal to 50 ,update restock to true .Read item A . |
✅ 自分の書込み操作結果の読み取り | Read 1 reads data from S 2 that reflects a state after Write 1.Read 2 reads data from S 3 that
reflects a state after Write 1 followed by Write
2. |
✅ 単調な読み取り | 読み取り 2 は、 S 3 から、読み取り 1 後の状態を反映しているデータを読み取ります。 |
✅ 単調な書込み | 書込み 2 は、 P new に、書込み 1 後の状態を反映しているデータを更新します。 |
✅ 読み取り操作の結果の書込み | 書き込み2は、読み取り 1 後のデータの状態を反映しているデータを P new に更新します(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。 |
注意
シナリオ 2(読み取り保証 (read concern) "majority" と書込み保証 (write concern) "majority")
読み取り保証 "majority"
を使用する読み取り 1 が S
1 にルーティングされる別のシーケンスを検討します。
シーケンス | 例 |
---|---|
1. Write 1 with write concern "majority" to P new2. Read 1 with read concern "majority" to S 13. Write 2 with write concern "majority" to P new4. Read 2 with with read concern "majority" to S 3 | For item A , update qty to 50 .Read item A .For items with qty less than or equal to 50 ,update restock to true .Read item A . |
このシーケンスでは、マジョリティ コミット ポイントが P
old に進むまで、読み取り 1 は戻ることができません。これは、P
old と S
1 が残りのレプリカセットと通信できるようになるまで発生しません。その時点で、P
old は(まだの場合)降格し、2 つのノードはレプリカセットの他のノードから同期します(書込み 1 を含む)。
✅ 自分の書込み操作結果の読み取り | Read 1 reflects a state of data after Write
1, albeit after the network partition has healed
and the member has sync'ed from the other members of the
replica set. Read 2 reads data from S 3 that
reflects a state after Write 1 followed by Write
2. |
✅ 単調な読み取り | 読み取り 2 は、読み取り 1 後の状態を反映しているデータを S 3 から読み取ります(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。 |
✅ 単調な書込み | 書込み 2 は、 P new に、書込み 1 後の状態を反映しているデータを更新します。 |
✅ 読み取り操作の結果の書込み | 書き込み2は、読み取り 1 後のデータの状態を反映しているデータを P new に更新します(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。 |
読み取り保証 (read"majority"
concern と書込み保証 (write concern){w: 1}
データの耐久性のある因果整合性が必要な場合、因果整合性があるセッションで読み取り保証 (read concern) "majority"
と書込み保証 (write concern) { w: 1 }
を使用すると、次の因果整合性が保証されます。
❌ 自分の書込み操作結果の読み取り ✅ 単調な読み取り ❌ 単調な書込み ✅ 読み取り操作の結果の書込み
データの耐久性のない因果整合性が必要な場合:
✅ 自分の書込み操作結果の読み取り ✅ 単調な読み取り ✅ 単調な書込み ✅ 読み取り操作の結果の書込み
注意
シナリオ 3(読み取り保証 (read concern) "majority" と 書込み保証 (write concern) {w: 1})
2 つのプライマリがある過渡期間中、P
old と P
new の両方が { w: 1 }
書込み保証を使用する書込みを実行できるため、クライアント セッションは次の操作のシーケンスを正常に発行できますが、データの耐久性のある因果整合性が必要な場合、因果整合性は得られません。
シーケンス | 例 |
---|---|
1. Write 1 with write concern { w: 1 } to P old2. Read 1 with read concern "majority" to S 23. Write 2 with write concern { w: 1 } to P new4. Read 2 with with read concern "majority" to S 3 | For item A , update qty to 50 .Read item A .For items with qty less than or equal to 50 ,update restock to true .Read item A . |
このシーケンスでは、
読み取り 1 は、マジョリティ コミット ポイントが書込み 1 の時点を過ぎて
P
new に進むまで、戻ることができません。読み取り 2 は、マジョリティ コミット ポイントが書込み 2 の時点を過ぎて
P
new に進むまで、戻ることができません。書込み 1 は、ネットワークパーティションが回復するとロールバックします。
➤ データの耐久性のある因果整合性が必要な場合
❌ 自分の書込み操作結果の読み取り | 読み取り 1 は、書込み 1 後の状態を反映していないデータを S 2 から読み取ります。 |
✅ 単調な読み取り | 読み取り 2 は、読み取り 1 後の状態を反映しているデータを S 3 から読み取ります(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。 |
❌ 単調書込み | 書込み 2 は、書込み 1 後の状態を反映していないデータを P new に更新します。 |
✅ 読み取り操作の結果の書込み | 書込み 2 は、読み取り 1 後の状態を反映しているデータを P new に更新します(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。 |
➤ データの耐久性のない因果整合性が必要な場合
✅ 自分の書込み操作結果の読み取り | 読み取り1は、書込み1とそれに続く書込み1のロールバックと同等の状態を反映しているデータを S 2から読み取ります。 |
✅ 単調な読み取り | 読み取り 2 は、読み取り 1 後の状態を反映しているデータを S 3 から読み取ります(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。 |
✅ 単調な書込み | 書込み 2 は、書込み 1 とそれに続く書込み 1 のロールバックと同等のデータを P new に更新します。 |
✅ 読み取り操作の結果の書込み | 書込み 2 は、読み取り 1 後の状態を反映しているデータを P new に更新します(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。 |
注意
シナリオ 4(読み取り保証 (read concern) "majority" と 書込み保証 (write concern) {w: 1})
読み取り保証 "majority"
を使用する読み取り 1 が S
1 にルーティングされる別のシーケンスを検討します。
シーケンス | 例 |
---|---|
1. Write 1 with write concern { w: 1 } to P old2. Read 1 with read concern "majority" to S 13. Write 2 with write concern { w: 1 } to P new4. Read 2 with with read concern "majority" to S 3 | For item A , update qty to 50 .Read item A .For items with qty less than or equal to 50 ,update restock to true .Read item A . |
このシーケンスでは、
マジョリティ コミット ポイントが
S
1 に進むまで、読み取り 1 は戻ることができません。これは、P
old およびS
1 が残りのレプリカセットと通信できるようになるまで発生しません。その時点で、P
old は(まだ停止していない場合)停止し、書込み 1 はP
old とS
1 からロールバックされ、2 つのノードはレプリカセットの他のノードから同期されます。
➤ データの耐久性のある因果整合性が必要な場合
❌ 自分の書込み操作結果の読み取り | 読み取り 1 で読み取られたデータは、ロールバックした書込み 1 の結果を反映していません。 |
✅ 単調な読み取り | 読み取り 2 は、読み取り 1 後の状態を反映しているデータを S 3 から読み取ります(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。 |
❌ 単調書込み | 書込み 2 は、書込み 1 後の状態(つまり、書込み 2 の前に行われたがロールバックした)を反映していないデータを P new に更新します。 |
✅ 読み取り操作の結果の書込み | 書込み 2 は、読み取り 1 後の状態を反映しているデータを P new に更新します(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。 |
➤ データの耐久性のない因果整合性が必要な場合
✅ 自分の書込み操作結果の読み取り | 読み取り 1 は、書込み 1 が最終的にロールバックするため、書込み 1 の最終結果を反映するデータを返します。 |
✅ 単調な読み取り | 読み取り 2 は、読み取り 1 後の状態を反映しているデータを S 3 に更新します(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。 |
✅ 単調な書込み | 書込み 2 は、書込み 1 とそれに続く書込み 1 のロールバックと同等のデータを P new に更新します。 |
✅ 読み取り操作の結果の書込み | 書込み 2 は、読み取り 1 後の状態を反映しているデータを P new に更新します(つまり、読み取り 1 が読み取ったデータを反映している「以前の」状態のデータ)。 |
読み取り保証 (read"local"
concern と書込み保証 (write concern){w: 1}
因果整合性のあるセッションで読み取り保証 (read concern) "local"
と書込み保証 (write concern) { w: 1 }
を使用する場合、因果整合性は保証されません。
❌ 自分の書込み操作結果の読み取り ❌ 単調な読み取り ❌ 単調な書込み ❌ 読み取り操作の結果の書込み
この組み合わせは、状況によっては 4 種類の因果整合性保証をすべて満たすことがありますが、必ずしもすべての状況に当てはまるとは限りません。
注意
シナリオ 5(読み取り保証 (read concern) "local" と 書込み保証 (write concern) {w: 1})
この過渡期間中、P
old と P
new の両方が { w: 1 }
書込み保証 (write concern) を使用する書込み (write) を実行できるため、クライアント セッションは次の操作のシーケンスを正常に発行できますが、因果整合性はありません。
シーケンス | 例 |
---|---|
For item A , update qty to 50 .Read item A .For items with qty less than or equal to 50 ,update restock to true .Read item A . |
❌ 自分の書込み操作結果の読み取り | 読み取り 2 は、書込み 1 とそれに続く書込み 2 ではなく、書込み 2 後の状態を反映しているデータを S 3 から読み取ります。 |
❌ 単調な読み取り | 読み取り 2 は、読み取り 1 後の状態を反映していないデータを S 3 に更新します(つまり、読み取り 1 が読み取ったデータを反映していない「以前の」状態のデータ)。 |
❌ 単調な書き込み | 書込み 2 は、書込み 1 後の状態を反映していないデータを P new に更新します。 |
❌ 読み取り操作の結果の書込み | 書込み 2 は、読み取り 1 後の状態を反映していないデータを P new に更新します(つまり、読み取り 1 が読み取ったデータを反映していない「以前の」状態のデータ)。 |
読み取り保証 (read"local"
concern と書込み保証 (write concern)"majority"
因果整合性のあるセッションで読み取り保証 (read concern) "local"
と書込み保証 (write concern) "majority"
を使用すると、次の因果整合性が保証されます。
❌ 自分の書込み操作結果の読み取り ❌ 単調な読み取り ✅ 単調な書込み ❌ 読み取り操作の結果の書込み
この組み合わせは、状況によっては 4 種類の因果整合性保証をすべて満たすことがありますが、必ずしもすべての状況に当てはまるとは限りません。
注意
シナリオ 6(読み取り保証 (read concern) "local" と 書込み保証 (write concern) "majority")
この過渡期間中、P
new は { w: "majority" }
書込み保証 (write concern) を使用する書込み (write) を実行できるため、クライアント セッションは次の操作のシーケンスを正常に発行できますが、因果整合性はありません。
シーケンス | 例 |
---|---|
1. Write 1 with write concern "majority" to P new2. Read 1 with read concern "local" to S 13. Write 2 with write concern "majority" to P new4. Read 2 with read concern "local" to S 3 | For item A , update qty to 50 .Read item A .For items with qty less than or equal to 50 ,update restock to true .Read item A . |
❌ 自分の書込み操作結果の読み取り | 読み取り1は、書込み1後の状態を反映していないデータを S 1から読み取ります。 |
❌ 単調な読み取り | 読み取り 2 は、読み取り 1 後の状態を反映していないデータを S 3 に更新します(つまり、読み取り 1 が読み取ったデータを反映していない「以前の」状態のデータ)。 |
✅ 単調な書込み | 書込み 2 は、 P new に、書込み 1 後の状態を反映しているデータを更新します。 |
❌ 読み取り操作の結果の書込み | 書込み 2 は、読み取り 1 後の状態を反映していないデータを P new に更新します(つまり、読み取り 1 が読み取ったデータを反映していない「以前の」状態のデータ)。 |