Docker Compose を用いた MongoDB レプリカセットの構築

本稿では、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ユーザーの認証情報を含むデータベース

アプリケーションからデータ登録・更新操作を実行後、各ノードのデータが同期されていることを確認できます。主節点を停止すると、自動的に他のノードが主節点に昇格し、復旧後に再び从節点としてデータ同期を開始します。

最終的に、すべてのノードが一貫した状態を維持しており、故障耐性とデータ整合性が保たれていることが確認できます。

タグ: MongoDB Docker Compose Replication Set High Availability containerization

10月18日 05:05 投稿