Docker環境でのMySQL 8.0マスタースレーブクラスタ構築

1. オーバーレイネットワークの作成

docker network create --driver overlay shared-net --attachable

2. MySQLコンテナの起動

マスターノード:

docker run -d \
  --name primary-db \
  --network shared-net \
  -e MYSQL_ROOT_PASSWORD=securePass \
  -p 3306:3306 \
  mysql:8.0 \
  --default-authentication-plugin=mysql_native_password

スレーブノード:

docker run -d \
  --name replica-db \
  --network shared-net \
  -e MYSQL_ROOT_PASSWORD=securePass \
  -p 3307:3306 \
  mysql:8.0 \
  --default-authentication-plugin=mysql_native_password

3. レプリケーション設定

マスター設定:

docker run -it --rm --network shared-net mysql:8.0 \
  mysql -hprimary-db -uroot -psecurePass \
  -e "SET PERSIST server_id=100;" \
  -e "SET PERSIST_ONLY gtid_mode=ON;" \
  -e "SET PERSIST_ONLY enforce_gtid_consistency=ON;" \
  -e "CREATE USER 'sync_user'@'%' IDENTIFIED BY 'replicaPass' REQUIRE SSL;" \
  -e "GRANT REPLICATION SLAVE ON *.* TO 'sync_user'@'%';"

スレーブ設定:

docker run -it --rm --network shared-net mysql:8.0 \
  mysql -hreplica-db -uroot -psecurePass \
  -e "SET PERSIST server_id=200;" \
  -e "SET PERSIST_ONLY gtid_mode=ON;" \
  -e "SET PERSIST_ONLY enforce_gtid_consistency=ON;"

4. コンテナ再起動

docker restart primary-db replica-db

5. レプリケーション接続設定

docker run -it --rm --network shared-net mysql:8.0 \
  mysql -hreplica-db -uroot -psecurePass \
  -e "CHANGE REPLICATION SOURCE TO SOURCE_HOST='primary-db', SOURCE_PORT=3306, SOURCE_USER='sync_user', SOURCE_PASSWORD='replicaPass', SOURCE_AUTO_POSITION=1, SOURCE_SSL=1;" \
  -e "START REPLICA;"

6. レプリケーション状態確認

docker run -it --rm --network shared-net mysql:8.0 \
  mysql -hreplica-db -uroot -psecurePass \
  -e "SHOW REPLICA STATUS\G"

正常な状態:

Replica_IO_Running: Yes
Replica_SQL_Running: Yes

7. データ同期検証

マスターでテストデータベース作成:

docker run -it --rm --network shared-net mysql:8.0 \
  mysql -hprimary-db -uroot -psecurePass \
  -e "CREATE DATABASE test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

スレーブでデータベース確認:

docker run -it --rm --network shared-net mysql:8.0 \
  mysql -hreplica-db -uroot -psecurePass \
  -e "SHOW DATABASES;"

出力例:

+--------------------+
| Database           |
+--------------------+
| test_db            |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

注意: コマンドラインでのパスワード使用はセキュリティリスクがあります

タグ: Docker MySQL レプリケーション GTID コンテナネットワーク

5月21日 02:06 投稿