データベースの可用性と負荷分散を実現するため、MySQL のマスター - スレーブ(主従)複製環境を構築する標準的な手順について解説します。この構成では、マスターサーバーへの記述操作が自動的にスレーブサーバーへ同期されます。
1. サーバー設定の変更
各ノードの構成ファイル(通常は my.cnf または mysql.conf.d 内)を編集し、必要なパラメータを設定します。すべてのサーバーで一意の server-id を定義することが必須です。
マスターサーバー設定
バイナリログの出力を有効化し、一意の識別子を割り当てます。
[mysqld]
# バイナリログ機能の活性化
log_bin = mysql-bin
# 一意のサーバ ID (101 以上を推奨)
server-id = 101
スレーブサーバー設定
マスターとは異なる server-id を指定します。
[mysqld]
# 一意のサーバ ID (マスターと異なる値を指定)
server-id = 102
read_only = ON
relay_log = relay-log
設定完了後、両方のデータベースサービスを再起動して適用を確認してください。
2. データの一貫性確保とバックアップ
複製の開始前に、マスター側で一貫した状態を確保する必要があります。読み取りロックをかけてからデータエクスポートを実行します。
マスター側の処理:
接続後、以下のコマンドで全テーブルに書き込みロックを取得します。
FLUSH TABLES WITH READ LOCK;
ロック状態で現在の位置情報を取得し、記録しておきます。
SHOW MASTER STATUS\G
Position: 107
Binlog_Do_DB:
Binlog_Ignore_DB:
次に、別のターミナルセッションを開き、データベース全体のエクスポートを行います。ここでは --single-transaction を使用して InnoDB エンジンの一貫性を保ちつつ、--flush-logs で新しいバイナリログファイルを作成します。
mysqldump -u root -h 192.168.1.10 -p --all-databases --add-drop-database --single-transaction --flush-logs --master-data=2 > full_backup_$(date +%Y%m%d).sql
生成された SQL ファイルをスレーブサーバーへ転送します。
データの抽出が完了したら、マスター側のロックを解除します。
UNLOCK TABLES;
3. スレーブの初期化と複製開始
スレーブサーバー上で、マスターから受け取ったデータをインポートします。
mysql -u root -h 127.0.0.1 -p < /path/to/full_backup_$(date +%Y%m%d).sql
データのインポートが完了した後、複製リンクの設定を行います。CHANGE MASTER TO コマンドを使用して、マスターの場所や認証情報、および同期を開始するバイナリログの位置を指定します。ここで入力するログ名とポジションは、先ほどマスターで確認した情報に合わせてください。
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_PORT=3306,
MASTER_USER='repl_account',
MASTER_PASSWORD='SecurePass_2024!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=107;
START SLAVE;
4. レプリケーションステータスの検証
設定の正しさを確認するために、スレーブ側のステータスを表示します。
SHOW SLAVE STATUS\G
出力結果において、以下の 2 つの項目が YES になっていることを確認します。
Slave_IO_Running: YesSlave_SQL_Running: Yes
また、エラーがないか Last_IO_Error と Last_SQL_Error が空であることもチェックしてください。これらが正常であれば、マスターからスレーブへのデータ同期は成功しています。