Written by TSUYOSHI

MongoDB レプリカセットのセカンダリとアービターを移行する手順 【初心者向け解説】

Docker MongoDB

以前、Dockerを使いサーバー2台でMongoDBレプリカセットを構築する方法を紹介しました。今回はこの構成でセカンダリとアービターが入ったサーバをそのまま移行する場合の手順を一例として紹介します。

簡単すぎるためか、初心者向けのレプリカセットでサーバ移行の記事がなかったため、記事を書きました。
serve1, server2Dockerを使ってレプリカセット構築をしていて、既存のserver2を新たなserver3に移行する手順を解説します。

もとの設定
sever1
 └Mongodb (Primary)
sever2
 └Mongodb (Secondary)
 └Mongodb (Arbiter)

変更後の設定
sever1 →そのまま
 └Mongodb (Primary)
server2 →廃止
sever3 →新規追加
 └Mongodb (Secondary)
 └Mongodb (Arbiter)

普通に考えれば、レプリカセットの台数増やして、不要なDBを落とすだけとなるのですが、初めてだと上手くいくのだろうかと不安になると思います。参考までですが、私が行った手順をお伝えします。

MongoDB 移行の概要

まず前提の構成をお伝えします。

もとの設定
sever1
 └Mongodb (Primary)
sever2
 └Mongodb (Secondary)
 └Mongodb (Arbiter)

これは別記事で紹介しているMongoDBのレプリカセット構築をDockerで対応する 【サーバ2台構成】のDockerを使って2台のサーバ構成でレプリカセット運用をしている(SecondaryとArbiterを1つのサーバ内で共存させている)構成から移行する例になっています。通常レプリカセットはサーバ3台以上で構成されますがDockerを使っているので2台でも運用できているという前提です。

前提となるレプリカセットの詳細は前回記事に詳しく記載していますが、参考までに以下のようなdocker-compose.yml で構築されているレプリカセットになります。今回は移行前のserver2と移行後のserver3docker-compose.yml は全く同じ設定にしています。(IPの設定だけサーバが変わるので変更になります)

▼server1

version: '3.7'

services:
  mongodb_primary:
    build: mongodb
    image: mongodb-replset
    container_name: mongodb_primary
    hostname: mongodb_primary
    entrypoint: [ "mongod", "--config", "/etc/mongod_primary.conf" ]
    volumes:
      - ./mongodb/script:/srv/mongodb/script # Initialize script
      - ./mongodb/etc/mongod-keyfile:/etc/mongod-keyfile:ro # 認証鍵作成後に有効化 Permission: 600
      - ./mongodb/db:/data/db # DBデータをマウント
      - ./mongodb/config/mongod_primary.conf:/etc/mongod_primary.conf # MongoDB設定
    ports:
      - 27017:27017
    extra_hosts:
      - "mongodb_secondary:xxx.xx.xx.x" # 実際のIPに置き換え
      - "mongodb_arbiter:xxx.xx.xx.x" # 実際のIPに置き換え
    networks:
      - container-link
    restart: on-failure

networks:
  default:
    external:
      name: bridge
  container-link:
    name: container_network

▼server2 (server3に全く同じものを作って移行する)

version: '3.7'

services:
  mongodb_secondary:
    build: mongodb
    image: mongodb-replset
    container_name: mongodb_secondary
    hostname: mongodb_secondary
    entrypoint: [ "mongod", "--config", "/etc/mongod_secondary.conf" ]
    volumes:
      - ./mongodb/etc/mongod-keyfile:/etc/mongod-keyfile:ro # 認証鍵作成後に有効化 Permission: 600
      - ./mongodb/db:/data/db # DBデータをマウント
      - ./mongodb/config/mongod_secondary.conf:/etc/mongod_secondary.conf # MongoDB設定
    ports:
      - 27018:27018
    extra_hosts:
      - "mongodb_primary:xxx.xx.xx.x" # 実際のIPに置き換え
    networks:
      - container-link
    depends_on:
      - mongodb_arbiter
    restart: on-failure

  mongodb_arbiter:
    build: mongodb
    image: mongodb-replset
    container_name: mongodb_arbiter
    hostname: mongodb_arbiter
    entrypoint: [ "mongod", "--config", "/etc/mongod_arbiter.conf" ]
    volumes:
      - ./mongodb/etc/mongod-keyfile:/etc/mongod-keyfile:ro # 認証鍵作成後に有効化 Permission: 600
      - ./mongodb/config/mongod_arbiter.conf:/etc/mongod_arbiter.conf # MongoDB設定
    ports:
      - 27019:27019
    extra_hosts:
      - "mongodb_primary:xxx.xx.xx.x" # 実際のIPに置き換え
    networks:
      - container-link
    restart: on-failure

networks:
  default:
    external:
      name: bridge
  container-link:
    name: container_network

今回はサーバ2台構成での説明をしていますが、3台以上でも読み替えていただければ同じように対応できます。
移行後は以下のようになり、構成自体は変わりません。

もとの設定
sever1
 └Mongodb (Primary)
sever2
 └Mongodb (Secondary)
 └Mongodb (Arbiter)

▼変更後の設定
sever1 →そのまま
 └Mongodb (Primary)
