ApacheでMySQL障害時に自動フェイルオーバーを設定する方法を徹底解説

ApacheとMySQLを組み合わせたウェブシステムは、多くの企業やサービスで利用されています。しかし、MySQLサーバーが障害を起こした場合、データベース接続エラーによりサービスが停止する可能性があります。こうした事態を防ぐために導入されるのが「フェイルオーバー」です。フェイルオーバーを設定することで、MySQLがダウンした際にApacheが自動的に待機している別のデータベースサーバーに切り替わり、サービスの継続を可能にします。

本記事では、MySQL障害時にApacheが自動でフェイルオーバーする仕組みとその具体的な設定方法を徹底解説します。レプリケーションを利用したMySQLバックアップサーバーの構築や、Apacheでのフェイルオーバー設定の方法をステップバイステップで紹介し、障害発生時の対処方法まで詳しく説明します。

この記事を読むことで、ウェブサービスの可用性を高め、障害時のダウンタイムを最小限に抑えるための知識を得られるでしょう。

目次

フェイルオーバーとは何か


フェイルオーバーとは、システムの一部が障害を起こした際に、自動的にバックアップシステムや代替サーバーに切り替えて処理を継続する仕組みです。このプロセスにより、システムの可用性が向上し、サービスが停止することなく継続されます。特にウェブサービスでは、データベースサーバーやアプリケーションサーバーの障害が発生しても、ユーザーに影響を与えないよう設計されることが重要です。

フェイルオーバーの重要性


ウェブシステムにおいてフェイルオーバーは、以下の理由で不可欠です。

  • サービス継続性の確保:障害が発生しても、迅速に代替システムへ切り替わることでダウンタイムを最小限に抑えます。
  • データの保全:処理中のデータが失われるリスクを減少させ、トランザクションの整合性を維持します。
  • ユーザーエクスペリエンスの向上:障害によるサービス停止を回避し、信頼性の高いウェブサイトを提供できます。

フェイルオーバーの仕組み


フェイルオーバーは以下のプロセスで機能します。

  1. 監視:システムが常に稼働状態を監視し、異常を検知します。
  2. 切り替え:障害が発生すると、自動的に代替サーバーへ切り替えます。
  3. 復旧:メインシステムが復旧した際は、元のサーバーに戻るか、代替システムで稼働を継続します。

このように、フェイルオーバーはシステムの安定稼働を保証する重要な技術です。次章では、ApacheとMySQLの連携においてフェイルオーバーが必要となる具体的な状況について解説します。

ApacheとMySQLの連携とフェイルオーバーの必要性


ApacheとMySQLは、多くのウェブアプリケーションで利用される標準的な組み合わせです。ApacheがHTTPリクエストを処理し、MySQLがデータベースの管理と操作を担当します。この2つが連携することで、動的なウェブサイトやアプリケーションが構築されます。しかし、この連携が強固である一方で、MySQLに障害が発生すると、Apacheがデータベースへの接続を試みても応答が得られず、ウェブサービスが停止するリスクが生じます。

フェイルオーバーが必要となるケース


フェイルオーバーが必要になる代表的なシナリオは以下の通りです。

  1. ハードウェア障害:MySQLサーバーの物理的な障害によってデータベースが利用できなくなる。
  2. ソフトウェア障害:MySQLのクラッシュや設定ミスにより、データベースが応答しなくなる。
  3. 過負荷:MySQLサーバーに大量のリクエストが集中し、処理が追いつかずタイムアウトする。
  4. ネットワーク障害:ApacheとMySQL間のネットワークに問題が発生し、接続が切断される。

フェイルオーバーの利点


ApacheとMySQLのシステムにフェイルオーバーを導入することで、以下のようなメリットが得られます。

  • 高可用性の実現:システム障害時でも別のデータベースサーバーが自動的に処理を引き継ぐため、サービスが途切れることなく継続します。
  • データ損失の防止:MySQLのレプリケーションと組み合わせることで、障害時にも最新データが保持されます。
  • 運用負荷の軽減:自動でフェイルオーバーが行われるため、障害発生時の対応時間が短縮され、運用チームの負担が軽減されます。

次のセクションでは、具体的なフェイルオーバー構成の概要と必要な環境について詳しく解説していきます。

