読者です 読者をやめる 読者になる 読者になる

keepalived + MySQL-MHA + xtrabackupで自動フェイルオーバーと手動フェイルバック(その1 keepalived編)


はじめまして、アドウェイズエンジニアのイシマルです。

私がアドウェイズに入社してから7ヶ月が過ぎましたが、楽しいエンジニア生活を送っています。

アドウェイズに入る前は、大規模なシステムに携わったことがなかったのですが、

「やってみたい!」

と手を挙げると、私のチームのリーダーは、

何でも丸投げしてくれる快く挑戦する機会を与えてくれるので、非常にありがたく感じています。

というわけで、今回は、初挑戦のKeepAlivedMySQL-MHAを用いた自動フェイルオーバー(keepalived編)を検証してみましたので、ご紹介します!

■サーバ構成

blog1_1_1

サーバ構成の要点をまとめると、
  • 各サーバは仮想OSにし、物理サーバ1、物理サーバ2に上記のように配置しました。
  • MySQLは、今回は、参照系クエリと更新系クエリを処理するサーバを分けていません。
  • MySQLは、準同期レプリケーションにしました。


■サーバ要件
  • 物理サーバ1、物理サーバ2単体でもシステムが正常に動作すること
  • 通常時は、メインで物理サーバ1を利用すること
  • 物理サーバ1が落ちた際に、物理サーバ2に自動でシステムが切り替わること


KeepAlived
  • DBサーバの生存監視に利用。
  • WebアプリからDBサーバへのアクセスは、VIP(Virtual IP Address)宛にしておきます。(こうすることで、物理サーバ1から物理サーバ2に切り替わった時も、Webサーバ側を変更する必要がありません)
  • DBサーバが落ちた時に、VIPを切り替えます。

こんなイメージです。

blog1_2


■インストールと設定

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

と、「ダウン後に呼び出される処理」をそれぞれのサーバに変更しました。
他はすべて同じ設定に。


* keepalivedの起動
# /etc/init.d/keepalived start

* keepalivedの停止
# /etc/init.d/keepalived stop

* vip(virtual ip address)の確認
# /sbin/ip addr show

以下のように、VIPが設定されます。

blog1_3



* 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編をご紹介したいと思います!