MySQLのマスター・スレーブレプリケーションと高可用性アーキテクチャ
マスター・スレーブレプリケーションは、MySQLの高可用性の基盤であり、読み取りと書き込みの分離もフェイルオーバーも、これに基づいています。
このレッスンでは、マスター・スレーブレプリケーションの仕組みと設定について解説します。
1. 学習内容
- マスター・スレーブレプリケーションの原理
- マスター・スレーブレプリケーションの設定
- 読み取りと書き込みの分離
- 半同期レプリケーション
- MySQL グループレプリケーション
2. 実話
(1) 課題:1台のサーバーでは読み取りおよび書き込みの負荷に対応できない
あるECプラットフォームにはデータベースサーバーが1台しかなく、大規模なセール期間中は、すべての読み取りおよび書き込みリクエストが1台のマシンに集中してしまいます。その結果、注文情報の照会が遅くなり、書き込み処理がキューに溜まり、CPUがフル稼働状態となり、データベースがシステム全体のボトルネックとなってしまいます。さらに危険なのは、このマシンがダウンすると、ビジネス全体が完全に停止してしまうことです。
(2) マスター・スレーブレプリケーションと読み書き分離を用いた解決策
マスター・スレーブレプリケーションを導入する:書き込みはマスターデータベースに、読み取りはスレーブデータベースに行われる。マスターデータベースがダウンした場合、スレーブデータベースがマスターに昇格し、業務の継続性が確保される。
| 構成 | シングルサーバー | マスター・スレーブレプリケーション + 読み取り・書き込みの分離 |
|---|---|---|
| 読み取りパフォーマンス | シングルサーバーの制限 | 水平スケーリング(スレーブデータベースの追加) |
| 書き込みパフォーマンス | 読み書き競合 | 書き込み専用プライマリデータベース |
| 可用性 | 99% | 99.9% |
| 災害復旧 | 手動復旧(1時間ごと) | 自動フェイルオーバー(1分ごと) |
3. 複製原理
graph LR
A[Master<br/>Primary Database] -->|binlog| B[Slave IO Thread]
B -->|relay log| C[Slave SQL Thread]
C -->|Replay| D[Slave Data<br/>Data from the database]
| 手順 | 説明 |
|---|---|
| 1 | マスターがバイナリログに書き込み |
| 2 | スレーブ IO スレッドがバイナリログを取得 |
| 3 | ローカルリレーログへの書き込み |
| 4 | スレーブSQLスレッドがリレーログを再生する |
4. マスター・スレーブレプリケーションの設定
▶ 例:マスター設定
INI
# my.cnf
[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = ROW
SQL
-- Create a replication user
CREATE USER 'repl'@'%' IDENTIFIED BY 'ReplPass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- View master status
SHOW MASTER STATUS;
▶ 例:スレーブの設定
INI
# my.cnf
[mysqld]
server-id = 2
relay_log = relay-bin
SQL
-- Configure master-slave relationship
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='ReplPass123!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
-- Start the slave database
START SLAVE;
-- Check slave database status
SHOW SLAVE STATUS\G
5. 読み取り操作と書き込み操作の分離
graph TB
A[Applications] -->|Write| B[Master]
A -->|Read| C[Slave 1]
A -->|Read| D[Slave 2]
B -->|Replicate| C
B -->|Replicate| D
6. 半同期レプリケーション
SQL
-- Install the semi-synchronous plugin
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
| コピー方法 | 説明 |
|---|---|
| 非同期レプリケーション | マスターはスレーブの確認を待たない(デフォルト) |
| 半同期レプリケーション | 少なくとも1つのスレーブが受信を確認してから初めて返却される |
| 完全同期レプリケーション | すべてのスレーブが確認応答を行う必要がある(パフォーマンスが低下する) |
7. MySQL グループレプリケーション
SQL
-- Install the Group Replication plugin
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
-- Start Group Replication
SET GLOBAL group_replication_bootstrap_group = ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group = OFF;
❓ よくある質問
Q マスター・スレーブ間のレイテンシについてはどうすればよいですか?
A ネットワークを確認し、大規模なトランザクションを最適化し、並列レプリケーションを使用してください。
Q プライマリデータベースがダウンした場合はどうすればよいですか?
A 手動または自動のフェイルオーバー(MHA/Orchestrator/ProxySQL)を行います。
Q マスターを複数設定することはできますか?
A グループレプリケーションはマルチマスターモードに対応していますが、シングルマスターモードの使用を推奨します。
Q マスター・スレーブレプリケーションに遅延が生じた場合はどうすればよいですか?
A 重要な読み取り処理はマスターデータベースから実行し、半同期レプリケーションを使用し、並列レプリケーションを有効にし、大規模なトランザクションを最適化してください。
Q プライマリデータベースがダウンした場合はどうすればよいですか?
A 手動で、またはMHA/Orchestratorを使用して自動的に、セカンダリデータベースをプライマリに昇格させてください。
📖 まとめ
- マスター・スレーブレプリケーションは、バイナリログ → リレーログを介してデータの同期を実現します。
- 非同期レプリケーションがデフォルトの方法ですが、半同期レプリケーションの方がより安全です。
- 読み書きの分離により負荷が分散され、プライマリサーバーが書き込みを、セカンダリサーバーが読み取りを処理します
- グループレプリケーション は、高可用性クラスタを実現します
📝 練習問題
-
基本問題(難易度:⭐):マスター・スレーブレプリケーション環境を構築してください。
-
上級問題(難易度 ⭐⭐):マスター・スレーブ間のデータ同期を確認してください。
-
課題(難易度:⭐⭐⭐):プライマリデータベースの障害をシミュレートし、手動によるフェイルオーバーを実行する。