フェイルオーバー構成の概要


MySQL障害時にApacheが自動で別のデータベースサーバーに切り替わるフェイルオーバー構成は、システムの可用性を高める重要な仕組みです。ここでは、フェイルオーバー環境を構築するための全体像と必要な要素を紹介します。

フェイルオーバー構成の基本要素


フェイルオーバー構成を実現するには、以下の要素が必要です。

  1. プライマリMySQLサーバー:通常稼働するメインのデータベースサーバー。
  2. セカンダリMySQLサーバー:プライマリが障害を起こした際に切り替わるバックアップサーバー。MySQLレプリケーションにより、プライマリのデータが常に同期されます。
  3. Apacheサーバー:ユーザーからのリクエストを処理し、必要に応じてフェイルオーバーでセカンダリMySQLサーバーに接続します。
  4. ロードバランサー(オプション):MySQLサーバーへのトラフィックを自動的に振り分け、フェイルオーバーの役割を担います。

ネットワーク構成のイメージ


フェイルオーバー構成の典型的なネットワークは以下のようになります。

[ ユーザー ]  
     |  
[ Apache (mod_proxy) ]  
     |  
[ プライマリMySQL ] ---- (レプリケーション) ---- [ セカンダリMySQL ]  

Apacheは通常、プライマリMySQLサーバーに接続しますが、プライマリが応答しない場合はセカンダリMySQLに切り替わります。

必要なソフトウェアとツール


フェイルオーバー構成のために、以下のツールやモジュールが必要です。

  • Apache:基本となるウェブサーバーソフトウェア。
  • mod_proxy_balancer:Apache内でロードバランサーとして動作し、フェイルオーバーを可能にします。
  • MySQL:データベース管理システム。
  • MySQLレプリケーション:プライマリとセカンダリのデータ同期を行います。
  • Keepalived(オプション):仮想IPアドレスを用いた自動切り替えを実現します。

次のセクションでは、MySQLのレプリケーションを設定し、フェイルオーバー環境の基盤を作る手順について詳しく解説します。

MySQLのレプリケーション設定方法


MySQLのレプリケーションは、データの複製を別のサーバーにリアルタイムで同期する仕組みです。プライマリ(マスター)サーバーのデータがセカンダリ(スレーブ)サーバーに自動で反映されるため、障害時にスムーズにフェイルオーバーできます。ここでは、基本的なレプリケーション設定手順を解説します。

レプリケーションの仕組み


レプリケーションは、プライマリサーバーで行われたトランザクションがバイナリログに記録され、それがセカンダリサーバーでリプレイされることで同期が行われます。

レプリケーションの種類

  • シングルマスターレプリケーション:プライマリからセカンダリへの一方向のレプリケーション。基本的なフェイルオーバー構成に最適です。
  • マルチマスターレプリケーション:複数のサーバー間で相互にレプリケーションを行います。複雑な環境で使用されます。

シングルマスターレプリケーションの設定手順

1. プライマリサーバーの設定


MySQL設定ファイル(my.cnf)の編集

[mysqld]  
log-bin=mysql-bin  
server-id=1  
binlog-do-db=exampledb  
  • log-bin:バイナリログを有効化します。
  • server-id:サーバーごとに異なるIDを設定します。
  • binlog-do-db:レプリケーション対象のデータベースを指定します。

MySQLの再起動とユーザー作成

sudo systemctl restart mysql  
mysql -u root -p  
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%' IDENTIFIED BY 'password';  
FLUSH PRIVILEGES;  
SHOW MASTER STATUS;  


SHOW MASTER STATUS; の出力で表示される FilePosition を記録します。

2. セカンダリサーバーの設定


MySQL設定ファイル(my.cnf)の編集

[mysqld]  
server-id=2  
relay-log=mysql-relay-bin  
  • server-id はプライマリと異なる値を設定します。

レプリケーションの開始

mysql -u root -p  
CHANGE MASTER TO  
MASTER_HOST='primary-server-ip',  
MASTER_USER='replica_user',  
MASTER_PASSWORD='password',  
MASTER_LOG_FILE='mysql-bin.000001',  
MASTER_LOG_POS=154;  
START SLAVE;  
SHOW SLAVE STATUS\G;  


