Apache2およびMySQL上の高度にアクセス可能なフェールセーフWebアプリケーション

HA-Apache2 WebサイトおよびHA-MySQL



目的: Webアプリケーションの高可用性と、Webサーバーおよびデータベースサーバーとして障害が発生した場合のダウンタイムを最小限に抑えるため。

注! このスキームでは、Webアプリケーションとデータベースが異なるサーバー上にあると想定しています。

たとえば、wordpressをインストールします。



ソリューションオプション:

Webアプリケーションは常に使用可能である必要があるため、アプリケーションがインストールされた少なくとも2つのサーバーが必要です。 サーバーは互いの状態を監視し、常に1つのサーバーのみがリードします。 ホストサーバーに障害が発生した場合、その役割は2番目です。 最初のサーバーが再び利用可能になると、リーダーの役割は再びそのサーバーに戻ります。



なぜなら データベースの耐障害性を確保するために、少なくとも2台のサーバーを使用し、それらにアクセスするために、Webアプリケーションを構成する1つの仮想IPアドレスを使用します。 この場合、サーバーの1つが故障してもWebサーバーのパフォーマンスには影響しません。 バックアップサーバーデータベースで引き続き動作します。 プライマリサーバーとバックアップサーバー上のデータベースを同期するには、双方向レプリケーションメカニズム(「マスターマスター」)を使用します。 セキュリティのレベルを上げ、Webアプリケーションからのリクエストのバランスをとるために、2つのプロキシサーバーをアーキテクチャに追加します。 サーバーはポート3306でリクエストをリッスンし、データベースサーバー間でリクエストを配信します。 サーバーの1つがリードになります。 リーダーに障害が発生した場合、2番目のサーバーがその役割を引き継ぎます(原理はWebサーバーの動作に似ています)。

システムアーキテクチャ:





次のサーバー名とIPアドレスを使用します。

サーバー IPアドレス
apache-app1 192.168.8.221
apache-app2 192.168.8.222
mysql-proxy1 192.168.8.224
mysql-proxy2 192.168.8.225
mysql-data1 192.168.8.226
mysql-data2 192.168.8.227




さらに、さらに2つのIPアドレスが必要です。

IPアドレス 予定
192.168.8.220 Webアプリケーションへのクライアント呼び出しのアドレス
192.168.8.223 MySQLデータベースにアクセスするためのアドレス




注! このマニュアルで使用されるすべてのシステムは、OpenSSHサーバーがインストールされたUbuntu Server 8.04 LTSを実行しています。



まず、データベースサーバー(mysql-data1およびmysql-data2)をセットアップしましょう。

注! すべてのアクションはスーパーユーザーによって実行されます。

必要なコンポーネントを両方のサーバーに配置します。 MySQLサーバーが必要です。 インストール中に、rootユーザーの強力なパスワードを入力します。



apt-get install mysql-server --yes







セットアップに進みます。 まず、ネットワークからMySQLサーバーへの要求をリッスンするようにサーバーを構成します。 これを行うには、ファイル/etc/mysql/my.cnfを編集します。 その中で、行bind-address = 127.0.0.1を見つけてそれを置き換える必要があります



bind-address=192.168.8.226







mysql-data1サーバーおよび



bind-address=192.168.8.227







mysql-data2サーバー用

サービスの再起動:



/etc/init.d/mysql restart







レプリケーションのセットアップに進みます。

単方向レプリケーション(「マスタースレーブ」)では、スレーブデータベースへの書き込み時にデータに一貫性がなく、レプリケーションエラーが発生する可能性があります。 双方向レプリケーションの場合、データベースは一貫した状態になります。

レプリケーションには、パスワードsome_passwordを持つMySQLレプリケーションユーザーを使用します。

mysql-data1サーバーで、ファイル/etc/mysql/my.cnfを編集します。 次の行を複製セクションに貼り付けます。



server-id = 1

log_bin = /var/log/mysql/mysql-bin.log

max_binlog_size = 100M

binlog_ignore_db = test

binlog_ignore_db = mysql

master-host = 192.168.8.227 #ip- mysql-data2

master-user = replication #

master-password = some_password #

master-port = 3306








ルートとしてMySQLにアクセスし、レプリケーションユーザーにmysql-data2サーバーからサーバーに接続する権利を与えます。



