MongoDB Academy · レッスン

レプリカセットのメンバー:プライマリ、セカンダリ、アービター

各レプリカセットメンバーの役割を説明し、oplogを介してプライマリからセカンダリへ書き込みが伝播する流れを確認します。

レッスン 1/413 ステップ

「レプリカセットのメンバー:プライマリ、セカンダリ、アービター」はCoddyKit上の無料MongoDB Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはMongoDB Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 MongoDB Academyコースには全4レッスンが含まれています。

レプリカセットとは

レプリカセットは、同じデータを保持する MongoDB サーバーのグループで、高可用性と冗長性を提供します。1台のサーバーに障害が発生すると、別のサーバーが自動的に引き継ぎます。一般的なレプリカセットは3つ以上のメンバーで構成され、少なくとも1つのプライマリ、1つ以上のセカンダリ、そして必要に応じてアービターが含まれます。

プライマリ:信頼できるデータの基準

プライマリは、書き込み操作を受け付ける唯一のメンバーです。すべてのクライアントは、挿入、更新、削除をプライマリに送信します。プライマリはすべての書き込み操作をoplog(operations log)と呼ばれる特殊なログに記録し、セカンダリはそれを読み取って同期を維持します。

// Check which member is primary in mongosh
rs.isMaster()
// or
rs.status()

セカンダリ:ホットスタンバイ

セカンダリは、プライマリの oplog を継続的に追跡し、同じ操作を自身のデータコピーに適用することで、プライマリのデータを複製します。セカンダリは、適切な read preference を指定すれば読み取りクエリに応答でき、現在のプライマリが利用できなくなった場合はプライマリを引き継ぎます。

// View oplog on a secondary
use local
db.oplog.rs.find().sort({$natural: -1}).limit(5)

Oplog:レプリケーションの基盤

oplog(operations log)は、すべてのレプリカセットメンバーの local データベースに保存される特殊な capped collection です。プライマリへのすべての書き込みは oplog に追加されます。セカンダリは oplog を読み取り、各エントリを順番に再実行して、プライマリと同一のデータを維持します。oplog のサイズによって、完全な再同期が必要になる前にセカンダリがどれだけ遅延できるかが決まります。

// Check oplog size and time range
use local
db.oplog.rs.stats().maxSize
db.oplog.rs.find({},{ts:1,op:1,ns:1}).sort({$natural:-1}).limit(3)

アービター:決定票を投じるメンバー

アービターは、データを一切保持しない軽量なレプリカセットメンバーです。主な役割は、プライマリを新たに選出する際に投票して選挙に参加することです。アービターは、偶数のメンバーで構成されるセット(たとえば、データを保持するメンバーが2つある場合)で使用されます。これにより、3台目の完全なデータノードを用意するコストをかけずに、常に過半数を確保できます。

// Add an arbiter to the replica set
rs.addArb('hostname:27017')

投票と選挙の概要

各レプリカセットメンバーには投票権(0または1)があります。プライマリは過半数の投票で選出されます。3つのメンバーがそれぞれ1票を持つ場合、過半数は2票です。プライマリが停止すると、残った2つのメンバーが選挙を行い、通常は oplog が最も最新のメンバーが当選します。通常のネットワーク環境では、選挙は数秒で完了します。

// View all members and their vote configuration
rs.conf().members.forEach(m => {
  print(m.host, 'votes:', m.votes, 'priority:', m.priority)
})

メンバーの優先度

各メンバーには優先度の値(デフォルトは1)があります。優先度が高いメンバーほど、選挙でプライマリに選ばれやすくなります。優先度を0に設定すると、そのメンバーがプライマリになることを禁止できます。これは、ローカルの読み取りには対応させつつ、プライマリのリージョンからの書き込みは受け付けたくない、遠隔データセンターのセカンダリに便利です。

// Set a member to never become primary (priority 0)
let cfg = rs.conf()
cfg.members[2].priority = 0
rs.reconfig(cfg)

