アドウェイズエンジニアのイシマルです。
最近は、何も無い平らな道でつまずいたり、
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サーバに導入
普通は、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はデフォルトではフォアグランドで起動されます。
バックグランドで起動するには、マニュアルに書かれているままですが、
- 「&」をつけて起動する
- daemontoolsを利用する
の方法で、バックグラウンドで起動できます。
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編を紹介したいと思います!