AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

読み込み設定 (read preference)

読み込み設定は、MongoDB クライアントがレプリカセットのノードに読み込み操作をルーティングする方法を示します。

デフォルトでは、アプリケーションの読み取り操作は、レプリカセット内のプライマリ ノードを対象に行われます(読み込み設定 (read preference) モードが「プライマリ」)。ただし、クライアントは読み込み設定 (read preference) を指定して、読み取り操作をセカンダリに送信できます。

読み込み設定は、読み込み設定モード、オプションでタグセットリスト、および maxStalenessSeconds オプションで構成されます。

次の表は、読み込み設定 (read preference) モードをまとめたものです。

読み込み設定(read preference)モード
説明

デフォルトモード。操作は現在のレプリカセットのプライマリから読み取られます。

読み取り操作を含むトランザクションでは、読み込み設定 (read preference) primary を使用する必要があります。特定のトランザクション内のすべての操作は、同じノードにルーティングする必要があります。

操作は、プライマリが利用可能な場合、プライマリから読み取ります。 プライマリが利用できない場合は、適格なセカンダリメンバーから読み取ります。

操作は、レプリカセットの適格なセカンダリノードを対象に読み取ります。

操作はレプリカセットの適格なセカンダリメンバーからデータを読み取ります。 適格なセカンダリが利用できない場合、操作はプライマリメンバーから読み取ります。

操作は、プライマリかセカンダリかに関係なく、レイテンシウィンドウ内のネットワークレイテンシを持つ適格なメンバーから読み取ります。

  • すべてのモードにおいて、メンバーが利用可能となるのは、クライアントの定期的なモニタリングチェックに応答したときです。これにより、メンバーがネットワーク経由で到達可能であり、リクエストに応答できることが確認されます。

  • primary を除くすべてのモードにおいて、メンバーが適格となるのは、読み込み設定の maxStalenessSeconds オプションと、指定されたタグセットリストの両方を満たす場合です。

  • primary を除くすべてのモードでは、localThresholdMS 接続文字列オプションは、クライアントが適格なメンバーを選択する際にレイテンシウィンドウを計算するために使用するローカルしきい値を設定します。

重要

読み込み設定モードでは、操作の成功は保証されません。可用性と適格性によってクライアントが検討するノードが決まりますが、選択されたノードが負荷状態にある場合など、操作を拒否することもあります。

読み込み設定 (read preference) モードの詳細については、「読み込み設定 (read preference) モード 」を参照してください。

  • All read preference modes except primary may return stale data because secondaries replicate operations from the primary in an asynchronous process. [1] Ensure that your application can tolerate stale data if you choose to use a non-primary mode.

  • 読み込み設定はデータの可視性には影響しません。クライアントは、書込みが確認される前、または過半数のレプリカセット ノードに反映される前に、書込みの結果を確認できます。詳細については、「読み取り分離、整合性、最新性について」を参照してください。

  • 読み込み設定(read preference)は因果整合性には影響しません。因果整合性の保証は、因果的に整合性のあるセッションによって提供され、"majority"読み取り保証(read concern)を持つ読み取り操作と"majority"書込み保証(write concern)を持つ書込み操作に対して、MongoDB 配置の全ノードにわたって保持されます。

警告

MongoDBバージョン 8.2 以降では、シャーディングされたクラスターで長時間実行されているセカンダリ読み取りは、 チャンクの移行に続く孤立したドキュメント の削除前に自動的に終了することがあります。

この動作は terminateSecondaryReadsOnOrphanCleanup パラメーターが制御します。長時間実行されているセカンダリ読み取りの処理の詳細については、シャーディングされたクラスターで長時間実行されているセカンダリ読み取りを参照してください。

primary

All read operations use only the current replica set primary. [1] This is the default read mode. If the primary is unavailable, read operations produce an error or throw an exception.

