モチベーション

MySQLのフェールオーバを実現するためにMHAのインストール、設定、動作確認がしたい。

MHAとは

MHAとは障害発生時にMasterのフェールオーバを自動化とスレーブの昇格を短いダウンタイムで自動的に行うためのツール。この辺をツールなしにやろうとするとミスオペの危険を孕んでいるし、何より手順が複雑で面倒なので大変便利なツールである。今回はそのツールの設定から動作確認までを行おうと思う。

検証環境

MHA用サーバ×1、MySQL Master×2、Slave×2にて検証を行う。

00_mha_master_slave_relationships1

検証で使う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.cnfserver-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-perl4.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-perl4.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は正常に動作しないので注意が必要だ。

参考

公式

Perlモジュールのインストール

Debian packageのビルド

master_ip_failoverのFIXME部分の説明