MongoDB レプリカセットのセカンダリとアービターを移行する手順 【初心者向け解説】
以前、Dockerを使いサーバー2台でMongoDBレプリカセットを構築する方法を紹介しました。今回はこの構成でセカンダリとアービターが入ったサーバをそのまま移行する場合の手順を一例として紹介します。
簡単すぎるためか、初心者向けのレプリカセットでサーバ移行の記事がなかったため、記事を書きました。
serve1, server2にDockerを使ってレプリカセット構築をしていて、既存の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と移行後のserver3のdocker-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」に降格してしまい、レプリカセットのまま移行ができません。そのため以下の手順で移行を行います。
- server2の「旧Secondary」を停止&削除
- server3で「新Secondary」を認証なしで起ち上げ
- server1の「Primary」で「新Secondary」を設定に追加
- server2の「旧Arbiter」を停止&削除
- server3で「新Arbiter」を認証なしで起ち上げ
- 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番ポート)との通信ができているか疎通確認をします。
※必要に応じてプライマリにて、事前に新SecondaryのIPを認識できるように設定をしておきます
3.server1のPrimaryで新Secondaryを追加
server1のPrimary内で、
「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番ポート)との通信ができているか疎通確認をします。
※必要に応じてプライマリにて、事前に新ArbiterのIPを認識できるように設定をしておきます
6.server1のPrimaryで新Arbiterを追加
server1のPrimary内で、
「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」として正常に動作しているか確認します。
問題がなければこれにて移行完了となります。
※当サイトでは一部のリンクについてアフィリエイトプログラムを利用して商品を紹介しています