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