Docker環境におけるMySQLのマスタースレーブレプリケーション構成

1. マスタースレーブ構成の基本概念

マスタースレーブ構成では、マスターサーバーが書き込み操作(INSERT, UPDATE, DELETE)を担当し、スレーブサーバーが読み取り操作(SELECT)を担当します。これによりデータベースの読み書き分離が実現されます。

2. 環境準備

2.1 ファイアウォールとSELinuxの無効化

# ファイアウォール停止
systemctl stop firewalld
systemctl disable firewalld

# SELinux無効化
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

2.2 Dockerのインストール

オンラインまたはオフライン環境に応じてDockerをインストールします。

3. MySQLコンテナの起動

3.1 MySQLイメージの取得

docker pull mysql:5.7

3.2 コンテナの実行

# マスターサーバー
docker run --name db-primary -p 3339:3306 --privileged=true \
  -e MYSQL_ROOT_PASSWORD=rootpass --restart=unless-stopped -d mysql:5.7

# スレーブサーバー  
docker run --name db-replica -p 3340:3306 --privileged=true \
  -e MYSQL_ROOT_PASSWORD=rootpass --restart=unless-stopped -d mysql:5.7

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

4.1 マスターサーバー設定

# my.cnf設定
[mysqld]
server-id=1
log-bin=mysql-bin

4.2 スレーブサーバー設定

# my.cnf設定  
[mysqld]
server-id=2
relay_log=mysql-relay-log

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

# マスターサーバーでレプリケーション用ユーザー作成
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'replpass';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl_user'@'%';

# スレーブサーバーで接続設定
CHANGE MASTER TO
MASTER_HOST='マスターIP',
MASTER_USER='repl_user',
MASTER_PASSWORD='replpass',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154,
MASTER_CONNECT_RETRY=30;

START SLAVE;

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

SHOW SLAVE STATUS \G

Slave_IO_RunningとSlave_SQL_Runningが共にYesになっていることを確認します。

5. トラブルシューティング

5.1 接続エラー

Slave_IO_RunningがConnecting状態の場合は、以下の点を確認します:

  • ネットワーク接続
  • 認証情報の正確性
  • ログファイル位置の整合性

5.2 レプリケーションエラー

エラー発生時の対処方法:

STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;

タグ: MySQL Docker レプリケーション データベース コンテナ

6月17日 23:44 投稿