読み込み設定 (read preference)
項目一覧
読み込み設定(read preference)では、MongoDB クライアントが読み取り操作を レプリカセットのノードにルーティングする方法を示します。
デフォルトでは、アプリケーションの読み取り操作は、 レプリカセット内のプライマリを対象に行われます(読み込み設定(read preference)モードが「プライマリ」です)。ただし、クライアントは読み込み設定(read preference)を指定して、読み取り操作をセカンダリに送信できます。
読み取り設定は、 読み取り設定モードと、オプションでタグセットリスト、および maxStalenessSeconds オプションで構成されます。
読み込み設定(read preference)モード
次の表は、読み込み設定 (read preference) モードの概要です。
読み込み設定(read preference)モード | 説明 |
---|---|
デフォルトモード。すべての操作は、現在のレプリカセットのプライマリから読み取られます。 読み取り操作を含む分散トランザクションでは、読み込み設定(read preference) | |
すべての操作はレプリカセットのセカンダリ ノードを対象に読み込みを行います。 | |
ノードがプライマリであるか、セカンダリであるかに関係なく、指定されたレイテンシのしきい値に基づいて、操作は、ランダムに選択された適格なレプリカセット ノードから読み取ります。この操作は、レイテンシを計算するときに次の点を考慮します。
|
読み込み設定 (read preference) モードの詳細については、「読み込み設定 (read preference) モード 」を参照してください。
動作
primary
を除くすべての読み込み設定 (read preference) モードでは、セカンダリがプライマリからの操作を非同期プロセスで複製するため、古いデータが返される可能性があります。[ 1 ]primary
以外のモードを使用する場合は、アプリケーションが古いデータを許容できることを確認してください。読み込み設定はデータの可視性には影響しません。つまり、クライアントは、書込みが確認される前、または過半数のレプリカセット ノードに反映される前に、書込みの結果を確認できます。詳細については、「読み取り分離、整合性、最新性について」を参照してください。
読み込み設定(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
とタグセット リストを満たすセカンダリを対象に読み取りを行います。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
オプションを使用すると、クライアントがあまりにも古くなっていると推定するセカンダリからの読み取りを回避できます。
読み込み設定(read preference)の構成
MongoDB ドライバーを使用する場合は、ドライバーの読み込み設定 (read preference) API を使用して読み込み設定 (read preference) を指定できます。ドライバーの API ドキュメントを参照してください。レプリカセットまたはシャーディングされたクラスターに接続するときに、読み込み設定 (read preference) を設定することもできます。例については、接続文字列を参照してください。
特定の読み込み設定に対し、MongoDB ドライバーは同じノード選択ロジックを使用します。
mongosh
を使用する場合は、cursor.readPref()
と 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 つが{ w:
"majority" } 書き込み懸念で書き込みを完了できます。 { w: "majority" } 書き込みを完了できるノードは現在のプライマリであり、もう一方のノードは、通常はネットワークパーティションが原因で降格をまだ認識していない以前のプライマリです。これが発生すると、以前のプライマリに接続するクライアントは、読み取り設定primary を要求したにもかかわらず、古いデータを検出する可能性があり、以前のプライマリへの新しい書き込みは最終的にロールバックされます。 |