mysql -u root -p

Enter password: root,

>grant replication slave on *.* to 'replication'@'192.168.8.227' identified by 'some_password';

>flush privileges;

>quit;

/etc/init.d/mysql restart








mysql-data2サーバーに渡します。

ファイル/etc/mysql/my.cnfを編集します。 次の行を複製セクションに貼り付けます。



server-id = 2

log_bin = /var/log/mysql/mysql-bin.log

max_binlog_size = 100M

binlog_ignore_db = test

binlog_ignore_db = mysql

master-host = 192.168.8.226 #ip- mysql-data1

master-user = replication #

master-password = some_password #

master-port = 3306








ルートとしてMySQLにアクセスし、レプリケーションユーザーにmysql-data1サーバーからサーバーに接続する権利を与えます。



mysql -u root -p

Enter password: root,

>grant replication slave on *.* to 'replication'@'192.168.8.226' identified by 'some_password';

>flush privileges;

>quit;

/etc/init.d/mysql restart








両方のサーバーで、レプリケーションプロセスが実行されていることを確認します。 これを行うには、次を実行します。



mysql —u root —p

Enter password: root,

>show slave status \G








表示される情報では、次の3つのパラメーターに関心があります。



Slave_IO_State: Waiting for master to send event

Slave_IO_Running: Yes

Slave_SQL_Running: Yes








両方のサーバーで指定されたパラメーターが上記に対応する場合、すべてが正常であり、レプリケーションが構成されています。 そうでない場合は、ログを見てください。

アプリケーション用のデータベースを作成しましょう。 mysql-data1サーバーで、次を実行します。



mysql —u root —p

Enter password: root,

>create database wp_database;








mysql-data2サーバーに移動して、データベースがこのサーバーに複製されていることを確認しましょう。



mysql —u root —p

Enter password: root,

>show databases;








出力には、前に作成したベースの名前が含まれている必要があります。

プロキシサーバーからこのデータベースへのアクセス権を構成します。 両方のサーバーで、次を実行します。



mysql —u root —p

Enter password: root,

>grant all on wp_database.* to 'wp_user'@'192.168.8.224' identified by 'wp_user_password';

>grant all on wp_database.* to 'wp_user'@'192.168.8.225' identified by 'wp_user_password';

>flush privileges;

>quit;








バランシングとmysql-proxyの調整に進みます。

mysql-proxy1およびmysql-proxy2サーバーに必要なコンポーネントをインストールします(以降、すべてのコマンドはスーパーユーザーに代わって実行されます)。



apt-get install mysql-proxy heartbeat







両方のサーバーでmysql-proxyサービスを開始します。 起動パラメーターで、mysql-data1サーバーとmysql-data2サーバーのIPアドレスを指定します。



mysql-proxy --proxy-backend-addresses=192.168.8.226 \

--proxy-backend-addresses=192.168.8.227 \

--proxy-address=:3306

—daemon








両方のサーバーでハートビートに基づいた高可用性のセットアップに移行しています。

必要なファイルを作成します。



touch /etc/ha.d/authkeys

touch /etc/ha.d/ha.cf

touch /etc/ha.d/haresources








セキュリティ設定をファイル/etc/ha.d/authkeysに設定します



chmod 600 /etc/ha.d/authkeys







そして次のように編集します:



auth 2

2 sha1 your-strong-password








設定に従って/etc/ha.d/ha.cfファイルを編集します。 ファイルは両方のノードで同一でなければなりません。



logfile /var/log/ha-log #

logfacility local0

keepalive 2 # ,

deadtime 10 #

initdead 120

bcast eth0

udpport 694

auto_failback on

node mysql-proxy1

node mysql-proxy2








注! nodeパラメーターは、両方のノードのuname -nコマンドの出力と一致する必要があります!



ファイル/etc/ha.d/haresourcesを編集します。 ファイルは両方のノードで同一でなければなりません。



mysql-proxy1 192.168.8.223 # MySQL







すべて準備完了です。 両方のサーバーでサービスを再起動するだけです(最初にmysql-proxy1、次にmysql-proxy2)。



/etc/init.d/heartbeat restart







apache-app1およびapache-app2 Webサーバーの構成を開始しています。

