本稿では、Docker Compose を活用して高可用性を確保した MongoDB レプリカセット環境を迅速に構築する方法を解説します。単体インスタンスとは異なり、レプリカセットは主節点と複数の从節点から構成され、障害発生時でも自動的にフェイルオーバーが行われるため、実運用環境で広く採用されています。
1. 環境準備
まず、最小3ノードのレプリカセットを構成するために、各ノードのデータディレクトリを事前に作成します。
mkdir -p /opt/mongodb/data/node1
mkdir -p /opt/mongodb/data/node2
mkdir -p /opt/mongodb/data/node3
レプリカセット間での認証には keyFile が使用されます。全ノードで同一の鍵ファイルを共有することで、メンバー間の信頼関係を確立します。
cd /opt/mongodb
openssl rand -base64 666 > mongodb.key
2. docker-compose.yml の設定
以下の設定ファイルを `/opt/mongodb/docker-compose.yml` として作成します。
version: '3.2'
services:
mongo-node1:
image: mongo:latest
container_name: mongo1
restart: always
volumes:
- /opt/mongodb/data/node1:/data/db
- /opt/mongodb/mongodb.key:/data/mongodb.key
ports:
- "27017:27017"
environment:
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=securepass123
networks:
- mongonet
command: mongod --replSet rs0 --keyFile /data/mongodb.key
entrypoint:
- bash
- -c
- |
chmod 400 /data/mongodb.key
chown 999:999 /data/mongodb.key
exec docker-entrypoint.sh $$@
mongo-node2:
image: mongo:latest
container_name: mongo2
restart: always
volumes:
- /opt/mongodb/data/node2:/data/db
- /opt/mongodb/mongodb.key:/data/mongodb.key
ports:
- "27018:27017"
environment:
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=securepass123
networks:
- mongonet
command: mongod --replSet rs0 --keyFile /data/mongodb.key
entrypoint:
- bash
- -c
- |
chmod 400 /data/mongodb.key
chown 999:999 /data/mongodb.key
exec docker-entrypoint.sh $$@
mongo-node3:
image: mongo:latest
container_name: mongo3
restart: always
volumes:
- /opt/mongodb/data/node3:/data/db
- /opt/mongodb/mongodb.key:/data/mongodb.key
ports:
- "27019:27017"
environment:
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=securepass123
networks:
- mongonet
command: mongod --replSet rs0 --keyFile /data/mongodb.key
entrypoint:
- bash
- -c
- |
chmod 400 /data/mongodb.key
chown 999:999 /data/mongodb.key
exec docker-entrypoint.sh $$@
networks:
mongonet:
driver: bridge
3. レプリカセットの初期化
設定ファイルをもとにコンテナを起動し、初期化処理を行います。
docker-compose up -d
docker ps
任意のコンテナ(例:mongo1)にアクセスし、MongoDB クライアントへ接続します。
docker exec -it mongo1 bash
mongo -u admin -p securepass123
レプリカセットを初期化します。
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "192.168.136.129:27017" },
{ _id: 1, host: "192.168.136.129:27018" },
{ _id: 2, host: "192.168.136.129:27019" }
]
})
4. 接続確認と動作検証
Navicat などのクライアントツールで、複数の接続先(各ノードおよびレプリカセット全体)を作成し、接続をテストします。
アプリケーション側では、以下のように接続文字列を設定します。
spring:
data:
mongodb:
uri: mongodb://admin:securepass123@192.168.136.129:27017,192.168.136.129:27018,192.168.136.129:27019/testdb?authSource=admin&replicaSet=rs0&slaveOk=true
auto-index-creation: true
接続文字列のポイント:
replicaSet=rs0:構成されたレプリカセット名を指定slaveOk=true:从節点への読み取り許可(読み書き分離)authSource=admin:rootユーザーの認証情報を含むデータベース
アプリケーションからデータ登録・更新操作を実行後、各ノードのデータが同期されていることを確認できます。主節点を停止すると、自動的に他のノードが主節点に昇格し、復旧後に再び从節点としてデータ同期を開始します。
最終的に、すべてのノードが一貫した状態を維持しており、故障耐性とデータ整合性が保たれていることが確認できます。