Hidden セカンダリと Delayed セカンダリ

Hidden セカンダリ(priority 0、hidden: true)はドライバーから見えず、プライマリ選挙の候補群に影響を与えずに、バックアップや分析専用で使用されます。Delayed セカンダリは、設定した秒数だけ意図的にプライマリから遅延させます。これにより、誤ったデータ破損が発生した場合に、遡って復旧できる時間枠を確保できます。

// Configure a delayed secondary (e.g., 1 hour behind)
let cfg = rs.conf()
cfg.members[2].hidden = true
cfg.members[2].priority = 0
cfg.members[2].secondaryDelaySecs = 3600
rs.reconfig(cfg)

レプリケーション遅延の確認

レプリケーション遅延とは、プライマリで書き込みがコミットされてから、セカンダリに反映されるまでの遅れです。遅延が大きいと、セカンダリは古いデータを返します。rs.printSecondaryReplicationInfo() を使うか、メンバー間で oplog のタイムスタンプを比較することで遅延を監視できます。Atlas には遅延アラートが組み込まれています。

// Print replication lag for each secondary
rs.printSecondaryReplicationInfo()

// Example output:
// source: secondary1:27017
// syncedTo: Sat Jun 21 2025 10:00:00
// 0 secs (0 hrs) behind the primary

rs.status() の出力を理解する

rs.status() は、レプリカセットの完全なヘルススナップショットを返します。確認すべき主なフィールドは、stateStr(PRIMARY / SECONDARY / ARBITER / DOWN)、optimeDate(最後に適用された oplog エントリ)、health(1 = 正常、0 = 到達不能)、そして問題のあるメンバーのエラー詳細を示す lastHeartbeatMessage です。

rs.status().members.forEach(m => {
  print(m.name, m.stateStr, 'health:', m.health)
})

データ書き込みの一連の流れ

クライアントがドキュメントを書き込むときの流れは次のとおりです。1) ドライバーがプライマリに書き込みを送信します。2) プライマリが WiredTiger ストレージに書き込みを適用します。3) プライマリが操作を自身の oplog に追加します。4) セカンダリが oplog エントリを取得して適用します。5) プライマリが設定された writeConcern に従ってクライアントに応答します。

// Write with w:majority ensures secondaries have acknowledged
db.orders.insertOne(
  { item: 'laptop', qty: 1 },
  { writeConcern: { w: 'majority', wtimeout: 5000 } }
)

理解度チェック

このレッスンで学んだ MongoDB & NoSQL Databases の概念について、理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、プライマリがすべての書き込みを受け付け、oplog に記録すること、セカンダリが oplog から複製して同一のコピーを維持すること、そしてアービターはデータを保持せず、選挙で投票することを学びました。次は、現在のプライマリに障害が発生したときに MongoDB が新しいプライマリを自動的に選出する仕組みを見ていきます。

無料で開始

AI チューターと学ぶ JavaScript — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
30
レッスン
120

よくある質問

「レプリカセットのメンバー:プライマリ、セカンダリ、アービター」レッスンは無料ですか?

はい。「レプリカセットのメンバー:プライマリ、セカンダリ、アービター」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、MongoDB Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 MongoDB Academyコースには全4レッスンが含まれています。

「レプリカセットのメンバー:プライマリ、セカンダリ、アービター」で何を学びますか?

各レプリカセットメンバーの役割を説明し、oplogを介してプライマリからセカンダリへ書き込みが伝播する流れを確認します。 ブラウザで直接実行するハンズオンコードでMongoDB Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

MongoDB Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのMongoDB Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「レプリカセットのメンバー:プライマリ、セカンダリ、アービター」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このMongoDB Academyレッスンでコードを書いて実行できますか?

はい。すべてのMongoDB Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. レプリカセットのメンバー:プライマリ、セカンダリ、アービター
  2. 選挙と自動フェイルオーバー
  3. 書き込み確認と耐久性の保証
  4. 読み取り設定:読み取り負荷の分散
← MongoDB Academyに戻る