読み込み設定は、MongoDB クライアントがレプリカセットのノードに読み込み操作をルーティングする方法を示します。
デフォルトでは、アプリケーションの読み取り操作は、レプリカセット内のプライマリ ノードを対象に行われます(読み込み設定 (read preference) モードが「プライマリ」)。ただし、クライアントは読み込み設定 (read preference) を指定して、読み取り操作をセカンダリに送信できます。
Read preference consists of the read preference mode and optionally, a tag set list, the maxStalenessSeconds option, and the hedged read option. Hedged read option is available for sharded clusters for reads that use non-primary read preference.
読み込み設定(read preference)モード
次の表は、読み込み設定(read preference)モードの簡単な概要です。
注意
primary 以外の読み込み設定 (read preference) モードは、シャーディングされたクラスターでのヘッジされた読み取りをサポートします。
読み込み設定(read preference)モード | 説明 |
|---|---|
デフォルトモード。すべての操作は、現在のレプリカセットのプライマリから読み取られます。 読み取り操作を含むトランザクションでは、読み込み設定 (read preference) | |
ほとんどの場合、操作はプライマリ ノードを対象に読み取りを行いますが、使用できない場合はセカンダリ ノードを対象に読み取りを行います。 Read preference | |
すべての操作はレプリカセットのセカンダリ ノードを対象に読み込みを行います。 読み込み設定(read preference) | |
通常、操作ではレプリカセットのセカンダリ ノードからデータが読み取られます。レプリカセットにプライマリ ノードが 1 つだけあり、他のノードがない場合、操作ではプライマリ ノードからデータが読み取られます。 Read preference | |
ノードがプライマリであるか、セカンダリであるかに関係なく、指定されたレイテンシのしきい値に基づいて、操作は、ランダムに選択された適格なレプリカセット ノードから読み取ります。この操作は、レイテンシを計算するときに次の点を考慮します。
Read preference |
読み込み設定 (read preference)モードの詳細については、読み込み設定 (read preference) モードを参照してください。
動作
読み込み設定はデータの可視性には影響しません。クライアントは、書込みが確認される前、または過半数のレプリカセット ノードに反映される前に、書込みの結果を確認できます。詳細については、「読み取り分離、整合性、最新性について」を参照してください。
読み込み設定(read preference)は因果整合性には影響しません。因果整合性の保証は、因果的に整合性のあるセッションによって提供され、
"majority"読み取り保証(read concern)を持つ読み取り操作と"majority"書込み保証(write concern)を持つ書込み操作に対して、MongoDB 配置の全ノードにわたって保持されます。
警告
移行を伴うシャーディングされたクラスターでのセカンダリからの読み取りにおいて、ドキュメントが失われる可能性
シャーディングされたクラスターでのセカンダリからの読み取りが長時間行われていると、移行が行われている場合、ドキュメントが失われる可能性があります。
MongoDB はチャンク移行中にチャンクを削除する前に、そのチャンクに関連する進行中のクエリがシャード プライマリで完了するまで待機し、さらに orphanCleanupDelaySecs 秒待機します。最初はプライマリであったノードで実行されたクエリが、ノードがセカンダリに降格した後も継続されるクエリは、最初にセカンダリで実行された場合と同様に扱われます。つまり、現在のプライマリにチャンクを対象とするクエリがない場合、サーバーはorphanDelayCleanupSecs を待機するだけです。
チャンクをターゲットとし、セカンダリで実行されるクエリでは、クエリにかかる時間が orphanCleanupDelaySecs を超えるとドキュメントが失われる可能性があります。
読み込み設定(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.注意
Read preference
primaryPreferredsupports hedged reads on sharded clusters.
secondary操作では、セットのセカンダリのみを対象に読み取りを行います。読み取り操作で利用できるセカンダリがないと、エラーまたは例外が発生します。
ほとんどのレプリカセットにはセカンダリが 1 つ以上ありますが、使用できるセカンダリがない場合もあります。たとえば、レプリカ セットにプライマリ、セカンダリ、アービタがあっても、ノードがリカバリ中か使用できない状態の場合、セカンダリが存在しないことがあります。
secondary読み込み設定 (read preference) に maxStalenessSeconds 値が含まれている場合、クライアントはセカンダリの最後の書込み (write) をプライマリの最後の書込み (write) と比較して、各セカンダリがどれだけ古くなっているかを推定します。クライアントはその後、推定されるラグがmaxStalenessSeconds以下のセカンダリに読み取り操作を送信します。プライマリが存在しない場合、クライアントは比較のために最新の書込み (write) を持つセカンダリを使用します。読み込み設定(read preference)にタグセット リスト(タグセットの配列) が設定されている場合、クライアントは同じタグを持つセカンダリを探します(一致するタグセットが見つかるまで順に試行します)。一致するセカンダリが見つかると、クライアントは一致したなかで最も近いセカンダリ グループからランダムにセカンダリを選択します。タグが一致するセカンダリが見つからないと、読み取り操作はエラーになります。
読み込み設定(read preference)に
maxStalenessSeconds値とタグセット リストが設定されている場合、クライアントは古さ、指定されたタグの順でフィルタリングを行います。secondaryモードを使用した読み取り操作では古いデータが返される可能性があります。maxStalenessSecondsオプションを使用すると、クライアントがあまりにも古くなっていると推定するセカンダリからの読み取りを回避できます。注意
読み込み設定(read preference)
secondaryは、シャーディングされたクラスター上のヘッジされた読み取りをサポートします。
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.注意
Read preference
secondaryPreferredsupports hedged reads on sharded clusters.
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.注意
Read preference
nearest, by default, specifies the use of hedged reads for reads on a sharded cluster.
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 つが |