server2 →✗廃止
 └Mongodb (旧Secondary) →server3移行
 └Mongodb (旧Arbiter) →server3移行
sever3 →○新規追加
 └Mongodb (新Secondary)
 └Mongodb (Arbiter)

レプリカセット移行の手順

概要

順番に手順を踏んで移行作業します。
server2をいきなり、そのまま落としてしまうと、server1の「Primary」だったMongoDBは「Secondary」に降格してしまい、レプリカセットのまま移行ができません。そのため以下の手順で移行を行います。

  1. server2の「旧Secondary」を停止&削除
  2. server3で「新Secondary」を認証なしで起ち上げ
  3. server1の「Primary」で「新Secondary」を設定に追加
  4. server2の「旧Arbiter」を停止&削除
  5. server3で「新Arbiter」を認証なしで起ち上げ
  6. server1の「Primary」で「新Arbiter」を設定に追加

レプリカセットの移行

1.server2の旧Secondaryを停止&削除

旧Secondaryを停止します。Dockerを使っているのでSecondaryのコンテナを停止します。
server1の「Primary」にてserver2の旧Secondaryを設定から削除して、連携を切ります。
今回のDockerの例だと「rs.remove(“mongodb_secondary:27018”)」コマンドをPrimaryコンテナに入ってから実行します。

$ docker exec -it mongodb_primary bash
# mongo --port 27017 -u user-p user_password--authenticationDatabase test_db

replset:PRIMARY> rs.remove("mongodb_secondary:27018")

2.server3で新Secondaryを認証なしで起ち上げ

server3の新Secondaryを認証なし状態で起ち上げます。Dockerを使っているのでserver3で新SecondaryコンテナのDocker起ち上げをします。
新Secondaryが立ち上がったら、Server1のPrimary内で、server3の新Secondaryの所定のポート(今回の例だと27018番ポート)との通信ができているか疎通確認をします。
※必要に応じてプライマリにて、事前に新SecondaryIPを認識できるように設定をしておきます

3.server1Primaryで新Secondaryを追加

server1Primary内で、
rs.add({ _id: 1, host: “mongodb_secondary:27018” })
を実行して、新
Secondaryの追加をします。

$ docker exec -it mongodb_primary bash
# mongo --port 27017 -u user-p user_password--authenticationDatabase test_db
replset:PRIMARY> rs.add({ _id: 1, host: "mongodb_secondary:27018" })

server3の新Secondaryがレプリカセットに追加されました。
このときの起動状態は、以下のようになります。
sever1
 └Mongodb (Primary)
server2 →廃止する既存サーバ
 └Mongodb (旧Arbiter)
sever3 →新規追加サーバ
 └Mongodb (新Secondary)

Primary内から「rs.config()」で構成を確認、新Secondary内に入ってDBの中身を確認して問題なければ、新セカンダリを一旦落として、認証あり状態に変えて、再度、起動し直します。
再度、問題がないか動作の確認をして、問題なければ次に進みます。

4.server2の旧Arbiterを停止&削除

次にserver2の旧Arbiterを停止させます。
旧Arbiterを落としても2台だけ(Primary&新Secondary)で、プライマリ決定できる(sever1のPrimaryがレプリカセットのPrimaryになっている)ことを確認します。
Primary内にて「rs.remove(“mongodb_arbiter:27019”)」のコマンドを実行して、server2の旧Arbiterをレプリカセットの設定から外します。

$ docker exec -it mongodb_primary bash
# mongo --port 27017 -u user-p user_password--authenticationDatabase test_db
replset:PRIMARY> rs.remove("mongodb_arbiter:27019")

5.server3で新Arbiterを認証なしで起ち上げ

server3の新Arbiterを認証なし状態で起ち上げます。Dockerを使っているのでserver3で新ArbiterコンテナのDocker起ち上げをします。
新Arbiterが立ち上がったら、Server1のPrimary内で、server3の新Arbiterの所定のポート(今回の例だと27019番ポート)との通信ができているか疎通確認をします。
※必要に応じてプライマリにて、事前に新ArbiterIPを認識できるように設定をしておきます

6.server1Primaryで新Arbiterを追加

server1Primary内で、
rs.add({ _id: 2, host: “mongodb_arbiter:27019”, arbiterOnly: true })
を実行して、新
Arbiterの追加をします。

$ docker exec -it mongodb_primary bash
# mongo --port 27017 -u user-p user_password--authenticationDatabase test_db
replset:PRIMARY> rs.add({ _id: 2, host: "mongodb_arbiter:27019", arbiterOnly: true })

server3の新Arbiterがレプリカセットに追加されました。
このときの起動状態は、以下のようになります。
sever1
└Mongodb (Primary)
sever3
└Mongodb (新Secondary)
└Mongodb (新Arbiter)

Primary内からrs.config()で構成を確認して問題なければ、新Arbiterを一旦落として、認証あり状態に変えて、再度、起動し直します。

7.動作確認&完了

念の為、Primaryと新Secondaryがぞれぞれ、「Primary」「Secondary」として正常に動作しているか確認します。

問題がなければこれにて移行完了となります。

※当サイトでは一部のリンクについてアフィリエイトプログラムを利用して商品を紹介しています