MySQLのMasterフェールオーバのためのMHAのインストールと設定
モチベーション
MySQLのフェールオーバを実現するためにMHAのインストール、設定、動作確認がしたい。
MHAとは
MHAとは障害発生時にMasterのフェールオーバを自動化とスレーブの昇格を短いダウンタイムで自動的に行うためのツール。この辺をツールなしにやろうとするとミスオペの危険を孕んでいるし、何より手順が複雑で面倒なので大変便利なツールである。今回はそのツールの設定から動作確認までを行おうと思う。
検証環境
MHA用サーバ×1、MySQL Master×2、Slave×2にて検証を行う。
検証で使うVMはVerification of Master HA setting and behavior · GitHubを利用した。一連の手順は理解を深めるために手打ちで実施した。
mhaでの各コマンド実行結果は以下の通り。
vagrant@mha:~$ uname -a Linux mha 3.13.0-83-generic #127-Ubuntu SMP Fri Mar 11 00:25:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux vagrant@mha:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.4 LTS Release: 14.04 Codename: trusty
MHA利用の前準備
以下のことを踏まえてレプリケーションとsshの設定をする。
- MHAはレプリケーションの設定には関与しない。レプリケーション周りは全て自分で設定する。(逆に言えば、レプリケーションが設定されている既存の環境に簡単に導入できる)
- MHA nodeはmha,master,slaveの全てで必要
- mha managerも内部的にmha nodeモジュールを必要とするのでインストールする必要あり
- Master/Slaveでレプリケーションの設定ができていること
- MHA、Master、Slave間で公開鍵を使ったssh接続ができること
レプリケーションの設定をする
Masterの設定
Masterにするmaster1にMySQL5.6のインストールとレプリケーションの設定を行う。
vagrant@master1:~$ sudo apt-get update vagrant@master1:~$ sudo apt-get install -y mysql-server-5.6
mysql5.6をインストールするタイミングでrootユーザのパスワード入力を促されるのでrootを入力しておく。インストールができたら、レプリケーション用のmy.cnf
の設定を追加する。
vagrant@master1:~$ sudo vim /etc/mysql/my.cnf # [mysqld] セクションの以下の設定を入れる server-id = 1 log_bin = /var/log/mysql/mysql-bin.log bind-address = 0.0.0.0
設定したらudo service mysql restart
で反映させる。続いて、レプリケーション用のユーザの作成とbinlogの確認をする。
vagrant@master1:~$ mysql -uroot -p mysql> SHOW MASTER STATUS\G *************************** 1. row *************************** File: mysql-bin.000001 Position: 120 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.00 sec) mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.33.%' IDENTIFIED BY 'replpass'; mysql> FLUSH PRIVILEGES; mysql> SELECT user,password,host from mysql.user WHERE user='repl'; +------+-------------------------------------------+--------------+ | user | password | host | +------+-------------------------------------------+--------------+ | repl | *D98280F03D0F78162EBDBB9C883FC01395DEA2BF | 192.168.33.% | +------+-------------------------------------------+--------------+
master1のレプリケーション用の設定は終了。
Slaveの設定
master1,slave1,2にてSlaveの設定をする。基本的にはmaster1と同様の手順を辿る。ただし、binlogの確認は必要ないし、my.cnf
のserver-id
の値は一意にする必要がある。ここでは、それぞれ2,3,4とした。また、MHAを利用してMasterに昇格する予定のmaster2のみrealユーザを作成しておく。
設定が終わったらmaster2、slave1,2にてレプリケーションを開始する。
mysql> CHANGE MASTER TO MASTER_HOST='192.168.33.10', MASTER_USER='repl',MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=120; mysql> START SLAVE; mysql> SHOW SLAVE STATUS \G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.33.10 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 408 Relay_Log_File: mysqld-relay-bin.000002 Relay_Log_Pos: 571 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 408 Relay_Log_Space: 745 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: b1378c8c-118e-11e6-8559-080027c924d6 Master_Info_File: /var/lib/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 1 row in set (0.00 sec)
レプリケーションの設定はここまで。
SSH公開鍵の設定をする
MHAを使う場合、ssh公開鍵認証を使い相互に接続できなくてはならない。ここではrootユーザのssh公開鍵の設定を行う。まず、mhaにて以下を行う。
vagrant@mha:~$ sudo apt-get update vagrant@mha:~$ sudo su root@mha:/home/vagrant# cd /root/.ssh root@mha:~/.ssh# ssh-keygen -t rsa -f id_rsa_mha -P "" root@mha:~/.ssh# ls authorized_keys id_rsa_mha id_rsa_mha.pub root@mha:~/.ssh# cat id_rsa_mha.pub >> authorized_keys root@mha:~/.ssh# echo -e "Host *\n User root\n IdentityFile /root/.ssh/id_rsa_mha\n StrictHostKeyChecking no\n CheckHostIP no" > /root/.ssh/config root@mha:~/.ssh# chmod 600 /root/.ssh/config root@mha:~/.ssh# chmod 400 id_rsa_mha root@mha:~/.ssh# cat config Host * User root IdentityFile /root/.ssh/id_rsa_mha StrictHostKeyChecking no CheckHostIP no
同じ鍵とssh configをmaster1,2,slave1,2にscpで転送する。
root@mha:~/.ssh# scp /root/.ssh/{id_rsa_mha,id_rsa_mha.pub,config} vagrant@192.168.33.10: root@mha:~/.ssh# scp /root/.ssh/{id_rsa_mha,id_rsa_mha.pub,config} vagrant@192.168.33.11: root@mha:~/.ssh# scp /root/.ssh/{id_rsa_mha,id_rsa_mha.pub,config} vagrant@192.168.33.20: root@mha:~/.ssh# scp /root/.ssh/{id_rsa_mha,id_rsa_mha.pub,config} vagrant@192.168.33.21:
転送後`/root/.ssh配下に全てのファイルを配置し、authorized_keysの登録もしておく。
vagrant@master1:~$ sudo su root@master1:/home/vagrant# mv {config,id_rsa_mha,id_rsa_mha.pub} /root/.ssh/ root@master1:/home/vagrant# ls /root/.ssh/ authorized_keys config id_rsa_mha id_rsa_mha.pub root@master1:/home/vagrant# cat /root/.ssh/id_rsa_mha.pub >> /root/.ssh/authorized_keys root@master1:/home/vagrant# chmod 600 /root/.ssh/config root@master1:/home/vagrant# chown root:root /root/.ssh/{id_rsa_mha*,config}
mhaからmaster1にsshしてみてパスワード入力なしでログインできればssh公開鍵の設定は終了
root@mha:~/.ssh# ssh 192.168.33.10 Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 3.13.0-83-generic x86_64) * Documentation: https://help.ubuntu.com/ System information as of Wed May 4 01:09:43 UTC 2016 System load: 0.0 Processes: 80 Usage of /: 4.3% of 39.34GB Users logged in: 1 Memory usage: 30% IP address for eth0: 10.0.2.15 Swap usage: 0% IP address for eth1: 192.168.33.10 Graph this data and manage this system at: https://landscape.canonical.com/ Get cloud support with Ubuntu Advantage Cloud Guest: http://www.ubuntu.com/business/services/cloud The programs included with the Ubuntu system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law.
MHAのインストール
MHAはManagerとNode、2つのコンポーネントから成り立っている。Managerはmhaのみにインストールすればよいが、Nodeはmha、master、slave、つまり全てのノードにインストールする必要がある。インストールはInstallation · yoshinorim/mha4mysql-manager Wiki · GitHubを参考にした。
MHA Nodeのインストール
libdbd-mysql-perl
のインストールから行う。ここで、インストールドキュメント通りapt-get install libdbd-mysql-perl
でPerlモジュールをインストールしてはいけない。今回、Ubuntu trustyで検証をしているがUbuntu – Details of source package libdbd-mysql-perl in trustyを見る限りlibdbd-mysql-perl
のバージョンは4.025-1
である。一方で、mha4mysql-node/control at master · yoshinorim/mha4mysql-node · GitHubによると、MHAはlibdbd-mysql-perl
の4.031
を必要としている。自分はここで結構な時間を浪費した[1]。従って、libdbd-mysql-perlは自分で自分でビルドしてインストールする。
まずはビルドに必要なツールをインストールする。
sudo apt-get -y install build-essential devscripts dh-make fakeroot dpkg-dev debhelper libdbi-perl libmysqlclient-dev zlib1g-dev
続いて、ビルドに必要なパッケージをアーカイブから取得する。
cd ~ wget http://archive.ubuntu.com/ubuntu/pool/universe/libd/libdbd-mysql-perl/libdbd-mysql-perl_4.033.orig.tar.gz wget http://archive.ubuntu.com/ubuntu/pool/universe/libd/libdbd-mysql-perl/libdbd-mysql-perl_4.033-1build2.debian.tar.xz
パッケージをビルドする。
mkdir work cp libdbd-mysql-perl_4.033.orig.tar.gz work cd work tar xf libdbd-mysql-perl_4.033.orig.tar.gz mv DBD-mysql-4.033 libdbd-mysql-perl_4.033 tar xf ../libdbd-mysql-perl_4.033-1build2.debian.tar.xz -C libdbd-mysql-perl_4.033 cd libdbd-mysql-perl_4.033 dpkg-buildpackage -us -uc
ビルドしたパッケージをインストールする。
cd .. sudo dpkg -i libdbd-mysql-perl_4.033-1build2_amd64.deb
これで、libdbd-mysql-perl
の4.031
インストールができた。続いてMHA Nodeをインストールする。
cd sudo apt-get install -y git git clone https://github.com/yoshinorim/mha4mysql-node cd mha4mysql-node perl Makefile.PL make sudo make install
このとき以下のようなエラーが出たらPerlのModule::Install
モジュールをインストールする必要がある。(sudo apt-get install libmodule-install-perl
でOK)
vagrant@mha:~/mha4mysql-node$ perl Makefile.PL Can't locate inc/Module/Install.pm in @INC (you may need to install the inc::Module::Install module) (@INC contains: /etc/perl /usr/local/lib/perl/5.18.2 /usr/local/share/perl/5.18.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.18 /usr/share/perl/5.18 /usr/local/lib/site_perl .) at Makefile.PL line 1. BEGIN failed--compilation aborted at Makefile.PL line 1.
これでMHA Nodeのインストールは終了。
MHA Managerのインストール
mhaにてManagerをインストールする。まずは必要なPerlモジュールをインストールする。
sudo apt-get install -y libconfig-tiny-perl liblog-dispatch-perl libparallel-forkmanager-perl
続いて、Managerをインストールする。
vagrant@mha:~$ git clone https://github.com/yoshinorim/mha4mysql-manager.git
vagrant@mha:~$ cd mha4mysql-manager
vagrant@mha:~/mha4mysql-manager$ perl Makefile.PL
vagrant@mha:~/mha4mysql-manager$ make
vagrant@mha:~/mha4mysql-manager$ sudo make install
最後にフェールオーバで利用するスクリプトをインストールしたディレクトリに格納する。
vagrant@mha:~/mha4mysql-manager$ sudo cp -p samples/scripts/master_ip_failover /usr/local/bin/ vagrant@mha:~/mha4mysql-manager$ sudo chown root:root /usr/local/bin/master_ip_failover vagrant@mha:~/mha4mysql-manager$ sudo chmod 555 /usr/local/bin/master_ip_failover vagrant@mha:~/mha4mysql-manager$ ll /usr/local/bin/ total 96 drwxr-xr-x 2 root root 4096 May 4 04:32 ./ drwxr-xr-x 10 root root 4096 Mar 14 20:41 ../ -r-xr-xr-x 1 root root 16371 May 4 04:15 apply_diff_relay_logs* -r-xr-xr-x 1 root root 4807 May 4 04:15 filter_mysqlbinlog* -r-xr-xr-x 1 root root 1995 May 4 04:26 masterha_check_repl* -r-xr-xr-x 1 root root 1779 May 4 04:26 masterha_check_ssh* -r-xr-xr-x 1 root root 1865 May 4 04:26 masterha_check_status* -r-xr-xr-x 1 root root 3201 May 4 04:26 masterha_conf_host* -r-xr-xr-x 1 root root 2517 May 4 04:26 masterha_manager* -r-xr-xr-x 1 root root 2165 May 4 04:26 masterha_master_monitor* -r-xr-xr-x 1 root root 2373 May 4 04:26 masterha_master_switch* -r-xr-xr-x 1 root root 5172 May 4 04:26 masterha_secondary_check* -r-xr-xr-x 1 root root 1739 May 4 04:26 masterha_stop* -r-xr-xr-x 1 root root 3648 May 4 04:25 master_ip_failover* -r-xr-xr-x 1 root root 8263 May 4 04:15 purge_relay_logs* -r-xr-xr-x 1 root root 7525 May 4 04:15 save_binary_logs*
MHAの設定ファイルを作る
MHAの設定ファイルを作る。MHAはデフォルトでは/etc/masterha_default.cnf
を読み込みに行くが、他の設定ファイルも読み込める。ここではtest.conf
を作る。
vagrant@mha:~$ sudo mkdir -p /etc/masterha/conf vagrant@mha:~$ sudo vim /etc/masterha/conf/test.conf
test.confの内容は以下のとおり。
[server default] # mysql user and password user=mha password=mhapass # ssh user ssh_user=root # working directory on the manager manager_workdir=/var/log/masterha/ # manager log file manager_log=/var/log/masterha/ master_binlog_dir= /var/lib/mysql # working directory on MySQL servers remote_workdir=/var/log/masterha/ [server1] # master1 hostname=192.168.33.10 [server2] # master2 hostname=192.168.33.11 [server3] # slave1 hostname=192.168.33.20 [server4] # slave2 hostname=192.168.33.21
上記設定にあるように、master1にてMHAが利用するMySQLユーザmha
を作る。
mysql -uroot -p mysql > GRANT ALL ON *.* TO 'mha'@'192.168.33.%' IDENTIFIED BY 'mhapass'; mysql> FLUSH PRIVILEGES;
また、必要なディレクトリを作る。
vagrant@mha:~$ sudo mkdir -p /var/log/masterha/
master1,2,slave1,2でもディレクトリを作る。
vagrant@master1:~$ sudo mkdir -p /var/log/masterha/
MHAのテストスクリプトを動かす
MHAのインストールと設定が終わったら動作確認のためのテストスクリプトを動かす。
SSHの相互接続のテスト
SSH相互接続の動作確認をする。
vagrant@mha:~$ sudo masterha_check_ssh --conf=/etc/masterha/conf/test.conf Wed May 4 05:23:00 2016 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping. Wed May 4 05:23:00 2016 - [info] Reading application default configuration from /etc/masterha/conf/test.conf.. Wed May 4 05:23:00 2016 - [info] Reading server configuration from /etc/masterha/conf/test.conf.. Wed May 4 05:23:00 2016 - [info] Starting SSH connection tests.. Wed May 4 05:23:02 2016 - [debug] Wed May 4 05:23:00 2016 - [debug] Connecting via SSH from root@192.168.33.10(192.168.33.10:22) to root@192.168.33.11(192.168.33.11:22).. Wed May 4 05:23:01 2016 - [debug] ok. Wed May 4 05:23:01 2016 - [debug] Connecting via SSH from root@192.168.33.10(192.168.33.10:22) to root@192.168.33.20(192.168.33.20:22).. Warning: Permanently added '192.168.33.20' (ECDSA) to the list of known hosts. Wed May 4 05:23:02 2016 - [debug] ok. Wed May 4 05:23:02 2016 - [debug] Connecting via SSH from root@192.168.33.10(192.168.33.10:22) to root@192.168.33.21(192.168.33.21:22).. Wed May 4 05:23:02 2016 - [debug] ok. Wed May 4 05:23:03 2016 - [debug] Wed May 4 05:23:01 2016 - [debug] Connecting via SSH from root@192.168.33.11(192.168.33.11:22) to root@192.168.33.10(192.168.33.10:22).. Wed May 4 05:23:01 2016 - [debug] ok. Wed May 4 05:23:01 2016 - [debug] Connecting via SSH from root@192.168.33.11(192.168.33.11:22) to root@192.168.33.20(192.168.33.20:22).. Warning: Permanently added '192.168.33.20' (ECDSA) to the list of known hosts. Wed May 4 05:23:02 2016 - [debug] ok. Wed May 4 05:23:02 2016 - [debug] Connecting via SSH from root@192.168.33.11(192.168.33.11:22) to root@192.168.33.21(192.168.33.21:22).. Wed May 4 05:23:03 2016 - [debug] ok. Wed May 4 05:23:03 2016 - [debug] Wed May 4 05:23:01 2016 - [debug] Connecting via SSH from root@192.168.33.20(192.168.33.20:22) to root@192.168.33.10(192.168.33.10:22).. Warning: Permanently added '192.168.33.10' (ECDSA) to the list of known hosts. Wed May 4 05:23:02 2016 - [debug] ok. Wed May 4 05:23:02 2016 - [debug] Connecting via SSH from root@192.168.33.20(192.168.33.20:22) to root@192.168.33.11(192.168.33.11:22).. Warning: Permanently added '192.168.33.11' (ECDSA) to the list of known hosts. Wed May 4 05:23:03 2016 - [debug] ok. Wed May 4 05:23:03 2016 - [debug] Connecting via SSH from root@192.168.33.20(192.168.33.20:22) to root@192.168.33.21(192.168.33.21:22).. Warning: Permanently added '192.168.33.21' (ECDSA) to the list of known hosts. Wed May 4 05:23:03 2016 - [debug] ok. Wed May 4 05:23:04 2016 - [debug] Wed May 4 05:23:02 2016 - [debug] Connecting via SSH from root@192.168.33.21(192.168.33.21:22) to root@192.168.33.10(192.168.33.10:22).. Wed May 4 05:23:03 2016 - [debug] ok. Wed May 4 05:23:03 2016 - [debug] Connecting via SSH from root@192.168.33.21(192.168.33.21:22) to root@192.168.33.11(192.168.33.11:22).. Wed May 4 05:23:03 2016 - [debug] ok. Wed May 4 05:23:03 2016 - [debug] Connecting via SSH from root@192.168.33.21(192.168.33.21:22) to root@192.168.33.20(192.168.33.20:22).. Warning: Permanently added '192.168.33.20' (ECDSA) to the list of known hosts. Wed May 4 05:23:04 2016 - [debug] ok. Wed May 4 05:23:04 2016 - [info] All SSH connection tests passed successfully.
SSHはうまく動作するようだ。
レプリケーションのテスト
レプリケーションのテストも行う。
vagrant@mha:~$ sudo masterha_check_repl --conf=/etc/masterha/conf/test.conf Wed May 4 05:23:53 2016 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping. Wed May 4 05:23:53 2016 - [info] Reading application default configuration from /etc/masterha/conf/test.conf.. Wed May 4 05:23:53 2016 - [info] Reading server configuration from /etc/masterha/conf/test.conf.. Wed May 4 05:23:53 2016 - [info] MHA::MasterMonitor version 0.57. Wed May 4 05:23:53 2016 - [info] GTID failover mode = 0 Wed May 4 05:23:53 2016 - [info] Dead Servers: Wed May 4 05:23:53 2016 - [info] Alive Servers: Wed May 4 05:23:53 2016 - [info] 192.168.33.10(192.168.33.10:3306) Wed May 4 05:23:53 2016 - [info] 192.168.33.11(192.168.33.11:3306) Wed May 4 05:23:53 2016 - [info] 192.168.33.20(192.168.33.20:3306) Wed May 4 05:23:53 2016 - [info] 192.168.33.21(192.168.33.21:3306) Wed May 4 05:23:53 2016 - [info] Alive Slaves: Wed May 4 05:23:53 2016 - [info] 192.168.33.11(192.168.33.11:3306) Version=5.6.30-0ubuntu0.14.04.1-log (oldest major version between slaves) log-bin:enabled Wed May 4 05:23:53 2016 - [info] Replicating from 192.168.33.10(192.168.33.10:3306) Wed May 4 05:23:53 2016 - [info] 192.168.33.20(192.168.33.20:3306) Version=5.6.30-0ubuntu0.14.04.1-log (oldest major version between slaves) log-bin:enabled Wed May 4 05:23:53 2016 - [info] Replicating from 192.168.33.10(192.168.33.10:3306) Wed May 4 05:23:53 2016 - [info] 192.168.33.21(192.168.33.21:3306) Version=5.6.30-0ubuntu0.14.04.1-log (oldest major version between slaves) log-bin:enabled Wed May 4 05:23:53 2016 - [info] Replicating from 192.168.33.10(192.168.33.10:3306) Wed May 4 05:23:53 2016 - [info] Current Alive Master: 192.168.33.10(192.168.33.10:3306) Wed May 4 05:23:53 2016 - [info] Checking slave configurations.. Wed May 4 05:23:53 2016 - [info] read_only=1 is not set on slave 192.168.33.11(192.168.33.11:3306). Wed May 4 05:23:53 2016 - [warning] relay_log_purge=0 is not set on slave 192.168.33.11(192.168.33.11:3306). Wed May 4 05:23:53 2016 - [info] read_only=1 is not set on slave 192.168.33.20(192.168.33.20:3306). Wed May 4 05:23:53 2016 - [warning] relay_log_purge=0 is not set on slave 192.168.33.20(192.168.33.20:3306). Wed May 4 05:23:53 2016 - [info] read_only=1 is not set on slave 192.168.33.21(192.168.33.21:3306). Wed May 4 05:23:53 2016 - [warning] relay_log_purge=0 is not set on slave 192.168.33.21(192.168.33.21:3306). Wed May 4 05:23:53 2016 - [info] Checking replication filtering settings.. Wed May 4 05:23:53 2016 - [info] binlog_do_db= , binlog_ignore_db= Wed May 4 05:23:53 2016 - [info] Replication filtering check ok. Wed May 4 05:23:53 2016 - [info] GTID (with auto-pos) is not supported Wed May 4 05:23:53 2016 - [info] Starting SSH connection tests.. Wed May 4 05:23:57 2016 - [info] All SSH connection tests passed successfully. Wed May 4 05:23:57 2016 - [info] Checking MHA Node version.. Wed May 4 05:23:57 2016 - [info] Version check ok. Wed May 4 05:23:57 2016 - [info] Checking SSH publickey authentication settings on the current master.. Wed May 4 05:23:58 2016 - [info] HealthCheck: SSH to 192.168.33.10 is reachable. Wed May 4 05:23:58 2016 - [info] Master MHA Node version is 0.57. Wed May 4 05:23:58 2016 - [info] Checking recovery script configurations on 192.168.33.10(192.168.33.10:3306).. Wed May 4 05:23:58 2016 - [info] Executing command: save_binary_logs --command=test --start_pos=4 --binlog_dir=/var/log/mysql --output_file=/var/log/masterha//save_binary_logs_test --manager_version=0.57 --start_file=mysql-bin.000001 Wed May 4 05:23:58 2016 - [info] Connecting to root@192.168.33.10(192.168.33.10:22).. Creating /var/log/masterha if not exists.. ok. Checking output directory is accessible or not.. ok. Binlog found at /var/log/mysql, up to mysql-bin.000001 Wed May 4 05:23:58 2016 - [info] Binlog setting check done. Wed May 4 05:23:58 2016 - [info] Checking SSH publickey authentication and checking recovery script configurations on all alive slave servers.. Wed May 4 05:23:58 2016 - [info] Executing command : apply_diff_relay_logs --command=test --slave_user='mha' --slave_host=192.168.33.11 --slave_ip=192.168.33.11 --slave_port=3306 --workdir=/var/log/masterha/ --target_version=5.6.30-0ubuntu0.14.04.1-log --manager_version=0.57 --relay_log_info=/var/lib/mysql/relay-log.info --relay_dir=/var/lib/mysql/ --slave_pass=xxx Wed May 4 05:23:58 2016 - [info] Connecting to root@192.168.33.11(192.168.33.11:22).. Checking slave recovery environment settings.. Opening /var/lib/mysql/relay-log.info ... ok. Relay log found at /var/lib/mysql, up to mysqld-relay-bin.000002 Temporary relay log file is /var/lib/mysql/mysqld-relay-bin.000002 Testing mysql connection and privileges..Warning: Using a password on the command line interface can be insecure. done. Testing mysqlbinlog output.. done. Cleaning up test file(s).. done. Wed May 4 05:23:59 2016 - [info] Executing command : apply_diff_relay_logs --command=test --slave_user='mha' --slave_host=192.168.33.20 --slave_ip=192.168.33.20 --slave_port=3306 --workdir=/var/log/masterha/ --target_version=5.6.30-0ubuntu0.14.04.1-log --manager_version=0.57 --relay_log_info=/var/lib/mysql/relay-log.info --relay_dir=/var/lib/mysql/ --slave_pass=xxx Wed May 4 05:23:59 2016 - [info] Connecting to root@192.168.33.20(192.168.33.20:22).. Creating directory /var/log/masterha/.. done. Checking slave recovery environment settings.. Opening /var/lib/mysql/relay-log.info ... ok. Relay log found at /var/lib/mysql, up to mysqld-relay-bin.000002 Temporary relay log file is /var/lib/mysql/mysqld-relay-bin.000002 Testing mysql connection and privileges..Warning: Using a password on the command line interface can be insecure. done. Testing mysqlbinlog output.. done. Cleaning up test file(s).. done. Wed May 4 05:23:59 2016 - [info] Executing command : apply_diff_relay_logs --command=test --slave_user='mha' --slave_host=192.168.33.21 --slave_ip=192.168.33.21 --slave_port=3306 --workdir=/var/log/masterha/ --target_version=5.6.30-0ubuntu0.14.04.1-log --manager_version=0.57 --relay_log_info=/var/lib/mysql/relay-log.info --relay_dir=/var/lib/mysql/ --slave_pass=xxx Wed May 4 05:23:59 2016 - [info] Connecting to root@192.168.33.21(192.168.33.21:22).. Checking slave recovery environment settings.. Opening /var/lib/mysql/relay-log.info ... ok. Relay log found at /var/lib/mysql, up to mysqld-relay-bin.000002 Temporary relay log file is /var/lib/mysql/mysqld-relay-bin.000002 Testing mysql connection and privileges..Warning: Using a password on the command line interface can be insecure. done. Testing mysqlbinlog output.. done. Cleaning up test file(s).. done. Wed May 4 05:23:59 2016 - [info] Slaves settings check done. Wed May 4 05:23:59 2016 - [info] 192.168.33.10(192.168.33.10:3306) (current master) +--192.168.33.11(192.168.33.11:3306) +--192.168.33.20(192.168.33.20:3306) +--192.168.33.21(192.168.33.21:3306) Wed May 4 05:23:59 2016 - [info] Checking replication health on 192.168.33.11.. Wed May 4 05:23:59 2016 - [info] ok. Wed May 4 05:23:59 2016 - [info] Checking replication health on 192.168.33.20.. Wed May 4 05:23:59 2016 - [info] ok. Wed May 4 05:23:59 2016 - [info] Checking replication health on 192.168.33.21.. Wed May 4 05:23:59 2016 - [info] ok. Wed May 4 05:23:59 2016 - [warning] master_ip_failover_script is not defined. Wed May 4 05:23:59 2016 - [warning] shutdown_script is not defined. Wed May 4 05:23:59 2016 - [info] Got exit code 0 (Not master dead). MySQL Replication Health is OK.
レプリケーションも上手く動作しているようだ。出力からわかるように、master1のスレーブとなっているノードが全てスレーブのチェック時に確認できる。ここで確認できていないときはレプリケーションの状態や設定を疑うこと。
192.168.33.10(192.168.33.10:3306) (current master) +--192.168.33.11(192.168.33.11:3306) +--192.168.33.20(192.168.33.20:3306) +--192.168.33.21(192.168.33.21:3306)
Waringを消す
レプリケーションの動作確認の出力にmaster_ip_failover_script is not defined.
と表示されていたのでこれを消す。test.conf
に以下を追記する。
master_ip_failover_script=/usr/local/bin/master_ip_failover
この状態で再度動作確認をすると以下のエラーがでる。
Wed May 4 05:28:05 2016 - [info] /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.33.10 --orig_master_ip=192.168.33.10 --orig_master_port=3306 Bareword "FIXME_xxx" not allowed while "strict subs" in use at /usr/local/bin/master_ip_failover line 93. Execution of /usr/local/bin/master_ip_failover aborted due to compilation errors. Wed May 4 05:28:05 2016 - [error][/usr/local/share/perl/5.18.2/MHA/MasterMonitor.pm, ln229] Failed to get master_ip_failover_script status with return code 255:0. Wed May 4 05:28:05 2016 - [error][/usr/local/share/perl/5.18.2/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations. at /usr/local/bin/masterha_check_repl line 48. Wed May 4 05:28:05 2016 - [error][/usr/local/share/perl/5.18.2/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers. Wed May 4 05:28:05 2016 - [info] Got exit code 1 (Not master dead). MySQL Replication Health is NOT OK!
これは、master_ip_failover
の中でFIXME(新しいMasterにアプリケーション用のユーザを作成する時、アプリケーションからみた場合のMasterのホスト名を変更する時)の修正をしていないためである。今回、このFIXMEの部分は必要ないので、今回は以下のようにコメントアウトすることで対処する。
## Creating an app user on the new master
print "Creating app user on the new master..\n";
#FIXME_xxx_create_user( $new_master_handler->{dbh} );
$new_master_handler->enable_log_bin_local();
$new_master_handler->disconnect();
## Update master ip on the catalog database, etc
#FIXME_xxx;
$exit_code = 0;
今回はここまで。
Memo
古いバージョンのlibdbd-mysql-perlを使うとエラーが発生する
[1] libdbd-mysql-perlを自分でビルドせずにUbuntuのapt-getを使ってインストールした時にMHAが上手く動かないことに気づくまで多くの時間を費やしたのでデバッグの記録をしておく。
本記事が説明したようにsshやレプリケーションの設定、MHA Manager、Nodeのインストールをする。その際、libdbd-mysql-perlは公式ドキュメントに従いapt-get install libdbd-mysql-perl
でインストールする。最後に、masterha_check_repl
コマンドを実行して、masterhaのコンフィグで定義したサーバ間でレプリケーションが可能な状態かどうか確認すると以下のエラーが出る。
sudo masterha_check_repl --conf=/etc/masterha/test.cnf
Wed Apr 27 04:33:43 2016 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Wed Apr 27 04:33:43 2016 - [info] Reading application default configuration from /etc/masterha/test.cnf..
Wed Apr 27 04:33:43 2016 - [info] Reading server configuration from /etc/masterha/test.cnf..
Wed Apr 27 04:33:43 2016 - [info] MHA::MasterMonitor version 0.57.
Wed Apr 27 04:33:43 2016 - [error][/usr/local/share/perl/5.18.2/MHA/ServerManager.pm, ln188] There is no alive server. We can't do failover
Wed Apr 27 04:33:43 2016 - [error][/usr/local/share/perl/5.18.2/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations. at /usr/local/share/perl/5.18.2/MHA/MasterMonitor.pm line 329.
Wed Apr 27 04:33:43 2016 - [error][/usr/local/share/perl/5.18.2/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Wed Apr 27 04:33:43 2016 - [info] Got exit code 1 (Not master dead).
MySQL Replication Health is NOT OK!
大量にエラーが出た…。これだけだと何が悪いのかよくわからないのでlog_levelを変更(test.confにlog_level=debug
を追記)していてデバッグする。
root@mha:/var/log/masterha/app1# vim /etc/masterha/test.cnf
root@mha:/var/log/masterha/app1# sudo masterha_check_repl --conf=/etc/masterha/test.cnf
Wed Apr 27 06:03:18 2016 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Wed Apr 27 06:03:18 2016 - [info] Reading application default configuration from /etc/masterha/test.cnf..
Wed Apr 27 06:03:18 2016 - [info] Reading server configuration from /etc/masterha/test.cnf..
Wed Apr 27 06:03:18 2016 - [info] MHA::MasterMonitor version 0.57.
Wed Apr 27 06:03:18 2016 - [debug] Connecting to servers..
Wed Apr 27 06:03:18 2016 - [debug] Got MySQL error when connecting 192.168.33.20(192.168.33.20:3306) :2005:Unknown MySQL server host '[192.168.33.20]' (0)
Wed Apr 27 06:03:18 2016 - [debug] Got MySQL error when connecting 192.168.33.11(192.168.33.11:3306) :2005:Unknown MySQL server host '[192.168.33.11]' (0)
Wed Apr 27 06:03:18 2016 - [debug] Got MySQL error when connecting 192.168.33.21(192.168.33.21:3306) :2005:Unknown MySQL server host '[192.168.33.21]' (0)
Wed Apr 27 06:03:18 2016 - [debug] Got MySQL error when connecting 192.168.33.10(192.168.33.10:3306) :2005:Unknown MySQL server host '[192.168.33.10]' (0)
Wed Apr 27 06:03:18 2016 - [error][/usr/local/share/perl/5.18.2/MHA/ServerManager.pm, ln188] There is no alive server. We can't do failover
Wed Apr 27 06:03:18 2016 - [error][/usr/local/share/perl/5.18.2/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations. at /usr/local/share/perl/5.18.2/MHA/MasterMonitor.pm line 329.
Wed Apr 27 06:03:18 2016 - [error][/usr/local/share/perl/5.18.2/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Wed Apr 27 06:03:18 2016 - [info] Got exit code 1 (Not master dead).
MySQL Replication Health is NOT OK!
2005:Unknown MySQL server host '[192.168.33.20]'
が出ている、どうやら[192.168.33.20]
なるホスト名でMySQLにアクセスしてエラーが発生しているように見える・・・?
MHAのDBD利用箇所を読んで見る。
MHAはPerlで書かれておりデータベースとのインタフェースにはDBD-mysql
が使われている。データベースとの接続は、DBHelper.pm
のconnect関数で行っている。
sub connect {
my $self = shift;
my $host = shift;
my $port = shift;
my $user = shift;
my $password = shift;
my $raise_error = shift;
my $max_retries = shift;
$raise_error = 0 if ( !defined($raise_error) );
$max_retries = 2 if ( !defined($max_retries) );
$self->{dbh} = undef;
unless ( $self->{dsn} ) {
$self->{dsn} = "DBI:mysql:;host=[$host];port=$port;mysql_connect_timeout=4";
}
確かにdsnの定義でhost=[$host]
と書かれている。これ、[]外せばエラーなくなるんじゃないか?と思い、試しに外してレプリケーションテストコマンドを実行するとエラーが無くなり動作確認が終了した。
新しいlibdbd-mysql-perlは[$host]のsyntaxを許容する
エラーが発生する理由が、DBI:mysql:;host=[$host];port=$port;mysql_connect_timeout=4
のようにホストのsyntaxで[]
を使っているせいだとわかった。
この変更が加えられたコミットを見るとどうやらlibdbd-mysql-perl
がipv6対応のためにホストをブラケットで囲う記法を追加しており、それに追従するためのようだ。
libdbd-mysql-perlの方の変更を見るとMHAのDBHelper.pmのブラケットを追加した人が、ブラケット記法について説明を追加していたり、ipv6アドレスがhostに渡された時のブラケットの処理が追加されていたり大きな変更が入っている。
この変更が含まれていないバージョンのlibdbd-mysql-perlを使うと、最新のMHAは正常に動作しないので注意が必要だ。
参考
公式
- GitHub - yoshinorim/mha4mysql-manager: Development tree of Master High Availability Manager and tools for MySQL (MHA), Manager part
- MHA for MySQLとDeNAのオープンソースの話
- Google Code:MHA for MySQL: Master High Availability Manager and tools for MySQL