半年間、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をインストールする手順
MySQLでレプリケーションを組んでみる
MySQLのmasterとslaveの手動切り替え
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のmaster_ip_failover使ってフェイルオーバ試す予定です。