はじめまして、アドウェイズエンジニアのイシマルです。
私がアドウェイズに入社してから7ヶ月が過ぎましたが、楽しいエンジニア生活を送っています。
アドウェイズに入る前は、大規模なシステムに携わったことがなかったのですが、
「やってみたい!」
と手を挙げると、私のチームのリーダーは、
というわけで、今回は、初挑戦のKeepAlivedとMySQL-MHAを用いた自動フェイルオーバー(keepalived編)を検証してみましたので、ご紹介します!
■サーバ構成
サーバ構成の要点をまとめると、
- 各サーバは仮想OSにし、物理サーバ1、物理サーバ2に上記のように配置しました。
- MySQLは、今回は、参照系クエリと更新系クエリを処理するサーバを分けていません。
- MySQLは、準同期レプリケーションにしました。
■サーバ要件
- 物理サーバ1、物理サーバ2単体でもシステムが正常に動作すること
- 通常時は、メインで物理サーバ1を利用すること
- 物理サーバ1が落ちた際に、物理サーバ2に自動でシステムが切り替わること
KeepAlived
- DBサーバの生存監視に利用。
- WebアプリからDBサーバへのアクセスは、VIP(Virtual IP Address)宛にしておきます。(こうすることで、物理サーバ1から物理サーバ2に切り替わった時も、Webサーバ側を変更する必要がありません)
- DBサーバが落ちた時に、VIPを切り替えます。
こんなイメージです。
■インストールと設定
●KeepAlived
* ipvsadmのインストール
# yum install ipvsadm
* keepalivedをインストールするのに必要なソフトをインストール
# yum install -y kernel-devel make gcc openssl-devel popt-devel
* keepalivedのインストール
# cd /usr/local/src/ # wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz # tar xvfz keepalived-1.2.7.tar.gz # cd keepalived-1.2.7 # ./configure;make ;make install
* keepalivedの起動設定
# ln -s /usr/local/etc/keepalived-1.2.7 /usr/local/etc/keepalived # ln -s /usr/local/sbin/keepalived /usr/sbin/ # ln -s /usr/local/etc/keepalived/bin/genhash /usr/bin/ # cp -p /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/ # cp -p /usr/local/etc/sysconfig/keepalived /etc/sysconfig/ # mkdir /etc/keepalived # mv /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
* keepalivedの設定ファイル(DBサーバ1)
# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs { notification_email { notice用のメールアドレス } notification_email_from notice用のメールの送信元アドレス smtp_server localhost smtp_connect_timeout 30 } vrrp_instance vip_mysqld { state BACKUP # VIPを割り当てるNIC interface eth0 grap_master_delay 5 # 仮想ルーターのID virtual_router_id 1 # 優先度 priority 150 #今起動しているのがなければ、マスタになり、マスタがいれば、スレーブ。 nopreempt # VRRP信号を送出する間隔 advert_int 1 authentication { auth_type PASS auth_pass パスワード } virtual_ipaddress { 192.168.0.100 } } virtual_server 192.168.0.100 3306 { #監視の間隔 delay_loop 6 lvs_method DR # プロトコルの種類 protocol TCP real_server 192.168.0.101 3306 { TCP_CHECK { connect_port 3306 connect_timeout 30 } # ダウン後に呼び出される処理 notify_down "/etc/rc.d/init.d/keepalived stop" } real_server 192.168.0.102 3306 { TCP_CHECK { connect_port 3306 connect_timeout 30 } } real_server 192.168.0.103 3306 { TCP_CHECK { connect_port 3306 connect_timeout 30 } } }
* keepalivedの設定ファイル(DBサーバ2,DBサーバ3)
keepalivedの設定ファイルで、
DBサーバ2: priority 100
DBサーバ3: priority 50
と、「ダウン後に呼び出される処理」をそれぞれのサーバに変更しました。
他はすべて同じ設定に。
DBサーバ2: priority 100
DBサーバ3: priority 50
と、「ダウン後に呼び出される処理」をそれぞれのサーバに変更しました。
他はすべて同じ設定に。
* keepalivedの起動
# /etc/init.d/keepalived start
* keepalivedの停止
# /etc/init.d/keepalived stop
* vip(virtual ip address)の確認
# /sbin/ip addr show
以下のように、VIPが設定されます。
* VIPが切り替わるかを確認
以下の手順で確認できます。
各DBサーバのkeepalivedを全て停止した状態から、
1.DBサーバ1のkeepalivedを起動
確認点: DBサーバ1にVIPが設定されていること
2.DBサーバ2,DBサーバ3のkeepalivedを起動
確認点: DBサーバ1にVIPが設定されたままであること
3.各サーバで、「/sbin/ip addr show」で確認
確認点: DBサーバ1にVIPが設定されていること
4.DBサーバ1のkeepalivedを停止
確認点: DBサーバ2にVIPが設定されていること
5.DBサーバ1のkeepalivedを起動
確認点: DBサーバ2にVIPが設定されたままであること
6.DBサーバ2のkeepalivedを停止
確認点: DBサーバ1にVIPが設定されていること
7.DBサーバ2のkeepalivedを起動
確認点: DBサーバ1にVIPが設定されたままであること
というわけで今回はここまで。各DBサーバのkeepalivedを全て停止した状態から、
1.DBサーバ1のkeepalivedを起動
確認点: DBサーバ1にVIPが設定されていること
2.DBサーバ2,DBサーバ3のkeepalivedを起動
確認点: DBサーバ1にVIPが設定されたままであること
3.各サーバで、「/sbin/ip addr show」で確認
確認点: DBサーバ1にVIPが設定されていること
4.DBサーバ1のkeepalivedを停止
確認点: DBサーバ2にVIPが設定されていること
5.DBサーバ1のkeepalivedを起動
確認点: DBサーバ2にVIPが設定されたままであること
6.DBサーバ2のkeepalivedを停止
確認点: DBサーバ1にVIPが設定されていること
7.DBサーバ2のkeepalivedを起動
確認点: DBサーバ1にVIPが設定されたままであること
次回は、MySQL-MHA編をご紹介したいと思います!