MASTER_LOG_FILEMASTER_LOG_POS には、プライマリサーバーで確認した値を入力します。

動作確認

  • SHOW SLAVE STATUS\G;Slave_IO_RunningSlave_SQL_RunningYes になっていれば正常にレプリケーションが稼働しています。
  • テストとしてプライマリサーバーでデータを追加し、セカンダリサーバーに反映されているか確認します。

次のセクションでは、Apacheでのフェイルオーバー設定方法について解説します。

Apacheのフェイルオーバー設定


ApacheでMySQLのフェイルオーバーを実装するには、mod_proxymod_rewriteを利用して、データベース接続先を自動的に切り替える仕組みを構築します。これにより、プライマリMySQLサーバーがダウンした際に、セカンダリサーバーに自動で接続を切り替えることができます。ここでは具体的な設定手順を解説します。

フェイルオーバー構成の概要


Apacheは通常プライマリMySQLサーバーに接続しますが、接続エラーが発生した場合にはセカンダリMySQLサーバーへリダイレクトします。mod_proxyを使用することで、Apacheがバックエンドサーバーの状態を監視し、フェイルオーバーを自動的に処理します。

必要なモジュールの有効化


以下のコマンドで必要なモジュールを有効にします。

sudo a2enmod proxy  
sudo a2enmod proxy_balancer  
sudo a2enmod proxy_http  
sudo a2enmod rewrite  
sudo systemctl restart apache2  

Apacheのフェイルオーバー設定手順

1. プロキシバランサーの設定


/etc/apache2/sites-available/000-default.confファイルに以下の内容を追加します。

<Proxy balancer://mysql-cluster>  
    BalancerMember http://primary-db:3306 retry=10  
    BalancerMember http://secondary-db:3306 status=+H  
</Proxy>  

ProxyPass /mysql balancer://mysql-cluster/  
ProxyPassReverse /mysql balancer://mysql-cluster/  
  • BalancerMember:プライマリとセカンダリMySQLサーバーを定義します。
  • retry:障害発生後の再接続までの時間を秒単位で設定します。
  • status=+H:セカンダリサーバーを待機状態に設定し、プライマリが応答しない場合のみ有効になります。

2. ヘルスチェックと切り替え設定


mod_rewriteを活用して、プライマリサーバーがダウンした際にセカンダリサーバーへ自動的に切り替わるように設定します。

RewriteEngine On  
RewriteCond %{HTTP:Authorization} ^(.+)$  
RewriteRule ^/mysql(.*)$ balancer://mysql-cluster$1 [P,L]  


この設定により、プライマリサーバーが応答しない場合にセカンダリサーバーへの接続が試みられます。

設定の確認とテスト


Apacheを再起動して設定を反映させます。

sudo systemctl restart apache2  


フェイルオーバーが正常に機能しているか確認するには、以下の手順を実行します。

  1. プライマリMySQLサーバーを停止します。
  2. ウェブアプリケーションがセカンダリMySQLサーバーで動作することを確認します。
  3. プライマリサーバーを再起動し、接続が元に戻るかをテストします。

次のセクションでは、フェイルオーバーが正しく機能するかをテストし、設定の精度を高める方法について解説します。

フェイルオーバーのテストと確認方法


ApacheとMySQLのフェイルオーバー設定を完了したら、実際に障害が発生した際に自動的に切り替わるかをテストし、正しく動作することを確認する必要があります。ここでは、フェイルオーバーのテスト手順と、確認すべきポイントについて解説します。

テスト環境の準備


フェイルオーバーテストを行うために、以下の環境を用意します。

  • プライマリMySQLサーバー(稼働中)
  • セカンダリMySQLサーバー(レプリケーション済み)
  • Apacheサーバー(フェイルオーバー設定済み)

テスト手順

1. プライマリMySQLサーバーの停止


プライマリサーバーを手動で停止し、Apacheがセカンダリサーバーに切り替わるかを確認します。

sudo systemctl stop mysql  # プライマリMySQLの停止  


プライマリサーバーを停止した状態で、ウェブアプリケーションにアクセスします。通常通りデータが表示されれば、セカンダリMySQLサーバーへのフェイルオーバーが成功しています。

2. ログの確認