primary 読み込み設定 (read preference) モードは、タグセット リストまたは maxStalenessSeconds を使用する読み込み設定 (read preference) モードと互換性がありません。タグセット リストまたは maxStalenessSeconds 値を primary とともに指定すると、ドライバーでエラーが発生します。

読み取り操作を含むトランザクションでは、読み込み設定 (read preference) primary を使用する必要があります。特定のトランザクション内のすべての操作は、同じノードにルーティングする必要があります。

primaryPreferred

セットのプライマリノードが利用可能な場合、操作はそこから読み取ります。フェイルオーバー状況などプライマリが利用できない場合、操作は読み込み設定の maxStalenessSeconds およびタグセットリストを満たすセカンダリノードから読み取ります。

primaryPreferred 読み込み設定 (read preference) に maxStalenessSeconds 値が含まれており、読み取り元のプライマリがない場合、クライアントはセカンダリの最後の書込み (write) をセカンダリの最新の書込み (write) と比較して、各セカンダリがどれだけ古くなっているかを推定します。クライアントはその後、推定されるラグが maxStalenessSeconds 以下のセカンダリに読み取り操作を送信します。

読み込み設定(read preference)でタグセット リスト(タグセットの配列) が設定されており、読み込みを行えるプライマリがない場合、クライアントは同じタグを持つセカンダリを探します(一致するタグセットが見つかるまで順に試行します)。一致するセカンダリが見つかると、クライアントは一致したなかで最も近いセカンダリ グループからランダムにセカンダリを選択します。タグが一致するセカンダリが見つからないと、読み取り操作はエラーになります。

読み込み設定(read preference)に maxStalenessSeconds 値とタグセット リストが設定されている場合、クライアントは古さ、指定されたタグの順でフィルタリングを行います。

primaryPreferred モードを使用した読み取り操作では古いデータが返される可能性があります。maxStalenessSeconds オプションを使用すると、クライアントがあまりにも古くなっていると推定するセカンダリからの読み取りを回避できます。

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

操作はレプリカセットの適格なセカンダリメンバーからデータを読み取ります。 適格なセカンダリが利用できない場合、操作はプライマリメンバーから読み取ります。

secondaryPreferred 読み込み設定 (read preference) に maxStalenessSeconds 値が含まれている場合、クライアントはセカンダリの最後の書込み (write) をプライマリの最後の書込み (write) と比較して、各セカンダリがどれだけ古くなっているかを推定します。クライアントはその後、推定されるラグが maxStalenessSeconds 以下のセカンダリに読み取り操作を送信します。プライマリが存在しない場合、クライアントは比較のために最新の書込み (write) を持つセカンダリを使用します。推定されるラグが maxStalenessSeconds 以下のセカンダリがない場合、クライアントはレプリカセットのプライマリに読み取り操作を指示します。

読み込み設定(read preference)にタグセット リスト(タグセットの配列) が設定されている場合、クライアントは同じタグを持つセカンダリを探します(一致するタグセットが見つかるまで順に試行します)。一致するセカンダリが見つかると、クライアントは一致したなかで最も近いセカンダリ グループからランダムにセカンダリを選択します。タグが一致するセカンダリが見つからないと、クライアントはタグを無視し、プライマリから読み取りを行います。

読み込み設定(read preference)に maxStalenessSeconds 値とタグセット リストが設定されている場合、クライアントは古さ、指定されたタグの順でフィルタリングを行います。

secondaryPreferred モードを使用した読み取り操作では古いデータが返される可能性があります。maxStalenessSeconds オプションを使用すると、クライアントがあまりにも古くなっていると推定するセカンダリからの読み取りを回避できます。

nearest

ドライバーは、ネットワーク レイテンシが許容範囲内のノードからデータを読み取ります。nearest モードでの読み取りでは、読み取り操作をルーティングする際、メンバーがプライマリかセカンダリかは考慮されません。プライマリとセカンダリは同等に扱われます。

このモードを設定すると、現在のデータや古いデータを優先することなしに、読み取り操作に対するネットワーク レイテンシの影響を最小限に抑えられます。

