404 Not Found

404 Not Found


nginx

MySQLのマスター・スレーブレプリケーションと高可用性アーキテクチャ

マスター・スレーブレプリケーションは、MySQLの高可用性の基盤であり、読み取りと書き込みの分離もフェイルオーバーも、これに基づいています。

このレッスンでは、マスター・スレーブレプリケーションの仕組みと設定について解説します。

1. 学習内容


2. 実話

(1) 課題:1台のサーバーでは読み取りおよび書き込みの負荷に対応できない

あるECプラットフォームにはデータベースサーバーが1台しかなく、大規模なセール期間中は、すべての読み取りおよび書き込みリクエストが1台のマシンに集中してしまいます。その結果、注文情報の照会が遅くなり、書き込み処理がキューに溜まり、CPUがフル稼働状態となり、データベースがシステム全体のボトルネックとなってしまいます。さらに危険なのは、このマシンがダウンすると、ビジネス全体が完全に停止してしまうことです。

(2) マスター・スレーブレプリケーションと読み書き分離を用いた解決策

マスター・スレーブレプリケーションを導入する:書き込みはマスターデータベースに、読み取りはスレーブデータベースに行われる。マスターデータベースがダウンした場合、スレーブデータベースがマスターに昇格し、業務の継続性が確保される。

構成 シングルサーバー マスター・スレーブレプリケーション + 読み取り・書き込みの分離
読み取りパフォーマンス シングルサーバーの制限 水平スケーリング(スレーブデータベースの追加)
書き込みパフォーマンス 読み書き競合 書き込み専用プライマリデータベース
可用性 99% 99.9%
災害復旧 手動復旧(1時間ごと) 自動フェイルオーバー(1分ごと)

3. 複製原理

100%
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. 読み取り操作と書き込み操作の分離

100%
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を使用して自動的に、セカンダリデータベースをプライマリに昇格させてください。

📖 まとめ


📝 練習問題

  1. 基本問題(難易度:⭐):マスター・スレーブレプリケーション環境を構築してください。

  2. 上級問題(難易度 ⭐⭐):マスター・スレーブ間のデータ同期を確認してください。

  3. 課題(難易度:⭐⭐⭐):プライマリデータベースの障害をシミュレートし、手動によるフェイルオーバーを実行する。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%