自己管理型レプリカセットの配置
このチュートリアルでは、 アクセス制御 をmongod
無効にして実行されている既存の 3 つの インスタンスから 3 ノードの レプリカセット を作成する方法について説明します。
アクセス制御を有効にしてレプリカセットを配置するには、 「 キーファイル認証を使用して自己管理型レプリカセットを配置する 」を参照してください。 単一の MongoDB インスタンスからレプリカセットを配置する場合は、「スタンドアロンの自己管理型 mongod をレプリカセットに変換する」を参照してください。 レプリカセット配置の詳細については、「レプリケーションとレプリカセット配置のアーキテクチャ」のドキュメントを参照してください。
Overview
3 つのノードのレプリカセットは、ほとんどのネットワーク パーティションの分断やその他のシステム障害に耐えられる十分な冗長性を提供します。これらのセットには、多くの分散された読み取り操作を実行するのに十分なキャパシティーもあります。レプリカセットに存在するノードの数は、常に奇数であることが必要です。これにより、選挙が円滑に進むことが保証されます。レプリカセットの設計の詳細については、「レプリケーションの概要」を参照してください。
このページでは、レプリカセットを自己管理型配置に配置する方法について説明します。
MongoDB Atlas でホストされている配置のレプリカセットを配置する方法の詳細については、「 クラスターの作成」を参照してください。
要件
実稼働環境では、 mongod
インスタンスを別々のマシンでホストして、ノード間の分離を可能な限り維持する必要があります。実稼働環境で仮想マシンを使用する場合は、冗長電源回路と冗長ネットワーク パスを備えた個別のホスト サーバーに各mongod
インスタンスを配置する必要があります。
レプリカセットを展開する前に、レプリカセットの一部となる各システムに MongoDB をインストールする必要があります。MongoDB をまだインストールしていない場合は、インストール チュートリアルを参照してください。
レプリカセットをデプロイする際の考慮事項
アーキテクチャ
本番環境では、レプリカセットの各ノードを別個のマシンにデプロイします。可能であれば、MongoDB がデフォルトのポート27017
でリッスンするようにしてください。
詳細については、「レプリカセットの配置アーキテクチャ」を参照してください。
ホスト名
重要
IP アドレスの変更による構成の更新を防ぐには、IP アドレスの代わりに DNS ホスト名を使用します。レプリカセット ノードまたはシャーディングされたクラスター ノードを設定するときは、IP アドレスではなく DNS ホスト名を使用することが特に重要です。
分裂されたネットワーク ホライズン全体でクラスターを構成するには、IP アドレスの代わりにホスト名を使用します。 MongoDB 5.0以降、IP アドレスのみが設定されているノードは起動時の検証に失敗し、起動しません。
IP バインディング
--bind_ip
オプションを使用して、MongoDB が設定されたアドレス上のアプリケーションからの接続をリッスンするようにします。
警告
非ローカルホスト(例: (一般にアクセス可能な)IP アドレスを使用して、クラスターを不正アクセスから保護していることを確認します。 セキュリティ推奨事項の完全なリストについては、「自己管理型配置のセキュリティ チェックリスト」を参照してください。 最低限、認証を有効化し、ネットワーク インフラストラクチャの強化 を検討してください。
MongoDB バイナリ(mongod
と mongos
)は、デフォルトで localhost にバインドされます。バイナリに net.ipv6
構成ファイルや --ipv6
コマンド ライン オプションが設定されている場合、バイナリはローカルホストの IPv6 アドレスに追加でバインドされます。
デフォルトでは、localhost にバインドされている mongod
と mongos
は、同じコンピューター上で実行中のクライアントによる接続のみを受け入れます。このバインディング動作には、mongosh
や、レプリカセットやシャーディングされたクラスターのノードなどが含まれます。リモート クライアントは、ローカルホストのみにバインドされているバイナリには接続できません。
デフォルトのバインドをオーバーライドして、他の IP アドレスにバインドするには、net.bindIp
構成ファイル設定や --bind_ip
コマンド ライン オプションを使用して、ホスト名または IP アドレスのリストを指定します。
警告
MongDB5.0 以降、 スプリットホライズンDNS IP アドレスのみが設定されているノードは起動時の検証に失敗し、エラーを報告します。詳しくはdisableSplitHorizonIPCheck
を参照してください。
たとえば、次の mongod
インスタンスは、IP アドレス 198.51.100.1
に関連付けられているローカルホストとホスト名 My-Example-Associated-Hostname
の両方にバインドします。
mongod --bind_ip localhost,My-Example-Associated-Hostname
このインスタンスに接続するには、リモート クライアントはホスト名またはそれに関連付けられた IP アドレス198.51.100.1
を指定する必要があります。
mongosh --host My-Example-Associated-Hostname mongosh --host 198.51.100.1
接続性
セットのすべてのノードとネットワーク内のすべてのクライアント間でネットワーク トラフィックが安全に通過できることを確認します。
次の点を考慮してください。
仮想プライベートネットワークを確立します。ネットワークトポロジーが、ローカルエリアネットワークを介して単一サイト内のノード間のすべてのトラフィックをルーティングするようにしてください。
不明なクライアントからのレプリカセットへの接続を防止するためにアクセス制御を構成します。
ネットワークとファイアウォールのルールを設定して、受信パケットと送信パケットがデフォルトの MongoDB ポートでのみ、デプロイ内からのみ許可されるようにします。IP バインディングに関する考慮事項を参照してください。
レプリカセットの各メンバーに、解決可能な DNS またはホスト名を使用してアクセスできることを確認します。DNS 名を適切に構成するか、この構成を反映するようにシステムの/etc/hosts
ファイルを設定する必要があります。
各ノードは他のすべてのノードに接続できる必要があります。接続を確認する方法については、「すべてのノード間の接続をテストする」を参照してください。
構成
MongoDB の配置前に、MongoDB がデータ ファイルを保存するディレクトリを作成します。
/etc/mongod.conf
または関係するロケーションに保存された構成ファイルでmongod
を指定します。
構成オプションの詳細については、「自己管理型構成ファイル オプション 」を参照してください。
ターミナルでのレプリカセットの配置
このチュートリアルでは、 アクセス制御を無効にして実行されている 3 つの既存のmongod
インスタンスから 3 ノードのレプリカセットを作成する方法について説明します。
アクセス制御を有効にしてレプリカセットを配置するには、 「 キーファイル認証を使用して自己管理型レプリカセットを配置する 」を参照してください。 単一の MongoDB インスタンスからレプリカセットを配置する場合は、「スタンドアロンの自己管理型 mongod をレプリカセットに変換する」を参照してください。 レプリカセット配置の詳細については、「レプリケーションとレプリカセット配置のアーキテクチャ」のドキュメントを参照してください。
適切なオプションを使用してレプリカセットの各ノードを起動します。
各メンバーに対して、次の設定でmongod
インスタンスを開始します。
レプリカセット名に
replication.replSetName
オプションを設定します。アプリケーションが複数のレプリカセットに接続する場合、各セットには異なる名前を付ける必要があります。net.bindIp
オプションをホスト名/IP またはカンマ区切りのホスト名/IP リストに設定します。配置に応じて、その他の設定を行います。
このチュートリアルでは、3 つのmongod
インスタンスが次のホストに関連付けられています。
レプリカセット ノード | Hostname |
---|---|
Member 0 | mongodb0.example.net |
Member 1 | mongodb1.example.net |
Member 2 | mongodb2.example.net |
次の例では、 --replSet
および--bind_ip
コマンドライン オプションを使用してレプリカセット名と IP バインディングを指定します。
警告
非ローカルホスト(例: (一般にアクセス可能な)IP アドレスを使用して、クラスターを不正アクセスから保護していることを確認します。 セキュリティ推奨事項の完全なリストについては、「自己管理型配置のセキュリティ チェックリスト」を参照してください。 最低限、認証を有効化し、ネットワーク インフラストラクチャの強化 を検討してください。
mongod --replSet "rs0" --bind_ip localhost,<hostname(s)|ip address(es)>
<hostname(s)|ip address(es)>
には、リモート クライアント(レプリカセットの他のノードを含む)がインスタンスに接続するために使用できるmongod
インスタンスのホスト名や IP アドレスを指定します。
あるいは、構成ファイルでreplica set name
とip addresses
を指定することもできます。
replication: replSetName: "rs0" net: bindIp: localhost,<hostname(s)|ip address(es)>
構成ファイルを使用してmongod
を起動するには、 --config
オプションを使用して構成ファイルのパスを指定します。
mongod --config <path-to-config>
本番環境では、このプロセスを管理する init スクリプトを設定できます。init スクリプトは、このドキュメントの範囲外です。
レプリカセットを開始します。
mongosh
から、レプリカセット ノード0でrs.initiate()
を実行します。
重要
必ず 1 件のmongod
インスタンス上でのみrs.initiate()
を実行します。
重要
IP アドレスの変更による構成の更新を防ぐには、IP アドレスの代わりに DNS ホスト名を使用します。レプリカセット ノードまたはシャーディングされたクラスター ノードを設定するときは、IP アドレスではなく DNS ホスト名を使用することが特に重要です。
分裂されたネットワーク ホライズン全体でクラスターを構成するには、IP アドレスの代わりにホスト名を使用します。 MongoDB 5.0以降、IP アドレスのみが設定されているノードは起動時の検証に失敗し、起動しません。
rs.initiate( { _id : "rs0", members: [ { _id: 0, host: "mongodb0.example.net:27017" }, { _id: 1, host: "mongodb1.example.net:27017" }, { _id: 2, host: "mongodb2.example.net:27017" } ] })
MongoDB は、デフォルトのレプリカセット構成を使用してレプリカセットを開始します。
レプリカセットの構成を表示します。
レプリカセットの構成オブジェクトを表示するには、rs.conf()
を使用します。
rs.conf()
レプリカセットの構成オブジェクトは次のようになります。
{ "_id" : "rs0", "version" : 1, "protocolVersion" : NumberLong(1), "members" : [ { "_id" : 0, "host" : "mongodb0.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "secondaryDelaySecs" : NumberLong(0), "votes" : 1 }, { "_id" : 1, "host" : "mongodb1.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "secondaryDelaySecs" : NumberLong(0), "votes" : 1 }, { "_id" : 2, "host" : "mongodb2.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "secondaryDelaySecs" : NumberLong(0), "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatIntervalMillis" : 2000, "heartbeatTimeoutSecs" : 10, "electionTimeoutMillis" : 10000, "catchUpTimeoutMillis" : -1, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 }, "replicaSetId" : ObjectId("585ab9df685f726db2c6a840") } }
レプリカセットにプライマリがあることを確認します。
レプリカセット内のプライマリを識別するには、 rs.status()
を使用します。