読み込み設定(read preference)に maxStalenessSeconds の値が設定されている場合、クライアントはプライマリがあれば、各セカンダリの最後の書込み(write)とプライマリの最後の書込み(write)を、プライマリがない場合は各セカンダリの最後の書込み(write)と最新の書き込みを行ったセカンダリの最後の書込み(write)を比較することで、各セカンダリの古さを推定します。次に、推定遅延が maxStalenessSeconds より大きいセカンダリを除外し、残りのノード(プライマリまたはセカンダリ)のうちレイテンシが許容範囲内のノードにランダムに読み取りを指示します。

タグセット リストを指定すると、クライアントは指定されたタグセット リストと一致するレプリカセット ノードを検索し、最も近いグループの中から任意のノードに読み込み内容を送信します。

読み込み設定(read preference)に maxStalenessSeconds 値とタグセット リストが設定されている場合、クライアントは古さ、指定されたタグの順でフィルタリングを行います。残りの mongod のインスタンスから、クライアントはレイテンシが許容範囲内のインスタンスにランダムに読み取りを指示します。読み込み設定(read preference)のノード選択に関するドキュメントでは、このプロセスについて詳しく解説しています。

nearest モードを使用した読み取り操作では古いデータが返される可能性があります。maxStalenessSeconds オプションを使用すると、クライアントがあまりにも古くなっていると推定するセカンダリからの読み取りを回避できます。

Tip

特定の読み込み設定のユースケースについては、「読み込み設定のユースケース」を参照してください。

MongoDB ドライバーを使用する場合は、ドライバーの読み込み設定 (read preference) API を使用して読み込み設定 (read preference) を指定できます。ドライバーの API ドキュメントを参照してください。レプリカセットまたはシャーディングされたクラスターに接続するときに、読み込み設定 (read preference) を設定することもできます。例については、接続文字列を参照してください。

特定の読み込み設定に対し、MongoDB ドライバーは同じノード選択ロジックを使用します。

mongosh を使用する場合は、cursor.readPref() と Mongo.setReadPref() を参照してください。

読み取り操作を含むトランザクションでは、読み込み設定 (read preference) primary を使用する必要があります。特定のトランザクション内のすべての操作は、同じノードにルーティングする必要があります。

集計パイプラインで $merge または $out ステージを使用する場合は、次の点を考慮してください。

  • MongoDB 5.0 以降では、 $merge ステージのあるパイプラインは、レプリカセットのセカンダリ ノードを実行することができます。これは、クラスター内のすべてのノードで featureCompatibilityVersion が 5.0 以上に設定され、読み込み設定 (read preference) でセカンダリ読み取りが許可されている場合に限ります。

    • $merge $out ステージはセカンダリ ノードで実行されますが、書込み (write) 操作はプライマリ ノードに送信されます。

    • すべてのドライバー バージョンがセカンダリ ノードに送信される $merge 操作をサポートしているわけではありません。詳細についてはドライバーのドキュメントを参照してください。

  • MongoDB の以前のバージョンでは、$out または $merge ステージを持つパイプラインは常にプライマリ ノードで実行され、読み込み設定 (read preference) は考慮されませんでした。

mapReduce 操作では、データを書き込まない「インライン」mapReduce 操作のみが読み込み設定をサポートします。それ以外の場合、mapReduce 操作はプライマリノード上で実行されます。

[1](1, 2)

状況によっては、 replica set内の 2 つのノードが一時的に自分たちがプライマリであると認識することがありますが、最大でそのうちの 1 つが{ w: "majority" }書き込み懸念で書き込みを完了できます。 { w: "majority" }書き込みを完了できるノードは現在のプライマリであり、もう一方のノードは、通常はネットワークパーティションが原因で降格をまだ認識していない以前のプライマリです。これが発生すると、以前のプライマリに接続するクライアントは、読み取り設定primaryを要求したにもかかわらず、古いデータを検出する可能性があり、以前のプライマリへの新しい書き込みは最終的にロールバックされます。