MongoDB の レプリカセットで 特定メンバー を プライマリ に昇格させる 方法

0 件のコメント

今回は「MongoDBの特定レプリカセットメンバーを強制的にプライマリサーバーにする方法」についてまとめます。

前提状況

今回は以下のような状況( _id: 1 がプライマリ、 _id: 0 および _id: 2 はセカンダリ)で、 _id: 0 をプライマリにする方法を見ていきます。

変更する方法は以下の2通りが考えられます。

  • 優先度の調整で変更する
  • コマンドで変更する

「優先度調整」は設定変更なので、サーバースペックが異なるなど恒久的にあるサーバーを優先的にプライマリサーバーとしたい場合に有効な手段になります。 「コマンド」は一時的な変更なので動作確認やテストなどの用途での利用になるかと思います。

優先度の調整で変更する

mongoシェルコマンドの rs.config() および rs.reconfig() を利用して優先度を変更することで特定メンバーをプライマリに昇格させます。 設定変更なので一度実行すると基本的に特定サーバーがプライマリサーバーに昇格するようになります。 例えば、一度ダウンしてレプリカセットから外れた後、再び復活してレプリカセットへ参加した際にセカンダリとして参加してすぐプライマリへ昇格する動作を行います。

  1. プライマリサーバーへ接続

    rs.reconfig() はプライマリサーバー上でしか実行できないので、プライマリサーバーへ接続します。

    mongo --host 127.0.0.1:8002
    
  2. 現在の設定を取得

    PRIMARY> config = rs.config()
    
  3. 設定値を修正

    PRIMARY> config.members[0].priority = 2
    PRIMARY> config.members[1].priority = 1
    PRIMARY> config.members[2].priority = 1
    
  4. 修正した設定値を適用

    PRIMARY> rs.reconfig(config)
    
  5. 一度 mongoシェル 接続を切断

    PRIMARY> exit
    
  6. 10秒程度待って(プライマリサーバーの変更処理が終わるのを待って)任意のサーバーへ接続

    mongo --host 127.0.0.1:8001
    
  7. 変更結果を確認

    PRIMARY> rs.status()
    {
      ...
      "members" : [
        {
          "_id" : 0,
          "name" : "127.0.0.1:8001",
          "health" : 1,
          "state" : 1,
          "stateStr" : "PRIMARY",
          ...
        },
        {
          "_id" : 1,
          "name" : "127.0.0.1:8002",
          "health" : 1,
          "state" : 2,
          "stateStr" : "SECONDARY",
          ...
        },
        {
          "_id" : 2,
          "name" : "127.0.0.1:8003",
          "health" : 1,
          "state" : 2,
          "stateStr" : "SECONDARY",
          ...
        }
      ],
      ...
    }
    

コマンドで変更する

mongoシェルコマンドの rs.freeze() および rs.stepDown() を利用して変更することができます。 コマンドそれぞれの動作概略は以下の通りです。

  • rs.freeze()

    指定された時間(秒)の間、プライマリに昇格しなくなります。

  • rs.stepDown()

    指定された時間(秒)の間、セカンダリに降格して次のプライマリサーバー選出を行います。

以下では実際に上記コマンドを利用してプライマリサーバーに変更する手順を載せます。

  1. プライマリにしたくないサーバーへ接続

    mongo --host 127.0.0.1:8003
    
  2. rs.freeze() を実行してプライマリ昇格を抑止

    SECONDARY> rs.freeze(120)
    
  3. mongoシェル接続を切断

    SECONDARY> exit
    
  4. 現在のプライマリサーバーへ接続

    mongo --host 127.0.0.1:8002
    
  5. rs.stepDown() を実行してセカンダリに降格

    PRIMARY> rs.stepDown(120)
    
  6. 一度 mongoシェル 接続を切断

    PRIMARY> exit
    
  7. 10秒程度待って(プライマリサーバーの変更処理が終わるのを待って)任意のサーバーへ接続

    mongo --host 127.0.0.1:8001
    
  8. 変更結果を確認

    PRIMARY> rs.status()
    {
      ...
      "members" : [
        {
          "_id" : 0,
          "name" : "127.0.0.1:8001",
          "health" : 1,
          "state" : 1,
          "stateStr" : "PRIMARY",
          ...
        },
        {
          "_id" : 1,
          "name" : "127.0.0.1:8002",
          "health" : 1,
          "state" : 2,
          "stateStr" : "SECONDARY",
          ...
        },
        {
          "_id" : 2,
          "name" : "127.0.0.1:8003",
          "health" : 1,
          "state" : 2,
          "stateStr" : "SECONDARY",
          ...
        }
      ],
      ...
    }
    

今回は「MongoDBの特定レプリカセットメンバーを強制的にプライマリサーバーにする方法」についてまとめました。 ポイントは以下の通りです。

  • 優先度変更は恒久的な対応
  • コマンド変更は一時的な対応

参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!

最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!