Docs Menu
Docs Home
/
MongoDBマニュアル
/ /

読み込み設定 (read preference)

項目一覧

  • 読み込み設定(read preference)モード
  • 動作
  • 読み込み設定(read preference)モード
  • 読み込み設定(read preference)の構成
  • 読み込み設定(read preference)とトランザクション
  • その他の考慮事項

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

レプリカセットに対する読み取り操作です。デフォルトの読み込み設定(read preference)では、読み込みはプライマリにルーティングされます。読み込みの優先順位を ``nearest`` とすると、最も近いノードに読み込みをルーティングします。
クリックして拡大します

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

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

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

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

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

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

ほとんどの場合、操作はプライマリ ノードを対象に読み取りを行いますが、使用できない場合はセカンダリ ノードを対象に読み取りを行います。

すべての操作はレプリカセットのセカンダリ ノードを対象に読み込みを行います。

通常、操作ではレプリカセットのセカンダリ ノードからデータが読み取られます。レプリカセットにプライマリ ノードが 1 つだけあり、他のノードがない場合、操作ではプライマリ ノードからデータが読み取られます。

ノードがプライマリであるか、セカンダリであるかに関係なく、指定されたレイテンシのしきい値に基づいて、操作は、ランダムに選択された適格なレプリカセット ノードから読み取ります。この操作は、レイテンシを計算するときに次の点を考慮します。

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

Tip

以下も参照してください。

  • primary を除くすべての読み込み設定 (read preference) モードでは、セカンダリがプライマリからの操作を非同期プロセスで複製するため、古いデータが返される可能性があります。[ 1 ] primary 以外のモードを使用する場合は、アプリケーションが古いデータを許容できることを確認してください。

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

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

警告

移行を伴うシャーディングされたクラスターでのセカンダリからの読み取りにおいて、ドキュメントが失われる可能性

シャーディングされたクラスターでのセカンダリからの読み取りが長時間行われていると、移行が行われている場合、ドキュメントが失われる可能性があります。

チャンク移行中にチャンクを削除する前に、MongoDB は orphanCleanupDelaySecs か、またはチャンクに関連する進行中のクエリがシャード プライマリで完了するまでかの、どちらか長い方で待機します。最初はプライマリだったノードで実行されたが、ノードがセカンダリにステップダウンした後も継続されるクエリは、最初にセカンダリで実行されたかのように扱われます。つまり、サーバーは、現在のプライマリ上のチャンクを対象とするクエリがない場合にのみ orphanDelayCleanupSecs を待ちます。

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

primary

すべての読み込み操作は、現在のレプリカセット プライマリのみを使用します。[1] これはデフォルトの読み込みモードであり、プライマリが使用できない場合は、読み込み操作でエラーが発生するか、例外がスローされます。

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 オプションを使用すると、クライアントがあまりにも古くなっていると推定するセカンダリからの読み取りを回避できます。

secondary

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

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

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

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

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

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

secondaryPreferred

通常、操作ではレプリカセットのセカンダリ ノードからデータが読み取られます。レプリカセットにプライマリ ノードが 1 つだけあり、他のノードがない場合、操作ではプライマリ ノードからデータが読み取られます。

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 ステージのあるパイプラインは、レプリカセットのセカンダリ ノードを実行することができます。これは、クラスター内のすべてのノードで featureCompatibilityVersion5.0 以上に設定され、読み込み設定 (read preference) でセカンダリ読み取りが許可されている場合に限ります。

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

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

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

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

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

戻る

書込み保証 (write concern)