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

読み込み設定 (read preference)

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

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

読み込み設定 (read preference) は、読み込み設定 (read preference)モードと、オプションでタグセット リスト、maxStalenessSeconds オプション、およびヘッジされた読み取りオプションで構成されます。ヘッジされた読み取りオプションは、primary 以外の読み込み設定 (read preference) を使用する読み取りについて、シャーディングされたクラスターで使用できます。

次の表は、読み込み設定(read preference)モードの簡単な概要です。

注意

primary 以外の読み込み設定 (read preference) モードは、シャーディングされたクラスターでのヘッジされた読み取りをサポートします。

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

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

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

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

読み込み設定 (read preference) primaryPreferred は、シャーディングされたクラスター上のヘッジされた読み取りをサポートします。

操作は、 レプリカセットの適格な セカンダリ メンバーから読み取ります。

読み込み設定(read preference)secondary は、シャーディングされたクラスター上のヘッジされた読み取りをサポートします。

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

読み込み設定 (read preference) secondaryPreferred は、シャーディングされたクラスター上のヘッジされた読み取りをサポートします。

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

読み込み設定 (read preference) nearest は、シャーディングされたクラスターでのヘッジされた読み取りをサポートし、デフォルトでヘッジされた読み取りオプションを有効にします。

  • すべてのモードで、ノードはクライアントの定期的な監視チェックに応答するときに使用できます。これは、ノードがネットワーク経由でアクセス可能で、リクエストに応答できることを確認します。

  • primaryを除くすべてのモードでは、読み込み設定(read preference)の maxStalenessSeconds オプションと指定されたタグセットリストを満たす場合、ノードは資格があります。

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

重要

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

読み込み設定 (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 はチャンク移行中にチャンクを削除する前に、そのチャンクに関連する進行中のクエリがシャード プライマリで完了するまで待機し、さらに orphanCleanupDelaySecs 秒待機します。最初はプライマリであったノードで実行されたクエリが、ノードがセカンダリに降格した後も継続されるクエリは、最初にセカンダリで実行された場合と同様に扱われます。つまり、現在のプライマリにチャンクを対象とするクエリがない場合、サーバーはorphanDelayCleanupSecs を待機するだけです。

チャンクをターゲットとし、セカンダリで実行されるクエリでは、クエリにかかる時間が orphanCleanupDelaySecs を超えるとドキュメントが失われる可能性があります。

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

操作は、セットの プライマリ が使用可能な場合は、それから読み取ります。フェイルオーバー時などプライマリが利用できない場合の操作では、読み込み設定(read preference)のmaxStalenessSeconds とタグセットリスト を満たす セカンダリ を対象に読み取りを行います。

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

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

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

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

注意

読み込み設定 (read preference) primaryPreferred は、シャーディングされたクラスター上のヘッジされた読み取りをサポートします。

secondary

操作では、セットのセカンダリのみを対象に読み取りを行います。読み取り操作で利用できるセカンダリがないと、エラーまたは例外が発生します。

ほとんどのレプリカセットにはセカンダリが 1 つ以上ありますが、使用できるセカンダリがない場合もあります。例、プライマリ、セカンダリ、アービタがあるレプリカセットでは、ノードがリカバリしています中か使用できない状態の場合、セカンダリが存在しないことがあります。

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

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

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

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

注意

読み込み設定(read preference)secondary は、シャーディングされたクラスター上のヘッジされた読み取りをサポートします。

secondaryPreferred

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

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

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

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

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

注意

読み込み設定 (read preference) secondaryPreferred は、シャーディングされたクラスター上のヘッジされた読み取りをサポートします。

nearest

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

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

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

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

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

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

注意

読み込み設定 (read preference) nearest は、デフォルトでは、シャーディングされたクラスターでの読み取りに対しヘッジされた読み取りの使用を指定します。

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操作の場合、"inline"mapReduce のみデータを書き込まない 操作は読み込み設定 (read preference)をサポートします。それ以外の場合、mapReduce 操作はプライマリで実行されます。

[1](1, 2)

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