読み込み設定は、MongoDB クライアントがレプリカセットのノードに読み込み操作をルーティングする方法を示します。
デフォルトでは、アプリケーションの読み取り操作は、レプリカセット内のプライマリ ノードを対象に行われます(読み込み設定 (read preference) モードが「プライマリ」)。ただし、クライアントは読み込み設定 (read preference) を指定して、読み取り操作をセカンダリに送信できます。
読み込み設定は、読み込み設定モード、オプションでタグセットリスト、および maxStalenessSeconds オプションで構成されます。
読み込み設定(read preference)モード
次の表は、読み込み設定 (read preference) モードの概要です。
読み込み設定(read preference)モード | 説明 |
|---|---|
デフォルトモード。すべての操作は、現在のレプリカセットのプライマリから読み取られます。 読み取り操作を含むトランザクションでは、読み込み設定 (read preference) | |
すべての操作はレプリカセットのセカンダリ ノードを対象に読み込みを行います。 | |
ノードがプライマリであるか、セカンダリであるかに関係なく、指定されたレイテンシのしきい値に基づいて、操作は、ランダムに選択された適格なレプリカセット ノードから読み取ります。この操作は、レイテンシを計算するときに次の点を考慮します。
|
読み込み設定 (read preference)モードの詳細については、読み込み設定 (read preference) モードを参照してください。
動作
読み込み設定はデータの可視性には影響しません。クライアントは、書込みが確認される前、または過半数のレプリカセット ノードに反映される前に、書込みの結果を確認できます。詳細については、「読み取り分離、整合性、最新性について」を参照してください。
読み込み設定(read preference)は因果整合性には影響しません。因果整合性の保証は、因果的に整合性のあるセッションによって提供され、
"majority"読み取り保証(read concern)を持つ読み取り操作と"majority"書込み保証(write concern)を持つ書込み操作に対して、MongoDB 配置の全ノードにわたって保持されます。
警告
MongoDBバージョン 8.2 以降では、シャーディングされたクラスターで長時間実行されているセカンダリ読み取りは、 チャンクの移行に続く孤立したドキュメント の削除前に自動的に終了することがあります。
この動作は terminateSecondaryReadsOnOrphanCleanup パラメーターが制御します。長時間実行されているセカンダリ読み取りの処理の詳細については、シャーディングされたクラスターで長時間実行されているセカンダリ読み取りを参照してください。
読み込み設定(read preference)モード
primaryすべての読み込み操作は、現在のレプリカセット プライマリのみを使用します。[1] これはデフォルトの読み込みモードであり、プライマリが使用できない場合は、読み込み操作でエラーが発生するか、例外がスローされます。
primary読み込み設定 (read preference) モードは、タグセット リストまたは maxStalenessSeconds を使用する読み込み設定 (read preference) モードと互換性がありません。タグセット リストまたはmaxStalenessSeconds値をprimaryとともに指定すると、ドライバーでエラーが発生します。読み取り操作を含むトランザクションでは、読み込み設定 (read preference)
primaryを使用する必要があります。特定のトランザクション内のすべての操作は、同じノードにルーティングする必要があります。
primaryPreferredほとんどの操作では、セットのプライマリを対象に読み取りを行います。ただし、フェイルオーバー時などプライマリが利用できない場合の操作では、読み込み設定(read preference)の
maxStalenessSecondsとタグセット リストを満たすセカンダリを対象に読み取りを行います。When the
primaryPreferredread preference includes a maxStalenessSeconds value and there is no primary from which to read, the client estimates how stale each secondary is by comparing the secondary's last write to that of the secondary with the most recent write. The client then directs the read operation to a secondary whose estimated lag is less than or equal tomaxStalenessSeconds.読み込み設定(read preference)でタグセット リスト(タグセットの配列) が設定されており、読み込みを行えるプライマリがない場合、クライアントは同じタグを持つセカンダリを探します(一致するタグセットが見つかるまで順に試行します)。一致するセカンダリが見つかると、クライアントは一致したなかで最も近いセカンダリ グループからランダムにセカンダリを選択します。タグが一致するセカンダリが見つからないと、読み取り操作はエラーになります。
読み込み設定(read preference)に
maxStalenessSeconds値とタグセット リストが設定されている場合、クライアントは古さ、指定されたタグの順でフィルタリングを行います。Read operations using the
primaryPreferredmode may return stale data. Use themaxStalenessSecondsoption to avoid reading from secondaries that the client estimates are overly stale.Ingressリクエストレート制限が有効になっているシャーディングされたクラスターでは、負荷を分散しているシャード ノードが
SystemOverloadedErrorというラベルの付いたエラーを返すことがあります。overloadAwareServerSelectionEnabledがtrueに設定されているクラスターでは、プライマリがSystemOverloadedErrorというラベルの付いた再試行可能なエラーで応答すると、ルーターは過負荷のサーバーではなく、適格なセカンダリに読み取りを一時的にルーティングすることがあります。これは、複数のサーバーを選択できる読み込み設定 (read preference)に適用されます。デフォルトでは 、overloadAwareServerSelectionEnabledはfalseに設定されています。
secondary操作では、セットのセカンダリのみを対象に読み取りを行います。読み取り操作で利用できるセカンダリがないと、エラーまたは例外が発生します。
ほとんどのレプリカセットにはセカンダリが 1 つ以上ありますが、使用できるセカンダリがない場合もあります。たとえば、レプリカ セットにプライマリ、セカンダリ、アービタがあっても、ノードがリカバリ中か使用できない状態の場合、セカンダリが存在しないことがあります。
secondary読み込み設定 (read preference) に maxStalenessSeconds 値が含まれている場合、クライアントはセカンダリの最後の書込み (write) をプライマリの最後の書込み (write) と比較して、各セカンダリがどれだけ古くなっているかを推定します。クライアントはその後、推定されるラグがmaxStalenessSeconds以下のセカンダリに読み取り操作を送信します。プライマリが存在しない場合、クライアントは比較のために最新の書込み (write) を持つセカンダリを使用します。読み込み設定(read preference)にタグセット リスト(タグセットの配列) が設定されている場合、クライアントは同じタグを持つセカンダリを探します(一致するタグセットが見つかるまで順に試行します)。一致するセカンダリが見つかると、クライアントは一致したなかで最も近いセカンダリ グループからランダムにセカンダリを選択します。タグが一致するセカンダリが見つからないと、読み取り操作はエラーになります。
読み込み設定(read preference)に
maxStalenessSeconds値とタグセット リストが設定されている場合、クライアントは古さ、指定されたタグの順でフィルタリングを行います。secondaryモードを使用した読み取り操作では古いデータが返される可能性があります。maxStalenessSecondsオプションを使用すると、クライアントがあまりにも古くなっていると推定するセカンダリからの読み取りを回避できます。
secondaryPreferred通常、操作ではレプリカセットのセカンダリ ノードからデータが読み取られます。レプリカセットにプライマリ ノードが 1 つだけあり、他のノードがない場合、操作ではプライマリ ノードからデータが読み取られます。
When the
secondaryPreferredread preference includes a maxStalenessSeconds value, the client estimates how stale each secondary is by comparing the secondary's last write to that of the primary. The client then directs the read operation to a secondary whose estimated lag is less than or equal tomaxStalenessSeconds. If there is no primary, the client uses the secondary with the most recent write for the comparison. If there are no secondaries with estimated lag less than or equal tomaxStalenessSeconds, the client directs the read operation to the replica set's primary.読み込み設定(read preference)にタグセット リスト(タグセットの配列) が設定されている場合、クライアントは同じタグを持つセカンダリを探します(一致するタグセットが見つかるまで順に試行します)。一致するセカンダリが見つかると、クライアントは一致したなかで最も近いセカンダリ グループからランダムにセカンダリを選択します。タグが一致するセカンダリが見つからないと、クライアントはタグを無視し、プライマリから読み取りを行います。
読み込み設定(read preference)に
maxStalenessSeconds値とタグセット リストが設定されている場合、クライアントは古さ、指定されたタグの順でフィルタリングを行います。Read operations using the
secondaryPreferredmode may return stale data. Use themaxStalenessSecondsoption to avoid reading from secondaries that the client estimates are overly stale.
nearestThe driver reads from a member whose network latency falls within the acceptable latency window. Reads in the
nearestmode do not consider whether a member is a primary or secondary when routing read operations: primaries and secondaries are treated equivalently.このモードを設定すると、現在のデータや古いデータを優先することなしに、読み取り操作に対するネットワーク レイテンシの影響を最小限に抑えられます。
読み込み設定(read preference)に maxStalenessSeconds の値が設定されている場合、クライアントはプライマリがあれば、各セカンダリの最後の書込み(write)とプライマリの最後の書込み(write)を、プライマリがない場合は各セカンダリの最後の書込み(write)と最新の書き込みを行ったセカンダリの最後の書込み(write)を比較することで、各セカンダリの古さを推定します。次に、推定遅延が
maxStalenessSecondsより大きいセカンダリを除外し、残りのノード(プライマリまたはセカンダリ)のうちレイテンシが許容範囲内のノードにランダムに読み取りを指示します。タグセット リストを指定すると、クライアントは指定されたタグセット リストと一致するレプリカセット ノードを検索し、最も近いグループの中から任意のノードに読み込み内容を送信します。
読み込み設定(read preference)に
maxStalenessSeconds値とタグセット リストが設定されている場合、クライアントは古さ、指定されたタグの順でフィルタリングを行います。残りのmongodのインスタンスから、クライアントはレイテンシが許容範囲内のインスタンスにランダムに読み取りを指示します。読み込み設定(read preference)のノード選択に関するドキュメントでは、このプロセスについて詳しく解説しています。Read operations using the
nearestmode may return stale data. Use themaxStalenessSecondsoption to avoid reading from secondaries that the client estimates are overly stale.
Tip
特定の読み込み設定のユースケースについては、「読み込み設定のユースケース」を参照してください。
読み込み設定(read preference)の構成
MongoDB ドライバーを使用する場合は、ドライバーの読み込み設定 (read preference) API を使用して読み込み設定 (read preference) を指定できます。ドライバーの API ドキュメントを参照してください。レプリカセットまたはシャーディングされたクラスターに接続するときに、読み込み設定 (read preference) を設定することもできます。例については、接続文字列を参照してください。
特定の読み込み設定に対し、MongoDB ドライバーは同じノード選択ロジックを使用します。
When using mongosh, see cursor.readPref() and Mongo.setReadPref().
読み込み設定(read preference)とトランザクション
読み取り操作を含むトランザクションでは、読み込み設定 (read preference) primary を使用する必要があります。特定のトランザクション内のすべての操作は、同じノードにルーティングする必要があります。
その他の考慮事項
集計パイプラインで $merge または $out ステージを使用する場合は、次の点を考慮してください。
MongoDB 5.0 以降では、
$mergeステージのあるパイプラインは、レプリカセットのセカンダリ ノードを実行することができます。これは、クラスター内のすべてのノードで featureCompatibilityVersion が5.0以上に設定され、読み込み設定 (read preference) でセカンダリ読み取りが許可されている場合に限ります。MongoDB の以前のバージョンでは、
$outまたは$mergeステージを持つパイプラインは常にプライマリ ノードで実行され、読み込み設定 (read preference) は考慮されませんでした。
mapReduce 操作では、データを書き込まない「インライン」mapReduce 操作のみが読み込み設定 (read preference)をサポートします。それ以外の場合、mapReduce 操作はプライマリで実行されます。
| [1] | (1, 2) 状況によっては、 replica set内の 2 つのノードが一時的に自分たちがプライマリであると認識することがありますが、最大でそのうちの 1 つが |