Docs Menu
Docs Home
/
MongoDB マニュアル
/ / /

自己管理型レプリカセット内のホスト名の変更

項目一覧

  • Overview
  • 仮定
  • レプリカセットの可用性を維持しながらホスト名を変更する
  • すべてのホスト名を同時に変更する

ほとんどのレプリカセットでは、 members[n].hostフィールドのホスト名は変更されません。 ただし、組織のニーズが変わった場合は、一部またはすべてのホスト名の移行が必要になる場合があります。

注意

混乱や複雑さを避けるために、レプリカセット構成の members[n].host フィールドの値には常に解決可能なホスト名を使用してください。

重要

IP アドレスの変更による構成の更新を防ぐには、IP アドレスの代わりに DNS ホスト名を使用します。レプリカセット ノードまたはシャーディングされたクラスター ノードを設定するときは、IP アドレスではなく DNS ホスト名を使用することが特に重要です。

分裂されたネットワーク ホライズン全体でクラスターを構成するには、IP アドレスの代わりにホスト名を使用します。 MongoDB 5.0以降、IP アドレスのみが設定されているノードは起動時の検証に失敗し、起動しません。

このドキュメントでは、 members[n].hostフィールドのホスト名を変更するための 2 つの個別の手順について説明します。次のいずれかの方法を使用してください。

  • 可用性 を中断せずにホスト名を変更します。 このアプローチにより、アプリケーションはいつでもレプリカセットへのデータの読み取りと書込みを実行できるようになりますが、このアプローチには長い時間がかかる可能性があり、アプリケーション層のダウンタイムが発生する可能性があります。

    最初の手順を使用する場合は、古い場所と新しい場所の両方にあるレプリカセットに接続するようにアプリケーションを構成する必要があります。このため、多くの場合、アプリケーション レイヤーでの再起動と再構成が必要になり、アプリケーションの可用性に影響する可能性があります。アプリケーションの再構成については、このドキュメントの範囲外です。

  • 古いホスト名で実行されているすべてのノードを一度に 停止します。 このアプローチのメンテナンスウィンドウは短くなりますが、操作中はレプリカセットは使用できなくなります。

Tip

以下も参照してください。

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

配置に最も適した手順を使用してください。

この手順では上記の仮定を使用します。

  1. レプリカセット内の各セカンダリについて、次の一連の操作を実行します。

    1. セカンダリを停止します。

    2. 新しい場所でセカンダリを再起動します。

    3. mongoshをレプリカセットのプライマリに接続します。 この例では、プライマリはポート27017で実行されているため、次のコマンドを発行します。

      mongosh --port 27017
    4. rs.reconfig() を使用して、レプリカセット構成ドキュメントを新しいホスト名でアップデートします。

      たとえば、次のコマンド シーケンスは、レプリカ セット構成ドキュメント内の members 配列の配列インデックス 1(配線:members[1])にあるセカンダリのホスト名をアップデートします。

      cfg = rs.conf()
      cfg.members[1].host = "mongodb1.example.net:27017"
      rs.reconfig(cfg)

      構成ドキュメントのアップデートの詳細については、「」を参照してください。

    5. クライアント アプリケーションが新しい場所にあるセットにアクセスでき、セカンダリがセットの他のノードと同期する機会があることを確認します。

      セット内のプライマリ以外のノードごとに上記の手順を繰り返します。

  2. mongoshをプライマリに接続し、 rs.stepDown()の方法を使用してプライマリを降格します。

    rs.stepDown()

    レプリカセットは別のノードをプライマリに選びます。

  3. ステップダウンが成功したら、古いプライマリをシャットダウンします。

  4. 新しい場所で新しいプライマリとなる mongod インスタンスを起動します。

  5. 先ほど選んだ現在のプライマリに接続し、新しいプライマリになるノードのホスト名を使用して レプリカセット構成ドキュメント を更新します。

    たとえば、古いプライマリが位置 0 にあり、新しいプライマリのホスト名が mongodb0.example.net:27017 である場合は、次を実行します。

    cfg = rs.conf()
    cfg.members[0].host = "mongodb0.example.net:27017"
    rs.reconfig(cfg)
  6. mongoshを新しいプライマリに接続します。

  7. 新しい構成を確認するには、mongoshrs.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 特権アクションが必要です。