必要なコンポーネントをインストールします。



apt-get install apache2 php5 php5-gd php5-mysql libapache2-mod heartbeat --yes







フォールトトレランスの調整に進みます。

必要なファイルを作成します。



touch /etc/ha.d/authkeys

touch /etc/ha.d/ha.cf

touch /etc/ha.d/haresources








セキュリティ設定をファイル/etc/ha.d/authkeysに設定します



chmod 600 /etc/ha.d/authkeys







そして次のように編集します:



auth 2

2 sha1 your-strong-password








設定に従って/etc/ha.d/ha.cfファイルを編集します。 ファイルは両方のノードで同一でなければなりません。



logfile /var/log/ha-log #

logfacility local0

keepalive 2 # ,

deadtime 10 #

initdead 120

bcast eth0

udpport 694

auto_failback on

node apache-app1

node apache-app2








ファイル/etc/ha.d/haresourcesを編集します。 ファイルは両方のノードで同一でなければなりません。



apache-app1 192.168.8.220 apache2 # web-







すべて準備完了です。 両方のサーバーでサービスを再起動するだけです(最初はapache-app1、次にapache-app2)。



/etc/init.d/heartbeat restart







wordpressをインストールします。

Wordpressを両方のWebサーバーにインストールし、同じ方法で構成します。 詳細なインストール手順は、公式Webサイトにあります。 ここで、先ほど作成したデータベースに接続するためのwp-config.phpファイルのパラメーターを指定します。



/** WordPress */

define('DB_NAME', 'wp_database');

/** MySQL */

define('DB_USER', 'wp_user');

/** MySQL */

define('DB_PASSWORD', 'wp_user_password');

/** MySQL */

define('DB_HOST', '192.168.8.223′);








すべて準備完了です。 ワードプレスにアクセスするには、アドレス192.168.8.220/wordpress_name_nameを使用します



更新しました。

構成ファイルを使用してmysql-proxyサービスを開始するための起動スクリプトを作成します。 まず、設定を保存するディレクトリを作成します。



mkdir / etc / mysql-proxy



作成したディレクトリで、mysql-proxy.confファイルを作成します。 私のファイルの内容:



#########################################

# Service configuration section

# Specify backend MySQL servers (one per line)

#########################################

proxy-backend-addresses = 192.168.8.226

proxy-backend-addresses = 192.168.8.227

#########################################

# Port configuration section

#########################################

proxy-address = :3306








ここで、/ etc / init.d /に次の内容のmysql-proxyファイルを作成します。



#!/usr/bin/perl -w

$appPath='mysql-proxy ';

#Path for configuration file. Modify if different.

$configFileName='/etc/mysql-proxy/mysql-proxy.conf';

chomp($input=lc($ARGV[0]));

if ($input eq 'start')

{

open(CONFIG, "$configFileName")||die "File open error!: $!\n";

while (){push (@fileStrings, $_);}

close(CONFIG);

chomp(@addresses = grep {/^\s*proxy-backend-addresses\s*=/i} @fileStrings);

foreach (@addresses)

{

($parameter,$value)=split(/=/);

$parameter =~ s/\s+//g;

$value =~ s/\s+//g;

$appPath=$appPath."--".$parameter."=".$value." ";

}

chomp(@addresses = grep {/^\s*proxy-address\s*=/i} @fileStrings);

@addresses= split(/=/,$addresses[0]);

$addresses[1] =~ s/\s+//g;

$appPath=$appPath."--proxy-address=".$addresses[1]." --daemon";

print "Starting mysql-proxy...\n";

system($appPath);

print "Done!\n";

}

else

{

if ($input eq 'stop')

{

print "Trying to kill mysql-proxy...\n";

system ('killall mysql-proxy');

print "Done!\n";

}

else {print "Usage: /etc/init.d/mysql-proxy start|stop\n";}

}








関連リンク:

1. Ubuntu 8.04での高可用性Apache

2. Ubuntu 8.04上の負荷分散された高可用性MySQL

3. Ubuntu 8.04での高可用性MySQL

4. MySQLフェイルオーバー

5. 負荷分散された高可用性Apacheクラスターをすばやくセットアップする方法

6. ApacheMySQLPHP



All Articles