MongoDB のレプリカセットは、同じデータセットを維持する mongod プロセスのグループです。レプリカセットは冗長性と高可用性を提供し、すべての本番環境の配置の基盤となります。このセクションでは、MongoDB のレプリケーションと、レプリカセットのコンポーネントおよびアーキテクチャについて紹介します。また、レプリカセットに関連する一般的なタスクに関するチュートリアルも提供します。
重要
This section describes the replica set architecture used by Atlas Core and self-managed deployments. On Atlas Infinite clusters, the storage layer handles replication and durability independently of the compute nodes. To learn more, see MongoDB Atlas Infinite: Architecture.
冗長性とデータ可用性
レプリケーションは、複数のデータベース サーバーにデータのコピーを保持することで、単一サーバーの障害に対応できる冗長性とデータの可用性を提供します。
場合によっては、クライアントが読み取り操作を別のサーバーに送信できるため、レプリケーションによって読み取りキャパシティーを増大することができます。異なるデータセンターにデータのコピーを保持することで、分散アプリケーションのためのデータローカリティと可用性を高めることができます。また、ディザスタリカバリ、レポート作成、バックアップなどの専用目的で追加のコピーを保持することもできます。
MongoDB でのレプリケーション
レプリカセットは、同じデータセットを保持する mongod インスタンスのグループです。レプリカセットには、データを保持する複数のノードと、オプションとして 1 つのアービタ ノードが含まれます。データを保持するノードのうち、1 つのノードだけがプライマリノードと見なされ、他のノードはセカンダリノードと見なされます。
警告
各レプリカセット ノードの帰属先レプリカセットは 1 つのみにする必要があります。レプリカセット ノードは複数のレプリカセットに属することはできません。
The primary node receives all write operations. A replica set can have only one primary capable of confirming writes with { w: "majority" } write concern, although in some circumstances, another mongod instance may transiently believe itself to also be primary. [1] The primary records all changes to its data sets in its operation log, that is, the oplog. For more information on primary node operation, see Replica Set Primary.
セカンダリではプライマリの oplog を複製し、セカンダリのデータセットにプライマリのデータセットを反映するように操作をデータセットに適用します。プライマリが利用できない場合は、資格のあるセカンダリが選挙を行い、自分自身を新しいプライマリに選出します。セカンダリ ノードの詳細については、「レプリカセットのセカンダリ ノード」を参照してください。
コスト上の制約によりセカンダリを追加できない場合は、レプリカセットにmongod インスタンスをアービタとして追加できます。アービタは選挙に参加しますが、データを保持しません(つまり、データの冗長性を提供しません)。アービタの詳細については、「レプリカセット アービタ」を参照してください。
アービタは常にアービタであり続けますが、選挙中にプライマリが格下げしてセカンダリになったり、セカンダリがプライマリになったりすることもあります。
非同期レプリケーション
セカンダリはプライマリの oplog を複製し、非同期にデータセットに操作を適用します。セカンダリのデータセットにプライマリのデータセットを反映させることで、1 つ以上のノードに障害が発生しても、レプリカセットは機能し続けることができます。
レプリケーションの仕組みの詳細については、「レプリカセット Oplog」および「レプリカセット データ同期」を参照してください。
遅い操作
replica setのセカンダリ メンバーは、適用に低速操作しきい値よりも長い時間がかかるoplogをログに記録するようになりました。 これらの遅い oplog メッセージ:
ログは、テキスト
applied op: <oplog entry> took <num>msを含むREPLコンポーネントの下にあります。ログレベルに依存しない(システムレベルでもコンポーネントレベルでも)
プロファイル レベルに依存しないでください。
slowOpSampleRateの影響を受けます。
プロファイラーは遅い oplog エントリをキャプチャしません。
レプリケーションラグとフロー制御
レプリケーションラグは、プライマリでの操作と、その操作のoplogからセカンダリへの適用までの間の遅延です。 多少の遅延は許容できるかもしれませんが、レプリケーションラグが大きくなると、プライマリに対するキャッシュ負荷が増大するなど、重大な問題が発生します。
管理者は、 majority committedの遅延を設定可能な最大値flowControlTargetLagSeconds以下に抑えることを目的として、プライマリが書込み (write) を適用する速度を制限できます。
デフォルトのフロー制御は、enabled です。
フロー制御が有効になっている場合、遅延が flowControlTargetLagSeconds に近づくと、プライマリでの書き込み (write) は、書き込みを適用するためのロックを行う前にチケットを取得する必要があります。フロー制御メカニズムでは、1秒あたりに発行されるチケットの数を制限することで、遅延を目標値以下に保とうとします。
詳細については、「レプリケーションラグの確認」と「フロー制御」を参照してください。
自動フェイルオーバー
プライマリが、設定された electionTimeoutMillis 時間(デフォルトは 10 秒)を超えてセットの他のノードと通信しない場合、適格なセカンダリが選挙を呼びかけ、自身を新しいプライマリに指名します。
The median time before a cluster elects a new primary should not typically exceed 12 seconds, assuming default replica configuration settings. This includes time required to mark the primary as unavailable and call and complete an election. You can tune this time period by modifying the settings.electionTimeoutMillis replication configuration option. Factors such as network latency may extend the time required for replica set elections to complete, which in turn affects the amount of time your cluster may operate without a primary. These factors are dependent on your particular cluster architecture.
electionTimeoutMillis のレプリケーション設定オプションをデフォルトの 10000(10 秒)から下げると、プライマリ障害をより早く検出できるようになります。ただし、プライマリが正常であっても、一時的なネットワーク レイテンシなどの要因により、クラスターがより頻繁に選挙を呼び出すことがあります。これにより、w : 1 書き込み (write) 操作のロールバックが増加する可能性があります。
アプリケーション接続ロジックには、自動フェールオーバーとその後の選挙に対する許容範囲が含まれている必要があります。MongoDB ドライバーはプライマリの損失を検出し、自動的に 1 回、特定の書き込み操作を再試行することで、自動フェイルオーバーと選挙の組み込み処理を追加で行います。
互換性のあるドライバでは、デフォルトで再試行可能な書き込みが有効になります
MongoDB provides mirrored reads to pre-warm electable secondary members' cache with the most recently accessed data. Pre-warming the cache of a secondary can help restore performance more quickly after an election.
MongoDB のフェイルオーバーの詳細な手順については、以下を参照してください。
読み取り操作
読み込み設定 (read preference)
By default, clients read from the primary [1]; however, clients can specify a read preference to send read operations to secondaries.
Asynchronous replication to secondaries means that reads from secondaries may return data that does not reflect the state of the data on the primary.
読み取り操作を含むトランザクションでは、読み込み設定 (read preference) primary を使用する必要があります。特定のトランザクション内のすべての操作は、同じノードにルーティングする必要があります。
レプリカセットからの読み取りについては、「読み込み設定 (read preference)」を参照してください。
データの可視性
読み取り保証(read concern)に応じて、クライアントは書込み(write)が永続的になる前にその書込みの結果を確認できます。
書き込み (write) の書込み保証 (write concern) に関係なく、
"local"または"available"の読み取り保証 (read concern) を使用する他のクライアントは、書き込み (write) 操作が発行クライアントに確認される前に、書き込み (write) 操作の結果を確認できます。"local"または"available"読み取り保証(read concern)を使用するクライアントにより、後でレプリカセットのフェイルオーバー中にロールバックされる可能性があるデータを読み取れます。
マルチドキュメントトランザクションの操作では、トランザクションがコミットされると、トランザクション内のすべてのデータ変更が保存され、トランザクションの外部に表示されます。つまり、トランザクションが他の変更をロールバックしながら、一部の変更をコミットすることはありません。
トランザクションがコミットされるまで、トランザクションで行われたデータ変更はトランザクションの外部には表示されません。
ただし、トランザクションが複数のシャードに書き込む場合、すべての外部読み取り操作が、コミットされたトランザクションの結果がシャード全体で表示されるまで待機する必要はありません。たとえば、トランザクションがコミットされ、書込み 1 がシャード A で表示されているものの、書込み 2 がシャード B にまだ表示されていない場合、読み取り保証(read concern) "local" での外部読み取りは、書き込み 2 を見ることなく書き込み 1 の結果を読み取ることができます。
MongoDB の読み取り分離、整合性、直近性の詳細については、「読み取り分離、整合性、直近性について」を参照してください。
ミラーリングされた読み取り
Mirrored reads reduce the impact of primary elections by pre-warming the caches of electable secondary replica set members before a failover occurs. The primary mirrors a sample of the supported operations it receives to electable secondaries.
ミラーリングされた読み取りを受信する electable セカンダリ レプリカセット ノードのサブセットのサイズは、mirrorReads パラメーターを使用して構成できます。詳細については、「ミラーリングされた読み取りのサポートの有効化と無効化」を参照してください。
注意
ミラーリングされた読み取りは、プライマリのクライアントへの応答には影響しません。プライマリからセカンダリにミラーリングする読み取りは、"fire-and-foreget" 操作で、プライマリは応答を待ちません。
ターゲットを絞ったミラーリングされた読み取り
MongoDB 8.2 以降では、読み取りミラーリングのノードをタグ付けすることで、キャッシュをウォームアップする必要がある特定のサーバーへ選択的に読み取り操作をミラーリングできます。一般的なミラーリングされた読み取りとは異なり、 ターゲットを絞った読み取りミラーリングでは 、非表示のノードをターゲットにして、プライマリとセカンダリ ノードの両方からミラーリングできます。
mirrorReads パラメータの targetedMirroringフィールドを使用して、対象を絞ったミラーリングされた読み取りを構成できます。
サポートされている操作
ミラーリンされた読み取りは、次の操作をサポートします:
findAndModify(具体的には、フィルターはミラーリングされた読み取りとして送信されます)update(具体的には、フィルターはミラーリングされた読み取りとして送信されます)
ミラーリングされた読み取りのサポートの有効化と無効化
ミラーリングされた読み取りはデフォルトで有効になっており、 0.01のデフォルトのsampling rateが使用されます。 ミラーリングされた読み取りを無効にするには、 mirrorReadsパラメータを{ samplingRate: 0.0 }に設定します。
db.adminCommand( { setParameter: 1, mirrorReads: { samplingRate: 0.0 } } )
With a sampling rate greater than 0.0, the primary mirrors supported reads to a subset of electable secondaries. With a sampling rate of 0.01, the primary mirrors one percent of the supported reads it receives to a selection of electable secondaries.
たとえば、1 つのプライマリと 2 つの選出可能なセカンダリで構成されるレプリカセットを考えてみましょう。プライマリがミラーリング可能な 1000 操作を受信し、サンプリングレートが 0.01 の場合、プライマリはサポートされている約 10 回の読み取りを無作為に選ばれた選出可能なセカンダリにミラーリングします。
ミラーリングされた読み取りのサンプリングレートを変更
ミラーリングされた読み取りのサンプリングレートを変更するには、mirrorReads のパラメータを0.0 より大きく 1.0 より小さい数値に設定します。
サンプリング レートが
0.0の場合、ミラーリングされた読み取りは無効になります。サンプリング レートが
0.0から1.0の間の数値の場合、プライマリは、指定されたサンプリング レートでサポートされている読み取りのランダムなサンプルを選択可能なセカンダリに転送します。A sampling rate of
1.0results in the primary forwarding all supported reads to electable secondaries.
詳細については、mirrorReads を参照してください。
ミラーリングされた読み取りのメトリクス
serverStatusコマンドとdb.serverStatus() shell メソッドでは、操作で フィールドを指定するとmirroredReadsメトリクスが返されます。
db.serverStatus( { mirroredReads: 1 } )
トランザクション
レプリカセットではマルチドキュメントトランザクションが利用できます。
読み取り操作を含むトランザクションでは、読み込み設定 (read preference) primary を使用する必要があります。特定のトランザクション内のすべての操作は、同じノードにルーティングする必要があります。
トランザクションがコミットされるまで、トランザクションで行われたデータ変更はトランザクションの外部には表示されません。
ただし、トランザクションが複数のシャードに書き込む場合、すべての外部読み取り操作が、コミットされたトランザクションの結果がシャード全体で表示されるまで待機する必要はありません。たとえば、トランザクションがコミットされ、書込み 1 がシャード A で表示されているものの、書込み 2 がシャード B にまだ表示されていない場合、読み取り保証(read concern) "local" での外部読み取りは、書き込み 2 を見ることなく書き込み 1 の結果を読み取ることができます。
変更ストリーム
変更ストリームは、 レプリカセット と シャーディングされたクラスター で使用できます。 ストリーム変更を使用すると、oplog を追尾する複雑さやリスクなく、アプリケーションがリアルタイムデータの変更にアクセスできます。 アプリケーションはストリーム変更を使用して、1 つまたは複数のコレクションのすべてのデータ変更をサブスクライブできます。
追加機能
レプリカセットは、アプリケーションのニーズをサポートするためのさまざまなオプションを提供します。たとえば、複数のデータセンターのノードを持つレプリカセットを配置したり、一部のノードの members[n].priority を調整して選挙の結果を制御したりできます。レプリカセットでは、レポート作成、障害復旧、またはバックアップ機能専用のノードもサポートします。
詳細については、「優先順位 0 のレプリカセット ノード」、 「非表示のレプリカセット ノード」、および「遅延レプリカセット ノード」を参照してください。
| [1] | (1, 2) 状況によっては、 replica set内の 2 つのノードが一時的に自分たちがプライマリであると認識することがありますが、最大でそのうちの 1 つが |