Apacheのエラーログを確認し、切り替わりの様子をチェックします。

sudo tail -f /var/log/apache2/error.log  


エラーログに「proxy: BALANCER」というメッセージが表示され、セカンダリサーバーへの切り替えが確認できます。

3. プライマリサーバーの復旧


プライマリMySQLサーバーを再起動し、フェイルオーバーから復旧するか確認します。

sudo systemctl start mysql  # プライマリMySQLの再起動  


プライマリが再度稼働したことを確認し、セカンダリサーバーからプライマリサーバーへ自動的に接続が戻るかをテストします。

確認ポイント

  • 切り替え時間:プライマリが停止してからセカンダリに切り替わるまでの時間が適切か確認します。
  • データ整合性:フェイルオーバー中にデータの欠損がないか、レプリケーションが正しく動作しているかを確認します。
  • 復旧確認:プライマリが復旧した後、自動的に元の状態に戻ることを確認します。

フェイルオーバーテストの自動化


運用中の環境では定期的にフェイルオーバーテストを実施し、スクリプトなどを活用して自動化することが推奨されます。以下のようなスクリプトを用いて自動テストを行うことも可能です。
“`bash

!/bin/bash

sudo systemctl stop mysql
sleep 10
curl http://localhost/test-page
sudo systemctl start mysql

次のセクションでは、フェイルオーバー中に発生する可能性があるトラブルとその対処法について詳しく解説します。
<h2>障害発生時のトラブルシューティング</h2>  
フェイルオーバーが正しく機能しない場合や、障害発生時に問題が解消されない場合は、速やかに原因を特定し、適切に対応する必要があります。ここでは、よくあるトラブルとその解決方法について解説します。  

<h3>よくあるトラブルと対処法</h3>  

<h4>1. フェイルオーバーが発生しない</h4>  
**原因**:ApacheがプライマリMySQLサーバーの障害を検知できていない、またはセカンダリサーバーへの切り替えが行われていない可能性があります。  
**対処法**:  
- `proxy_balancer`の設定を再確認し、`retry`パラメータが適切に設定されているか確認します。  
- Apacheのエラーログを確認し、MySQLへの接続エラーが記録されているかを確認します。  


sudo tail -f /var/log/apache2/error.log

- `mod_proxy`が適切にロードされていることを確認します。  


sudo a2enmod proxy
sudo a2enmod proxy_http
sudo systemctl restart apache2

<h4>2. セカンダリMySQLサーバーが応答しない</h4>  
**原因**:セカンダリサーバーが起動していない、もしくはレプリケーションに問題がある可能性があります。  
**対処法**:  
- セカンダリMySQLサーバーが稼働していることを確認します。  


sudo systemctl status mysql

- レプリケーションの状態を確認します。  


mysql -u root -p
SHOW SLAVE STATUS\G;

`Slave_IO_Running`と`Slave_SQL_Running`が`Yes`であることを確認してください。  

<h4>3. データが最新でない</h4>  
**原因**:レプリケーションに遅延が生じているか、正常に行われていない可能性があります。  
**対処法**:  
- セカンダリサーバーでレプリケーションが適切に動作しているか確認します。  
- 遅延の発生状況を確認するため、以下のコマンドを実行します。  


SHOW SLAVE STATUS\G;

`Seconds_Behind_Master`が0であることを確認し、遅延が発生している場合はプライマリサーバーの負荷を軽減する対策を講じます。  

<h4>4. フェイルオーバーからの復旧ができない</h4>  
**原因**:プライマリMySQLサーバーが復旧してもApacheが自動的に切り戻らない可能性があります。  
**対処法**:  
- Apacheのキャッシュが原因で切り戻らない場合は、Apacheを再起動します。  


sudo systemctl restart apache2

- プライマリサーバーが完全に復旧しているかを確認します。  


sudo systemctl status mysql

<h3>障害時のログの活用</h3>  
障害発生時のログは、問題の特定と解決に不可欠です。以下のログを確認し、エラーの原因を特定します。  
- Apacheエラーログ:`/var/log/apache2/error.log`  
- MySQLエラーログ:`/var/log/mysql/error.log`  

<h3>フェイルオーバーの動作を定期的に確認する</h3>  
フェイルオーバーの設定が長期間使われない場合でも、定期的にテストを行うことで設定ミスや構成のズレを防ぐことができます。自動化スクリプトを導入して、定期的にフェイルオーバーテストを実施することを推奨します。  

次のセクションでは、フェイルオーバー構成を応用し、より高可用性なシステムを構築するためのベストプラクティスを紹介します。
<h2>応用例とベストプラクティス</h2>  
ApacheとMySQLのフェイルオーバー構成をさらに強化することで、システムの可用性と耐障害性を向上させることができます。ここでは、フェイルオーバー構成の応用例と、より信頼性の高いシステムを構築するためのベストプラクティスを紹介します。  

<h3>応用例</h3>  

<h4>1. マルチマスターレプリケーションの導入</h4>  
MySQLの**マルチマスターレプリケーション**を利用することで、複数のサーバーが同時にデータベースの書き込み処理を行います。プライマリとセカンダリの役割を固定せず、いずれのサーバーでも障害時に自動的に切り替わることが可能になります。  
**利点**:  
- 障害発生時でもデータの即時切り替えが可能  
- サーバー負荷を分散し、スケーラビリティを向上  

**設定例**:  


[mysqld]
server-id=1
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=true

同様の設定をセカンダリサーバーにも適用し、双方向レプリケーションを有効にします。  

<h4>2. Keepalivedを用いた仮想IPフェイルオーバー</h4>  
`Keepalived`を利用して、プライマリとセカンダリのMySQLサーバー間で**仮想IP(VIP)**を共有します。これにより、Apacheは常に同じIPアドレスを参照し、障害発生時に自動的にMySQLサーバーが切り替わります。  
**利点**:  
- Apache側の設定変更が不要  
- IPレベルでの自動切り替えが可能  

**設定例**:  


vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
virtual_ipaddress {
192.168.0.100
}
}

セカンダリ側では`priority`を90に設定し、プライマリがダウンした場合に自動で昇格します。  

<h4>3. プロキシSQLの導入</h4>  
**ProxySQL**はMySQLのクエリを管理・振り分けるプロキシツールであり、障害時のフェイルオーバーだけでなく、ロードバランシングやクエリキャッシュの最適化が可能です。  
**利点**:  
- 高速なフェイルオーバー処理  
- 負荷分散によるパフォーマンス向上  

**設定例**:  


INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (1, ‘primary-db’, 3306);
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (1, ‘secondary-db’, 3306);
LOAD MYSQL SERVERS TO RUNTIME;
“`

