自己管理型レプリカセット内のホスト名の変更
ほとんどのレプリカセットでは、 members[n].host
フィールドのホスト名は変更されません。 ただし、組織のニーズが変わった場合は、一部またはすべてのホスト名の移行が必要になる場合があります。
注意
混乱や複雑さを避けるために、レプリカセット構成の members[n].host
フィールドの値には常に解決可能なホスト名を使用してください。
重要
IP アドレスの変更による構成の更新を防ぐには、IP アドレスの代わりに DNS ホスト名を使用します。レプリカセット ノードまたはシャーディングされたクラスター ノードを設定するときは、IP アドレスではなく DNS ホスト名を使用することが特に重要です。
分裂されたネットワーク ホライズン全体でクラスターを構成するには、IP アドレスの代わりにホスト名を使用します。 MongoDB 5.0以降、IP アドレスのみが設定されているノードは起動時の検証に失敗し、起動しません。
Overview
このドキュメントでは、 members[n].host
フィールドのホスト名を変更するための 2 つの個別の手順について説明します。次のいずれかの方法を使用してください。
可用性 を中断せずにホスト名を変更します。 このアプローチにより、アプリケーションはいつでもレプリカセットへのデータの読み取りと書込みを実行できるようになりますが、このアプローチには長い時間がかかる可能性があり、アプリケーション層のダウンタイムが発生する可能性があります。
最初の手順を使用する場合は、古い場所と新しい場所の両方にあるレプリカセットに接続するようにアプリケーションを構成する必要があります。このため、多くの場合、アプリケーション レイヤーでの再起動と再構成が必要になり、アプリケーションの可用性に影響する可能性があります。アプリケーションの再構成については、このドキュメントの範囲外です。
古いホスト名で実行されているすべてのノードを一度に 停止します。 このアプローチのメンテナンスウィンドウは短くなりますが、操作中はレプリカセットは使用できなくなります。
仮定
3 つのノードを含むレプリカセットがある場合は次のようになります。
database0.example.com:27017
(プライマリ)database1.example.com:27017
database2.example.com:27017
そして、次の rs.conf()
出力がある場合。
{ "_id" : "rs", "version" : 3, "members" : [ { "_id" : 0, "host" : "database0.example.com:27017" }, { "_id" : 1, "host" : "database1.example.com:27017" }, { "_id" : 2, "host" : "database2.example.com:27017" } ] }
次の手順で、ノードのホスト名を次のように変更します。
mongodb0.example.net:27017
(プライマリ)mongodb1.example.net:27017
mongodb2.example.net:27017
配置に最も適した手順を使用してください。
レプリカセットの可用性を維持しながらホスト名を変更する
この手順では上記の仮定を使用します。
レプリカセット内の各セカンダリについて、次の一連の操作を実行します。
セカンダリを停止します。
新しい場所でセカンダリを再起動します。
mongosh
をレプリカセットのプライマリに接続します。 この例では、プライマリはポート27017
で実行されているため、次のコマンドを発行します。mongosh --port 27017 rs.reconfig()
を使用して、レプリカセット構成ドキュメントを新しいホスト名でアップデートします。たとえば、次のコマンド シーケンスは、レプリカ セット構成ドキュメント内の
members
配列の配列インデックス1
(配線:members[1]
)にあるセカンダリのホスト名をアップデートします。cfg = rs.conf() cfg.members[1].host = "mongodb1.example.net:27017" rs.reconfig(cfg) 構成ドキュメントのアップデートの詳細については、「例」を参照してください。
クライアント アプリケーションが新しい場所にあるセットにアクセスでき、セカンダリがセットの他のノードと同期する機会があることを確認します。
セット内のプライマリ以外のノードごとに上記の手順を繰り返します。
mongosh
をプライマリに接続し、rs.stepDown()
の方法を使用してプライマリを降格します。rs.stepDown() レプリカセットは別のノードをプライマリに選びます。
ステップダウンが成功したら、古いプライマリをシャットダウンします。
新しい場所で新しいプライマリとなる
mongod
インスタンスを起動します。先ほど選んだ現在のプライマリに接続し、新しいプライマリになるノードのホスト名を使用して レプリカセット構成ドキュメント を更新します。
たとえば、古いプライマリが位置
0
にあり、新しいプライマリのホスト名がmongodb0.example.net:27017
である場合は、次を実行します。cfg = rs.conf() cfg.members[0].host = "mongodb0.example.net:27017" rs.reconfig(cfg) mongosh
を新しいプライマリに接続します。新しい構成を確認するには、
mongosh
でrs.conf()
を呼び出します。出力は次のようになります。
{ "_id" : "rs", "version" : 4, "members" : [ { "_id" : 0, "host" : "mongodb0.example.net:27017" }, { "_id" : 1, "host" : "mongodb1.example.net:27017" }, { "_id" : 2, "host" : "mongodb2.example.net:27017" } ] }
すべてのホスト名を同時に変更する
この手順では上記の仮定を使用します。
前提条件
次の手順では、local
データベース内の system.replset
コレクションを読み取ってアップデートします。
配置でアクセス制御を適用する場合、手順を実行するユーザーには、 system.replset
コレクションに対する find
および update
特権アクションが必要です。
必要な特権を提供するロールを作成するには、次に手順に従います。
userAdminAnyDatabase
ロールを持つユーザーなど、ユーザーとロールを管理する特権を持つユーザーとしてログインします。 次の手順では、 「 自己管理型配置でアクセス制御を有効にする 」で作成されたmyUserAdmin
を使用します。mongosh --port 27017 -u myUserAdmin --authenticationDatabase 'admin' -p local
データベースのsystem.replset
コレクションに必要な特権を提供するユーザー ロールを作成します。db.adminCommand( { createRole: "systemreplsetRole", privileges: [ { resource: { db: "local", collection: "system.replset" }, actions: ["find","update"] } ], roles: [] } ); 名前変更手順を実行するユーザーにロールを付与します。たとえば、次の例では、
admin
データベースにユーザー"userPerformingRename"
が存在すると想定しています。use admin db.grantRolesToUser( "userPerformingRename", [ { role: "systemreplsetRole", db: "admin" } ] );
手順
レプリカセット内のすべてのノードを停止します。
--replSet
ランタイム オプションを使用せずに、異なるポートで再起動します。メンテナンス中にポート番号を変更すると、メンテナンスの実行中にクライアントがこのホストに接続できなくなります。ノードの通常の--dbpath
を使用します。この例では、/data/db1
です。次のようなコマンドを使用します。警告
非ローカルホスト(例: (一般にアクセス可能な)IP アドレスを使用して、クラスターを不正アクセスから保護していることを確認します。 セキュリティ推奨事項の完全なリストについては、「自己管理型配置のセキュリティ チェックリスト」を参照してください。 最低限、認証を有効化し、ネットワーク インフラストラクチャの強化 を検討してください。
mongod --dbpath /data/db1/ --port 37017 --bind_ip localhost,<hostname(s)|ip address(es)> 重要
IP アドレスの変更による構成の更新を防ぐには、IP アドレスの代わりに DNS ホスト名を使用します。レプリカセット ノードまたはシャーディングされたクラスター ノードを設定するときは、IP アドレスではなく DNS ホスト名を使用することが特に重要です。
分裂されたネットワーク ホライズン全体でクラスターを構成するには、IP アドレスの代わりにホスト名を使用します。 MongoDB 5.0以降、IP アドレスのみが設定されているノードは起動時の検証に失敗し、起動しません。
レプリカセットの各ノードに対して、次の一連の操作を実行します。
mongosh
を新しい一時ポートで実行されているmongod
に接続します。 たとえば、一時ポート37017
で実行されているノードの場合は、次のコマンドを発行します。mongosh --port 37017 実行中にアクセス制御が有効な場合、適切な権限を持つユーザーとして接続します。 「前提条件 」を参照してください。
mongosh --port 37017 -u userPerformingRename --authenticationDatabase=admin -p レプリカセットの設定を手動で編集します。レプリカセットの構成は、
local
データベース内のsystem.replset
コレクション内の唯一のドキュメントです。ホスト名を変更するには、レプリカセットの構成を編集して、レプリカセットのすべてのノードに新しいホスト名とポートを指定します。
local
データベースに切り替えます。use local 構成ドキュメントの JavaScript 変数を作成します。
_id
フィールドの値をレプリカセットに合わせて変更します。cfg = db.system.replset.findOne( { "_id": "rs0" } ) レプリカセットの各ノードに新しいホスト名とポートを指定します。レプリカセットに合わせてホスト名とポートを変更します。
cfg.members[0].host = "mongodb0.example.net:27017" cfg.members[1].host = "mongodb1.example.net:27017" cfg.members[2].host = "mongodb2.example.net:27017" system.replset
コレクション内のホスト名とポートをアップデートします。db.system.replset.updateOne( { "_id": "rs0" }, { $set: cfg } ) 変更を確認します。
db.system.replset.find( {}, { "members.host": 1 } )
ノード上の
mongod
プロセスを停止します。
セットのすべてのノードを再構成した後、通常の方法で各
mongod
インスタンスを起動します。つまり、通常のポート番号を使用し、--replSet
オプションを使用します。例:警告
非ローカルホスト(例: (一般にアクセス可能な)IP アドレスを使用して、クラスターを不正アクセスから保護していることを確認します。 セキュリティ推奨事項の完全なリストについては、「自己管理型配置のセキュリティ チェックリスト」を参照してください。 最低限、認証を有効化し、ネットワーク インフラストラクチャの強化 を検討してください。
mongod --dbpath /data/db1/ --port 27017 --replSet rs0 --bind_ip localhost,<hostname(s)|ip address(es)> mongosh
を使用して、mongod
インスタンスの 1 つに接続します。たとえば次のとおりです。mongosh --port 27017 新しい構成を確認するには、
mongosh
でrs.conf()
を呼び出します。出力は次のようになります。
{ "_id" : "rs0", "version" : 4, "members" : [ { "_id" : 0, "host" : "mongodb0.example.net:27017" }, { "_id" : 1, "host" : "mongodb1.example.net:27017" }, { "_id" : 2, "host" : "mongodb2.example.net:27017" } ] }