必要な特権を提供するロールを作成するには、次に手順に従います。

  1. userAdminAnyDatabaseロールを持つユーザーなど、ユーザーとロールを管理する特権を持つユーザーとしてログインします。 次の手順では、 「 自己管理型配置でアクセス制御を有効にする 」で作成されたmyUserAdminを使用します。

    mongosh --port 27017 -u myUserAdmin --authenticationDatabase 'admin' -p
  2. local データベースの system.replset コレクションに必要な特権を提供するユーザー ロールを作成します。

    db.adminCommand( {
    createRole: "systemreplsetRole",
    privileges: [
    { resource: { db: "local", collection: "system.replset" }, actions: ["find","update"] }
    ],
    roles: []
    } );
  3. 名前変更手順を実行するユーザーにロールを付与します。たとえば、次の例では、admin データベースにユーザー "userPerformingRename" が存在すると想定しています。

    use admin
    db.grantRolesToUser( "userPerformingRename", [ { role: "systemreplsetRole", db: "admin" } ] );
  1. レプリカセット内のすべてのノードを停止します。

  2. --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 アドレスのみが設定されているノードは起動時の検証に失敗し、起動しません。

  3. レプリカセットの各ノードに対して、次の一連の操作を実行します。

    1. mongoshを新しい一時ポートで実行されているmongodに接続します。 たとえば、一時ポート37017で実行されているノードの場合は、次のコマンドを発行します。

      mongosh --port 37017

      実行中にアクセス制御が有効な場合、適切な権限を持つユーザーとして接続します。 「前提条件 」を参照してください。

      mongosh --port 37017 -u userPerformingRename --authenticationDatabase=admin -p
    2. レプリカセットの設定を手動で編集します。レプリカセットの構成は、local データベース内の system.replset コレクション内の唯一のドキュメントです。


      ホスト名を変更するには、レプリカセットの構成を編集して、レプリカセットのすべてのノードに新しいホスト名とポートを指定します。

      1. local データベースに切り替えます。

        use local
      2. 構成ドキュメントの JavaScript 変数を作成します。_id フィールドの値をレプリカセットに合わせて変更します。

        cfg = db.system.replset.findOne( { "_id": "rs0" } )
      3. レプリカセットの各ノードに新しいホスト名とポートを指定します。レプリカセットに合わせてホスト名とポートを変更します。

        cfg.members[0].host = "mongodb0.example.net:27017"
        cfg.members[1].host = "mongodb1.example.net:27017"
        cfg.members[2].host = "mongodb2.example.net:27017"
      4. system.replset コレクション内のホスト名とポートをアップデートします。

        db.system.replset.updateOne( { "_id": "rs0" }, { $set: cfg } )
      5. 変更を確認します。

        db.system.replset.find( {}, { "members.host": 1 } )
    3. ノード上の mongod プロセスを停止します。

  4. セットのすべてのノードを再構成した後、通常の方法で各 mongod インスタンスを起動します。つまり、通常のポート番号を使用し、--replSet オプションを使用します。例:

    警告

    非ローカルホスト(例: (一般にアクセス可能な)IP アドレスを使用して、クラスターを不正アクセスから保護していることを確認します。 セキュリティ推奨事項の完全なリストについては、「自己管理型配置のセキュリティ チェックリスト」を参照してください。 最低限、認証を有効化し、ネットワーク インフラストラクチャの強化 を検討してください。

    mongod --dbpath /data/db1/ --port 27017 --replSet rs0 --bind_ip localhost,<hostname(s)|ip address(es)>
  5. mongosh を使用して、mongod インスタンスの 1 つに接続します。たとえば次のとおりです。

    mongosh --port 27017
  6. 新しい構成を確認するには、mongoshrs.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"
    }
    ]
    }

戻る

自己管理型連鎖レプリケーション