ベストプラクティス

1. 定期的なフェイルオーバーテスト

  • 定期的にMySQLサーバーを停止し、フェイルオーバーが正しく動作することを確認します。
  • フェイルオーバー後にデータの整合性や遅延がないかを検証します。

2. 障害発生時の自動通知システム

  • フェイルオーバーが発生した際に、運用チームへ即時通知する仕組みを構築します。
  • ApacheやMySQLの障害を検知した際にSlackやメールで通知を送るように設定します。

3. キャッシュと負荷分散の併用

  • フェイルオーバーが発生する前に、RedisMemcachedなどのキャッシュシステムを導入し、データベースへの負荷を軽減します。
  • フロントエンド側でロードバランサーを導入し、アクセスの偏りを防ぎます。

次のセクションでは、これまでの内容をまとめ、ApacheとMySQLのフェイルオーバー環境の構築で得られる効果について振り返ります。

まとめ


本記事では、ApacheとMySQLを組み合わせたシステムでフェイルオーバーを実装する方法について解説しました。MySQLの障害が発生しても、Apacheが自動的にセカンダリサーバーへ切り替えることで、サービスの継続性を確保できます。

MySQLのレプリケーションを設定し、mod_proxyKeepalivedなどのツールを活用することで、効率的かつ堅牢なフェイルオーバー環境を構築できます。さらに、マルチマスターレプリケーションやProxySQLの導入により、システムの耐障害性とパフォーマンスを向上させることが可能です。

適切なフェイルオーバー設定と定期的なテストにより、システムの可用性を維持し、障害発生時のダウンタイムを最小限に抑えることができます。本記事で紹介した手順を参考に、自社のシステムにフェイルオーバー環境を導入してみてください。

コメント

コメントする

目次