MySQL-MHAを導入してみる

*半年間、MySQLを基礎からやり直すことにしたので、その間に勉強したことをQiitaに投稿していきます。*

#MySQL-MHAを導入してみる
## MHA構成
```
# Server
mysql-dbm01：(mysqldb-master)
mysql-dbs01：(mysqldb-slave)
mysql-dbctl01：(mysql-mha-manager)

OS：CentOS6.5
MySQL：5.5.38
```

MySQLは既にインストール済みという前提で進めるので、もしまだインストールしてない場合は
下記手順を参考に準備しておいて下さい
[CentOS6.5にMySQL5.5.38をインストールする手順](http://qiita.com/shotaTsuge/items/7f02fb684233188c51e1)
[MySQLでレプリケーションを組んでみる](http://qiita.com/shotaTsuge/items/87e872e6522e6cd8cea9)
[MySQLのmasterとslaveの手動切り替え](http://qiita.com/shotaTsuge/items/83e4387d6c8488677e17)


## MHA構成に必要なパッケージのインストール
### MySQLサーバへMHAノード(mha4mysql-node)をインストール

```
$ cd /usr/local/src
$ wget https://72003f4c60f5cc941cd1c7d448fc3c99e0aebaa8.googledrive.com/host/0B1lu97m8-haWeHdGWXp0YVVUSlk/mha4mysql-node-0.56-0.el6.noarch.rpm
$ yum localinstall mha4mysql-node-0.56-0.el6.noarch.rpm

$ rpm -ql mha4mysql-node
```

### MHAマネージャ(mha4mysql-manager)をインストール
```
$ cd /usr/local/src
$ wget https://72003f4c60f5cc941cd1c7d448fc3c99e0aebaa8.googledrive.com/host/0B1lu97m8-haWeHdGWXp0YVVUSlk/mha4mysql-node-0.56-0.el6.noarch.rpm
$ wget https://72003f4c60f5cc941cd1c7d448fc3c99e0aebaa8.googledrive.com/host/0B1lu97m8-haWeHdGWXp0YVVUSlk/mha4mysql-manager-0.56-0.el6.noarch.rpm
$ yum localinstall mha4mysql-node-0.56-0.el6.noarch.rpm
$ yum localinstall mha4mysql-manager-0.56-0.el6.noarch.rpm
$ rpm -ql mha4mysql-manager
```

## MHA構築前の事前準備
### sshログイン出来る用に設定する
```
# mysql-dbctl01：(mysql-mha-manager)で鍵を作成し、他のサーバへも展開する
$ su - mysql
$ ssh-keygen -t rsa
$ cd /var/lib/mysql/.ssh
$ mv id_rsa.pub authorized_keys
$ chmod 600 authorized_keys

# myqlサーバ(master:slave)にもscpコマンドで配布する
$ scp id_rsa {user_name}@XXX.XXX.XXX.XXX:/var/lib/mysql/.ssh
$ scp authorized_keys {user_name}@XXX.XXX.XXX.XXX:/var/lib/mysql/.ssh

# 権限周りをmysqlユーザの600で設定しておく（mysql-dbm01, mysql-dbs01）
$ chown mysql:mysql /var/lib/mysql/.ssh/id_rsa
$ chown mysql:mysql /var/lib/mysql/.ssh/authorized_keys
$ chmod 600 /var/lib/mysql/.ssh/id_rsa
$ chmod 600 /var/lib/mysql/.ssh/authorized_keys
```

### mysql側にmha用のユーザを作成しておく
```
mysql> GRANT ALL ON *.* TO 'mha'@'XXX.XXX.XXX.XXX' IDENTIFIED BY 'mha';
mysql> select user, host from mysql.user where user = 'mha';
+------+-----------------+
| user | host            |
+------+-----------------+
| mha  | XXX.XXX.XXX.XXX |
+------+-----------------+
1 row in set (0.00 sec)
```

### ログ・作業ディレクトリの準備

```
# 今回は、manager_workdir・remote_workdirも同じディレクトリ構成にしたので
# mysql-mha-manager, mysqldb(master-slave)共に同じように用意します
$ sudo mkdir /var/lib/mha
$ chown mysql:mysql /var/lib/mha
$ chmod 755 /var/lib/mha
```

### 設定ファイルの作成
```
$ vim /etc/mha.cnf

[server default]
# mha用に作成したmysqlユーザ情報
user=mha
password=mha

# mysqlのレプリ用ユーザ
repl_user=repli
repl_password=repli

# ログ・作業ディレクトリパス情報
# mysql-mha-managerのディレクトリパス
manager_workdir=/var/lib/mha
manager_log=/var/log/mha/mha.log

# mysqldb(master-slave)のディレクトリパス
remote_workdir=/var/lib/mha

# バイナリログのディレクトリパス
master_binlog_dir=/var/lib/mysql

# ssh接続ユーザ
ssh_user=mysql
[server1]
hostname=XXX.XXX.XXX.XXX
[server2]
hostname=XXX.XXX.XXX.XXX
```

## MHA接続最終確認
###MHA構成のサーバ同士でSSH接続できるかを確認する
```
$ su - mysql
$ masterha_check_ssh --conf=/etc/mha.cnf
Mon Nov 30 16:33:45 2015 - [info] Reading default configuration from /etc/masterha_default.cnf..
Mon Nov 30 16:33:45 2015 - [info] Reading application default configuration from /etc/mha.cnf..
Mon Nov 30 16:33:45 2015 - [info] Reading server configuration from /etc/mha.cnf..
Mon Nov 30 16:33:45 2015 - [info] Starting SSH connection tests..
Mon Nov 30 16:33:49 2015 - [debug]
Mon Nov 30 16:33:45 2015 - [debug]  Connecting via SSH from mysql@10.34.74.182(10.34.74.182:22) to mysql@XXX.XXX.XXX.XXX(XXX.XXX.XXX.XXX:22)..
Mon Nov 30 16:33:49 2015 - [debug]   ok.
Mon Nov 30 16:33:50 2015 - [debug]
Mon Nov 30 16:33:45 2015 - [debug]  Connecting via SSH from mysql@10.34.74.255(10.34.74.255:22) to mysql@XXX.XXX.XXX.XXX(XXX.XXX.XXX.XXX:22)..
Mon Nov 30 16:33:50 2015 - [debug]   ok.
Mon Nov 30 16:33:50 2015 - [info] All SSH connection tests passed successfully.
```

### こんなWARNINGが出た時の対応

```
Mon Nov 30 12:13:37 2015 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
```

エラーの理由としては、デフォルトで共通設定用の/etc/masterha_default.cnfの設定ファイルを
読みにいくがファイルがないので出る警告です

まぁー無視してもいいのですが、WARNINGを出したくない場合は、空ファイルでもいいので、
とりあえずmasterha_default.cnfを作成しておくとよいです。

```
$ touch /etc/masterha_default.cnf
```

### MHA構成内のDBサーバのレプリケーション確認
```
$ masterha_check_repl --conf=/etc/mha.cnf
```

### ちなみに、MySQLユーザ権限周りが足りないとこんなエラー出ます
```
# masterha_check_repl --conf=/etc/mha.cnf実行したら、こんなエラーが出た
mysql command failed with rc 1:0!
 at /usr/bin/apply_diff_relay_logs line 375
	main::check() called at /usr/bin/apply_diff_relay_logs line 497
	eval {...} called at /usr/bin/apply_diff_relay_logs line 475
	main::main() called at /usr/bin/apply_diff_relay_logs line 120
Mon Nov 30 18:26:55 2015 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln205] Slaves settings check failed!
Mon Nov 30 18:26:55 2015 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln413] Slave configuration failed.
Mon Nov 30 18:26:55 2015 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln424] Error happened on checking configurations.  at /usr/bin/masterha_check_repl line 48
Mon Nov 30 18:26:55 2015 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln523] Error happened on monitoring servers.
Mon Nov 30 18:26:55 2015 - [info] Got exit code 1 (Not master dead).

MySQL Replication Health is NOT OK!
```
#### 解決策
```
#myqlサーバ(master:slave)にmhaユーザの権限を付与した（IPは、mysqldbをいれる）
mysql> GRANT ALL ON *.* TO 'mha'@'XXX.XXX.XXX.XXX' IDENTIFIED BY 'mha';

#再度実行
MySQL Replication Health is OK.
```

##MHAプロセス起動・確認・停止

```
# MHAプロセス起動
$ masterha_manager --conf=/etc/mha.cnf

# 別のターミナルでmysql-dbctl01：(mysql-mha-manager)へアクセスして確認
# MHAプロセス確認
$ masterha_check_status --conf=/etc/mha.cnf
mha (pid:2659) is running(0:PING_OK), master:XXX.XXX.XXX.XXX

# MHAプロセス停止
$ masterha_stop --conf=/etc/mha.cnf
Stopped mha successfully.
```

##MHAプロセスをバックグラウンドで実行する
```
# MHAプロセス開始
$ nohup masterha_manager --conf=/etc/mha.cnf < /dev/null > /var/log/mha/mha.log 2>&1 &
[1] 3180

# MHAプロセス確認
$ masterha_check_status --conf=/etc/mha.cnf
mha (pid:3180) is running(0:PING_OK), master:XXX.XXX.XXX.XXX

# MHAプロセス停止
$ masterha_stop --conf=/etc/mha.cnf
Stopped mha successfully.
[1]+  Exit 1                  nohup masterha_manager --conf=/etc/mha.cnf < /dev/null > /var/log/mha/mha.log 2>&1
```

次回は、[mha4mysql-manager](https://github.com/yoshinorim/mha4mysql-manager)のmaster_ip_failover使ってフェイルオーバ試す予定です。