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


アドウェイズエンジニアのイシマルです。

最近は、何も無い平らな道でつまずいたり、
3秒前に思ったことを忘れてしまったりと、
"少し"ボケキャラが浸透してまいりました。

というわけで、当ブログの編集長のキクチさんに、
「平らな道でつまずく実演」をされたりと、
いい感じにいじられながら楽しく仕事しています^^;

では、本題のMySQL-MHA編を紹介します!

サーバ構成、サーバ要件は、前回の

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

を参照してください。

MySQL-MHA

マスター・スレーブ構成で、スレーブをマスターに昇格させる作業って面倒ですよね。
そういう面倒な作業を自動でやってくれるのが、この「mha4mysql」というツールです。

これを使って、自動フェイルオーバーを実現しました!

今回のポイントは、
  • MHAの起動は、mysqlユーザーで行う。
  • 優先的にマスターになるサーバを、「DBサーバ1」、「DBサーバ2」に指定
  • MHA Managerは、「DBサーバ3」で通常時は起動
      マスターとは反対の物理上でManagerは立ち上げることにしました。
     どのサーバでもManagerを起動できるように、managerとnodeを全DBサーバに導入
こんなイメージです。

blog2_1


普通は、ManagerをDBサーバとは別に用意するようですが、今回はサーバの都合上
DBサーバにManagerも入れました。

mysql-MHAのマニュアルはこちら
http://code.google.com/p/mysql-master-ha/wiki/TableOfContents?tm=6

■インストールと設定

MySQL 準同期レプリケーションの設定

MHAの前に、レプリケーションの設定を簡単に紹介します。

* DBサーバ1のmy.cnfにレプリケーション用の設定を追加
[mysqld]

log-bin
server-id=1
report_host=DBサーバ1のホスト名

# semi sync replication
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=5000

* DBサーバ2のmy.cnfにレプリケーション用の設定を追加
[mysqld]

log-bin
server-id=2
report_host=DBサーバ2のホスト名

# semi sync replication
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1

* DBサーバ3のmy.cnfにレプリケーション用の設定を追加

DBサーバ2と同様に設定します。

* DBサーバ1(マスター)をdumpし、binlogのポジション、ログファイル名を取得
mysql> flush privileges;
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;

ここで、mysqldumpする。

mysql> UNLOCK TABLES;

* DBサーバ2、DBサーバ3に入り、slave startする。
CHANGE MASTER TO
       MASTER_HOST='192.168.0.101',
       MASTER_USER='repl',
       MASTER_PASSWORD='replpassword',
       MASTER_LOG_FILE='db_server1-bin.000001',
       MASTER_LOG_POS=275;

START SLAVE;

* レプリケーションの確認用コマンド

・マスターサーバで
mysql> show slave hosts;

・スレーブサーバで
mysql> show slave status;

* レプリケーションの確認

masterサーバで、create database hoge; などして、slaveサーバにも作成されているか確認すればOK。

MySQL-MHA

* mha4mysqlをインストールするのに必要なソフトをインストール

mha4mysqlはperlのツールなので、必要なソフトをインストールします。
# yum install perl-CPAN
# yum install perl-DBI
# yum install perl-DBD-mysql
# yum install perl-Config-Tiny
# yum install perl-Time-HiRes
# perl -MCPAN -e shell
cpan> install YAML
cpan> install Log::Dispatch
cpan> install Parallel::ForkManager 

* mha4mysql-managerのインストール
# cd /usr/local/src
# wget http://mysql-master-ha.googlecode.com/files/mha4mysql-manager-0.55.tar.gz
# tar zxf mha4mysql-manager-0.55.tar.gz
# cd mha4mysql-manager-0.55
# perl Makefile.PL
# make;make install

* mha4mysql-nodeのインストール
# wget http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.54.tar.gz
# tar zxf mha4mysql-node-0.54.tar.gz
# cd mha4mysql-node-0.54
# perl Makefile.PL
# make;make install

* DBサーバ間で相互ログインができるようにする。

各サーバで、Keyを作成し、公開鍵ログインできるようにする。
# passwd mysql
# su - mysql
$ ssh-keygen -b 1024 -t rsa
$ vi ~/.ssh/authorized_keys
$ chmod 700 ~/.ssh/authorized_keys

* MHA用にディレクトリを作成する。
# mkdir -p /var/lib/mysql_mha/log
# chown -R mysql:mysql /var/lib/mysql_mha

* MHAの設定ファイル
# vi /etc/app1.cnf

[server default]
manager_log=/var/lib/mysql_mha/log/masterha/app1/app1.log
manager_workdir=/var/lib/mysql_mha/masterha/app1
password=レプリケーション用ユーザーのパスワード
remote_workdir=/var/lib/mysql_mha/log/masterha/app1
ssh_user=mysql
user=レプリケーション用

[server1]
hostname=192.168.0.101
candidate_master=1

[server2]
hostname=192.168.0.102
candidate_master=1

[server3]
hostname=192.168.0.103
#no_master=1

* mha-managerの起動

・通常起動
$ masterha_manager --conf=/etc/app1.cnf

・落ちたmasterの設定を自動で設定ファイルから削除する設定をつけて起動
$ masterha_manager --conf=/etc/app1.cnf --remove_dead_master_conf

* mha-managerの起動状態の確認
$ masterha_check_status --conf=/etc/app1.cnf

* マスター/スレーブの手動切り替え
$ masterha_master_switch --master_state=alive --conf=/etc/app1.cnf --new_master_host=192.168.0.102 --orig_master_is_new_slave

* mha-managerをバックグラウンドで起動する

mha-managerはデフォルトではフォアグランドで起動されます。

バックグランドで起動するには、マニュアルに書かれているままですが、



の方法で、バックグラウンドで起動できます。

http://code.google.com/p/mysql-master-ha/wiki/Runnning_Background

* その他スクリプト

mha-managerのマニュアルを見ると、フェイルオーバー完了時などに
スクリプトを実行したりもできるようです。

・master_ip_failover_script
 フェイルオーバー完了時に起動するスクリプト

・shutdown_script マスタシャットダウン時
 マスタシャットダウン時に起動するスクリプト

・report_script
 フェイルオーバー完了時やエラー時に起動するスクリプト

また、設定ファイルのパラメータは、以下で確認できます。

http://code.google.com/p/mysql-master-ha/wiki/Parameters

* 自動フェイルオーバーの注意点

mhaの設定のテストを、DBサーバを落としたり、物理を落としたりしながら
試していたところ、連続してフェイルオーバーすると、自動では切り替わらない
ことがわかりました。

ログを見ると、

「前回、フェイルオーバーしたばかりだから、確認してね」

って書かれていて、以下のファイルを消して再度managerを起動すると、
フェイルオーバーが完了するようです。

rm -f /var/lib/mysql_mha/masterha/app1/app1.failover.complete

というわけで今回はここまで。
次回は、xtrabackup編を紹介したいと思います!