programer
やっとMySQL-MHAを試してみました(`・ω・´)シャキーン

■MySQL MHAとは
DeNAの松信嘉範氏が作られたものです!
機能や概要について
※MHA for MySQLとDeNAのオープンソースの話から抜粋になります。

主な特徴
・マスターの稼働監視からフェイルオーバーまでを自動でできる
フェイルオーバーを手動で行なうことも可能
・フェイルオーバーが秒単位で可能
アクティブ/アクティブ型のため
(障害検知に10秒程度→マスター修復に4秒ほどらしい)
・非同期レプリケーションにもかかわらず、スレーブ間での同期が取れている
・任意のスレーブを新マスターにできる
・いくつかの箇所から外部スクリプトを呼ぶ機能(拡張ポイント)がある
電源OFFやIPアドレスのフェイルオーバーなどに使う
・MySQL5.0以降であれば標準のMySQLで動作する
・インストール/アンインストールにあたり現在のmysqldプロセスやレプリケーションを止める必要が無い
・MHA自体は追加の負荷をかけないため、パフォーマンスが 低下せず、追加のサーバも不要
・ストレージエンジンに依存しない
・バイナリログのフォーマットに依存しないStatementベースでもRowベースでも大丈夫

既存のソリューションに対する優位性
マスター障害が起きても、スレーブ間での整合性が崩れずに迅速にレプ リケーションを再開できる
障害検知に10秒程度→マスター修復に4秒程度
既存のMySQLレプリケーション構成を変える必要が無い
従来型のシングルマスター/マルチスレーブ構成であればOK
MySQL5.0以降であれば動作する(5.0/5.1/5.5/5.6で動作確認済み)
5.5の準同期レプリケーションと組み合わせることで、データ消失をほぼ防げる
サーバの追加投資が不要
アクティブ/スタンバイ構成時のスタンバイ機のようなサーバが不要
管理サーバはスレーブ上で動作させることもできる
独立した管理サーバを設け、多数のマスターを監視することもできる
既存のレプリケーション構成とほぼ同等のパフォーマンスを得られる
マスターに対して過度の負荷をかけたりはしない
どのストレージエンジンでも動作する
MyISAM等、トランザクション非対応のストレージエンジンでも動作する


■動作の流れ
MHA for MySQL の概要から抜粋になります。

・Manager が MySQL Master を監視
・ダウンを検知すると、以下を実行
 - Master の最新のバイナリログを各 Slave に保存(可能であれば)
– 新マスターのリカバリ
・スレーブのうちのひとつを新マスターにする
・デフォルトでは一番新しいポジションまで進んでいるスレーブが選ばれる。
設定で、このスレーブを次のマスターにする、といったこともできる。
・新マスターにバイナリログの最新のポジションまでのデータを反映させる
-その他のスレーブのリカバリ
・バイナリログの最新のポジションまでのデータを反映させる
・新マスターからレプリケーションを開始

■mha-managerとmha-nodeについて

mha-manager
masterの死活監視とフェイルオーバー全体の制御を行うプロセス。なるべく各MySQLサーバとは別のサーバで稼動させた方が良い。

mha-node
各MySQLに設定され、フェイルオーバーが発生した場合に、slaveの更新状態などを調査し、masterへの昇格を行う。

では、検証検証!!!ワッショイヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノワッショイ
今回の検証で使用したサーバー構成は次のようになります。
masterには仮想IPを設定してあります。

・mha-managerサーバー
 IP:192.168.10.227)
・masterサーバー
IP:192.168.10.228
VIP:192.168.10.234
・salve1
IP:192.168.10.229
・salve2
IP:192.168.10.233

それでは、さっそくインストールを行っていきたいと思います( ̄ー ̄)ニヤリ

■手順1)MySQL-MHAサーバーの設定
masterの死活監視とフェイルオーバー全体の制御を行うプロセスで、
なるべく各MySQLサーバとは別のサーバで稼動させる。

インストールにepelリポジトリが必要なので導入しておく。

EPELリポジトリを導入しておく。




#CentOS 5用
rpm -ivh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm




■手順2)mha4mysql-nodeのインストール
mha4mysql-nodeの最新版は次のようになっていました。

mha4mysql-nodeのCentOS 6用
mha4mysql-node-0.54-0.el6.noarch.rpm
mha4mysql-nodeのCentOS 5用
mha4mysql-node-0.54-1.el5.noarch.rpm

mha4mysql-node-0.54.tar.gz

ダウンロードを行う。



#CentOS 6用
# wget https://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.54-0.el6.noarch.rpm
 
#CentOS 5用
# wget https://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.54-1.el5.noarch.rpm
--2013-02-07 12:04:58--  http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.54-1.el5.noarch.rpm
mysql-master-ha.googlecode.com をDNSに問いあわせています... 173.194.72.82, 2404:6800:4008:c01::52
mysql-master-ha.googlecode.com|173.194.72.82|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 34908 (34K) [application/x-rpm]
`mha4mysql-node-0.54-1.el5.noarch.rpm' に保存中
 
100%[============================================================================================================================>] 34,908      --.-K/s 時間 0.1s
 
2013-02-07 12:04:59 (318 KB/s) - `mha4mysql-node-0.54-1.el5.noarch.rpm' へ保存完了 [34908/34908]



インストールする



#CentOS 6用
# yum localinstall mha4mysql-node-0.54-1.el6.noarch.rpm
 
#CentOS 5用
# yum localinstall mha4mysql-node-0.54-1.el5.noarch.rpm
Loaded plugins: fastestmirror, priorities, security
Setting up Local Package Process
Examining mha4mysql-node-0.54-1.el5.noarch.rpm: mha4mysql-node-0.54-1.el5.noarch
Marking mha4mysql-node-0.54-1.el5.noarch.rpm to be installed
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * elrepo: elrepo.org
 * epel: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * rpmforge: ftp.riken.jp
 * updates: ftp.tsukuba.wide.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package mha4mysql-node.noarch 0:0.54-1.el5 set to be updated
--> Processing Dependency: perl(DBD::mysql) for package: mha4mysql-node
--> Processing Dependency: perl(DBI) for package: mha4mysql-node
--> Processing Dependency: perl(DBI) for package: mha4mysql-node
--> Running transaction check
---> Package perl-DBD-MySQL.i386 0:3.0007-2.el5 set to be updated
--> Processing Dependency: libmysqlclient.so.15 for package: perl-DBD-MySQL
--> Processing Dependency: libmysqlclient.so.15(libmysqlclient_15) for package: perl-DBD-MySQL
---> Package perl-DBI.i386 0:1.52-2.el5 set to be updated
--> Running transaction check
---> Package mysql.i386 0:5.0.95-5.el5_9 set to be updated
--> Finished Dependency Resolution
 
Dependencies Resolved
 
===================================================================================================================================================================
 Package                             Arch                        Version                              Repository                                              Size
===================================================================================================================================================================
Installing:
 mha4mysql-node                      noarch                      0.54-1.el5                           /mha4mysql-node-0.54-1.el5.noarch                       98 k
Installing for dependencies:
 mysql                               i386                        5.0.95-5.el5_9                       updates                                                4.9 M
 perl-DBD-MySQL                      i386                        3.0007-2.el5                         base                                                   148 k
 perl-DBI                            i386                        1.52-2.el5                           base                                                   600 k
 
Transaction Summary
===================================================================================================================================================================
Install       4 Package(s)
Upgrade       0 Package(s)
 
Total size: 5.7 M
Is this ok [y/N]: y
Downloading Packages:
 
 
Package mha4mysql-node-0.54-1.el5.noarch.rpm is not signed






あれ、失敗ガ━━(;゚Д゚)━━ン!!

Package ****** is not signedというエラーは、
RPMがGPG署名されていないものの場合に出るらしいので、
GPG署名を検証しないオプションをつけてリトライする:(;゙゚’ω゚’):
※GPG署名がないものは基本的には信頼できるパッケージ以外はインストールしない方が(・∀・)イイ!!らしい!



Package ****** is not signed



–nogpgcheckオプションをつけて再度リトライ≡≡≡≡≡≡≡≡≡≡c⌒っ゚Д゚)っ






#CentOS 6用
# yum localinstall --nogpgcheck mha4mysql-node-0.54-1.el6.noarch.rpm
 
#CentOS 5用
# yum localinstall --nogpgcheck mha4mysql-node-0.54-1.el5.noarch.rpm
Loaded plugins: fastestmirror, priorities, security
Setting up Local Package Process
Examining mha4mysql-node-0.54-1.el5.noarch.rpm: mha4mysql-node-0.54-1.el5.noarch
Marking mha4mysql-node-0.54-1.el5.noarch.rpm to be installed
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * elrepo: elrepo.org
 * epel: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * rpmforge: ftp.riken.jp
 * updates: ftp.tsukuba.wide.ad.jp
base                                                                                                                                        | 1.1 kB     00:00
elrepo                                                                                                                                      | 1.9 kB     00:00
epel                                                                                                                                        | 3.7 kB     00:00
extras                                                                                                                                      | 2.1 kB     00:00
rpmforge                                                                                                                                    | 1.9 kB     00:00
updates                                                                                                                                     | 1.9 kB     00:00
Resolving Dependencies
--> Running transaction check
---> Package mha4mysql-node.noarch 0:0.54-1.el5 set to be updated
--> Processing Dependency: perl(DBD::mysql) for package: mha4mysql-node
--> Processing Dependency: perl(DBI) for package: mha4mysql-node
--> Processing Dependency: perl(DBI) for package: mha4mysql-node
--> Running transaction check
---> Package perl-DBD-MySQL.i386 0:3.0007-2.el5 set to be updated
--> Processing Dependency: libmysqlclient.so.15 for package: perl-DBD-MySQL
--> Processing Dependency: libmysqlclient.so.15(libmysqlclient_15) for package: perl-DBD-MySQL
---> Package perl-DBI.i386 0:1.52-2.el5 set to be updated
--> Running transaction check
---> Package mysql.i386 0:5.0.95-5.el5_9 set to be updated
--> Finished Dependency Resolution
 
Dependencies Resolved
 
===================================================================================================================================================================
 Package                             Arch                        Version                              Repository                                              Size
===================================================================================================================================================================
Installing:
 mha4mysql-node                      noarch                      0.54-1.el5                           /mha4mysql-node-0.54-1.el5.noarch                       98 k
Installing for dependencies:
 mysql                               i386                        5.0.95-5.el5_9                       updates                                                4.9 M
 perl-DBD-MySQL                      i386                        3.0007-2.el5                         base                                                   148 k
 perl-DBI                            i386                        1.52-2.el5                           base                                                   600 k
 
Transaction Summary
===================================================================================================================================================================
Install       4 Package(s)
Upgrade       0 Package(s)
 
Total size: 5.7 M
Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : perl-DBI                                                                                                                                    1/4
  Installing     : mysql                                                                                                                                       2/4
  Installing     : perl-DBD-MySQL                                                                                                                              3/4
  Installing     : mha4mysql-node                                                                                                                              4/4
 
Installed:
  mha4mysql-node.noarch 0:0.54-1.el5
 
Dependency Installed:
  mysql.i386 0:5.0.95-5.el5_9                         perl-DBD-MySQL.i386 0:3.0007-2.el5                         perl-DBI.i386 0:1.52-2.el5
 
Complete!




(゚∀゚)キタコレ!!

インストールされた内容の確認




# rpm -ql mha4mysql-node
/usr/bin/apply_diff_relay_logs
/usr/bin/filter_mysqlbinlog
/usr/bin/purge_relay_logs
/usr/bin/save_binary_logs
/usr/lib/perl5/vendor_perl/MHA/BinlogHeaderParser.pm
/usr/lib/perl5/vendor_perl/MHA/BinlogManager.pm
/usr/lib/perl5/vendor_perl/MHA/BinlogPosFindManager.pm
/usr/lib/perl5/vendor_perl/MHA/BinlogPosFinder.pm
/usr/lib/perl5/vendor_perl/MHA/BinlogPosFinderElp.pm
/usr/lib/perl5/vendor_perl/MHA/BinlogPosFinderXid.pm
/usr/lib/perl5/vendor_perl/MHA/NodeConst.pm
/usr/lib/perl5/vendor_perl/MHA/NodeUtil.pm
/usr/lib/perl5/vendor_perl/MHA/SlaveUtil.pm
/usr/share/man/man1/apply_diff_relay_logs.1.gz
/usr/share/man/man1/filter_mysqlbinlog.1.gz
/usr/share/man/man1/purge_relay_logs.1.gz
/usr/share/man/man1/save_binary_logs.1.gz



■手順3)mha4mysql-managerのインストール

最新版は次のようになっていました。
CentOS 6用
mha4mysql-manager-0.55-0.el6.noarch.rpm
CentOS 5用
mha4mysql-manager-0.55-1.el5.noarch.rpm
mha4mysql-manager-0.55.tar.gz

ダウンロード



#CentOS 6用
wget https://mysql-master-ha.googlecode.com/files/mha4mysql-manager-0.55-0.el6.noarch.rpm
#CentOS 5用
wget https://mysql-master-ha.googlecode.com/files/mha4mysql-manager-0.55-1.el5.noarch.rpm




インストールする。こちらもnogpgcheckオプションを利用する。



#CentOS 6用
# yum localinstall --nogpgcheck mha4mysql-manager-0.55-0.el6.noarch.rpm
#CentOS 5用
# yum localinstall --nogpgcheck mha4mysql-manager-0.55-1.el5.noarch.rpm
Loaded plugins: fastestmirror, priorities, security
Setting up Local Package Process
Examining mha4mysql-manager-0.55-1.el5.noarch.rpm: mha4mysql-manager-0.55-1.el5.noarch
Marking mha4mysql-manager-0.55-1.el5.noarch.rpm to be installed
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * elrepo: elrepo.org
 * epel: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * rpmforge: ftp.riken.jp
 * updates: ftp.tsukuba.wide.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package mha4mysql-manager.noarch 0:0.55-1.el5 set to be updated
--> Processing Dependency: perl(Config::Tiny) for package: mha4mysql-manager
--> Processing Dependency: perl(Config::Tiny) for package: mha4mysql-manager
--> Processing Dependency: perl(Log::Dispatch) for package: mha4mysql-manager
--> Processing Dependency: perl(Log::Dispatch) for package: mha4mysql-manager
--> Processing Dependency: perl(Log::Dispatch::File) for package: mha4mysql-manager
--> Processing Dependency: perl(Log::Dispatch::Screen) for package: mha4mysql-manager
--> Processing Dependency: perl(Parallel::ForkManager) for package: mha4mysql-manager
--> Processing Dependency: perl(Parallel::ForkManager) for package: mha4mysql-manager
--> Running transaction check
---> Package perl-Config-Tiny.noarch 0:2.12-1.el5.rf set to be updated
---> Package perl-Log-Dispatch.noarch 0:2.26-1.el5.rf set to be updated
--> Processing Dependency: perl(Params::Validate) >= 0.15 for package: perl-Log-Dispatch
---> Package perl-Parallel-ForkManager.noarch 0:0.7.5-4.el5 set to be updated
--> Running transaction check
---> Package perl-Params-Validate.i386 0:0.95-1.el5.rf set to be updated
--> Finished Dependency Resolution
 
Dependencies Resolved
 
===================================================================================================================================================================
 Package                                     Arch                     Version                         Repository                                              Size
===================================================================================================================================================================
Installing:
 mha4mysql-manager                           noarch                   0.55-1.el5                      /mha4mysql-manager-0.55-1.el5.noarch                   292 k
Installing for dependencies:
 perl-Config-Tiny                            noarch                   2.12-1.el5.rf                   rpmforge                                                21 k
 perl-Log-Dispatch                           noarch                   2.26-1.el5.rf                   rpmforge                                                73 k
 perl-Parallel-ForkManager                   noarch                   0.7.5-4.el5                     epel                                                    15 k
 perl-Params-Validate                        i386                     0.95-1.el5.rf                   rpmforge                                               113 k
 
Transaction Summary
===================================================================================================================================================================
Install       5 Package(s)
Upgrade       0 Package(s)
 
Total size: 514 k
Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : perl-Params-Validate                                                                                                                        1/5
  Installing     : perl-Log-Dispatch                                                                                                                           2/5
  Installing     : perl-Parallel-ForkManager                                                                                                                   3/5
  Installing     : perl-Config-Tiny                                                                                                                            4/5
  Installing     : mha4mysql-manager                                                                                                                           5/5
 
Installed:
  mha4mysql-manager.noarch 0:0.55-1.el5
 
Dependency Installed:
  perl-Config-Tiny.noarch 0:2.12-1.el5.rf             perl-Log-Dispatch.noarch 0:2.26-1.el5.rf           perl-Parallel-ForkManager.noarch 0:0.7.5-4.el5
  perl-Params-Validate.i386 0:0.95-1.el5.rf
 
Complete!



インストールされた内容を確認する




# rpm -ql mha4mysql-manager
/usr/bin/masterha_check_repl
/usr/bin/masterha_check_ssh
/usr/bin/masterha_check_status
/usr/bin/masterha_conf_host
/usr/bin/masterha_manager
/usr/bin/masterha_master_monitor
/usr/bin/masterha_master_switch
/usr/bin/masterha_secondary_check
/usr/bin/masterha_stop
/usr/lib/perl5/vendor_perl/MHA/Config.pm
/usr/lib/perl5/vendor_perl/MHA/DBHelper.pm
/usr/lib/perl5/vendor_perl/MHA/FileStatus.pm
/usr/lib/perl5/vendor_perl/MHA/HealthCheck.pm
/usr/lib/perl5/vendor_perl/MHA/ManagerAdmin.pm
/usr/lib/perl5/vendor_perl/MHA/ManagerAdminWrapper.pm
/usr/lib/perl5/vendor_perl/MHA/ManagerConst.pm
/usr/lib/perl5/vendor_perl/MHA/ManagerUtil.pm
/usr/lib/perl5/vendor_perl/MHA/MasterFailover.pm
/usr/lib/perl5/vendor_perl/MHA/MasterMonitor.pm
/usr/lib/perl5/vendor_perl/MHA/MasterRotate.pm
/usr/lib/perl5/vendor_perl/MHA/SSHCheck.pm
/usr/lib/perl5/vendor_perl/MHA/Server.pm
/usr/lib/perl5/vendor_perl/MHA/ServerManager.pm
/usr/share/man/man1/masterha_check_repl.1.gz
/usr/share/man/man1/masterha_check_ssh.1.gz
/usr/share/man/man1/masterha_check_status.1.gz
/usr/share/man/man1/masterha_conf_host.1.gz
/usr/share/man/man1/masterha_manager.1.gz
/usr/share/man/man1/masterha_master_monitor.1.gz
/usr/share/man/man1/masterha_master_switch.1.gz
/usr/share/man/man1/masterha_secondary_check.1.gz
/usr/share/man/man1/masterha_stop.1.gz




■手順4)mha-managerの作業用ディレクトリを作成する。

mha-managerは動作用のディレクトリが必要なので全てのMySQLサーバーと
mha-managerと、各MySQLサーバーで作業用のディレクトリを作る。




#ディレクトリの作成
# mkdir -p /tmp/mha/log
 
#権限を与える
# chmod 777 -R /tmp/mha
 
#確認する
# ls -alt  /tmp/mha/





■手順5)仮想IPを利用してmasterを切り替えるためように、master_ip_failoverのスクリプトを利用する

MySQL-MHAでは、仮想IPの切り替えまで自動で行ってくれるわけではないので、
その部分は自身で実装する必要がある。
※keepalivedやheartbeatなどを使って、仮想IPを切り替える手段を使えばこのスクリプトは要らないかも?

ただし、仮想IPの変更用のサンプルスクリプトがあるので、
それを利用すれば簡単に出来る!?(; ・`д・´) ナ、ナンダッテー!!

mha-managerは便利なことに、フェイルオーバー時に何度か任意のスクリプトを実行することが出来るように作られています!ъ(゚Д゚)グッジョブ!!

それを利用して、仮想IPを切り替えたり、任意の処理を行う事が可能になっています。
たとえば、master_ip_failover_scriptの設定を行うと、
次のタイミングでそれぞれプログラムが起動するようになります。

プログラムが実行されるタイミングは3度あるそうで、次のタイミングで実行されるようです。

・1回目(フェーズのチェック)
初めてマスターモニター(スクリプトの妥当性検査のために)入る前

・2回目(現在のマスタのシャットダウン・フェーズ)
ちょうどshutdown_scriptを呼び出す前に

・3回目(マスター・アクティベーション・フェーズ)
新しいマスターにすべてのリレーログを適用した後です。
新しいマスター・アクティベーション・フェーズでは、新しいマスターで仮想IPを割り当てることができます。

master_ip_failover_scriptのサンプルは公式に置かれていますので、
そこからダウンロードしてきて、各環境に合わせて処理を追加していきます(σ・∀・)σゲッツ!!

こちらからmaster_ip_failoverをダウンロードしてくる。
※/mha4mysql-manager/samples/scripts/master_ip_failover


各自のサーバーにあわせて編集する。主に追加する部分は仮想IPの切り替えの処理になります。
perlで書かれているので久々のperlで、なんだかオラ、わくわくしてきたぞって思っていたら、
こちらの方が殆どやってくれていたので、そのまま利用させてもらいました!ありが( ・ω・) ㌧
MySQLレプリケーションをMHAとHAProxyでフェイルオーバさせてみた
ファイルは/usr/bin直下に新規作成します。




vi /usr/bin/master_ip_failover
#!/usr/bin/env perl
 
#  Copyright (C) 2011 DeNA Co.,Ltd.
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software
#  Foundation, Inc.,
#  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
## Note: This is a sample script and is not complete. Modify the script based on your environment.
 
use strict;
use warnings FATAL => 'all';
 
use Getopt::Long;
use MHA::DBHelper;
 
my (
  $command,        $ssh_user,         $orig_master_host,
  $orig_master_ip, $orig_master_port, $new_master_host,
  $new_master_ip,  $new_master_port,  $new_master_user,
  $new_master_password,
  #変数の追加(mha.cnfの追加オプション用)
  $virtual_ip,       $orig_master_vip_eth, $new_master_vip_eth
);
 
#GetOptions 関数
#コマンドラインオプションを処理する
GetOptions(
  'command=s'             => \$command,
  'ssh_user=s'            => \$ssh_user,
  'orig_master_host=s'    => \$orig_master_host,
  'orig_master_ip=s'      => \$orig_master_ip,
  'orig_master_port=i'    => \$orig_master_port,
  'new_master_host=s'     => \$new_master_host,
  'new_master_ip=s'       => \$new_master_ip,
  'new_master_port=i'     => \$new_master_port,
  'new_master_user=s'     => \$new_master_user,
  'new_master_password=s' => \$new_master_password,
  #追加した変数への値代入
  #仮想IP
  'virtual_ip=s'       => \$virtual_ip,
  #masterの仮想IP用のネットワークインターフェイス名
  'orig_master_vip_eth=s'  => \$orig_master_vip_eth,
  #新masterの仮想IP用のネットワークインターフェイス名
  'new_master_vip_eth=s'   => \$new_master_vip_eth
);
 
#main実行
exit &main();
 
sub main {
 
  # Print out parameters
  print("DEBUG PARAMETERS***********\n");
  if ( defined $command ) {print("command => $command\n")};
  if ( defined $ssh_user ) {print("ssh_user=s => $ssh_user\n")};
  if ( defined $orig_master_host ) {print("orig_master_host => $orig_master_host\n")};
  if ( defined $orig_master_ip ) {print("orig_master_ip => $orig_master_ip\n")};
  if ( defined $orig_master_port ) {print("orig_master_port => $orig_master_port\n")};
  if ( defined $new_master_host ) {print("new_master_host => $new_master_host\n")};
  if ( defined $new_master_ip ) {print("new_master_ip => $new_master_ip\n")};
  if ( defined $new_master_port ) {print("new_master_port => $new_master_port\n")};
  if ( defined $virtual_ip ) {print("virtual_ip => $virtual_ip\n")};
  if ( defined $orig_master_vip_eth ) {print("orig_master_vip_eth => $orig_master_vip_eth\n")};
  if ( defined $new_master_vip_eth ) {print("new_master_vip_eth => $new_master_vip_eth\n")};
 
  #コマンドのオプションがstop or stopsshだったら
  if ( $command eq "stop" || $command eq "stopssh" ) {
 
    # $orig_master_host, $orig_master_ip, $orig_master_port are passed.
    # If you manage master ip address at global catalog database,
    # invalidate orig_master_ip here.
    my $exit_code = 1;
    eval {
 
      # updating global catalog, etc
      #障害の発生したマスタに付加されている仮想IPを剥奪、もし接続できない場合はタイムアウトまで待つ
      `ssh $orig_master_host -o "ConnectTimeout=5" '/sbin/ifconfig $orig_master_vip_eth down'`;
 
      $exit_code = 0;
    };
    if ($@) {
      warn "Got Error: $@\n";
      exit $exit_code;
    }
    exit $exit_code;
  }
  elsif ( $command eq "start" ) {
    #コマンドのオプションがstarだったら
 
    # all arguments are passed.
    # If you manage master ip address at global catalog database,
    # activate new_master_ip here.
    # You can also grant write access (create user, set read_only=0, etc) here.
    my $exit_code = 10;
    eval {
 
      #新masterへ処理
      my $new_master_handler = new MHA::DBHelper();
 
      #データベースのコネクションを取得する
      # args: hostname, port, user, password, raise_error_or_not
      $new_master_handler->connect( $new_master_ip, $new_master_port,
      $new_master_user, $new_master_password, 1 );
 
      ## Set read_only=0 on the new master
      #バイナリーログ出力を無効化
      $new_master_handler->disable_log_bin_local();
 
      #read_only=0を設定する。
      print "Set read_only=0 on the new master.\n";
      $new_master_handler->disable_read_only();
 
      #新masterのデータベースに対して何か行いたい場合にはここに記述する。
      ## 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
      #ここから拡張したい処理を記述する
 
      #仮想IPを割り振るNICの情報を取得
      my $real_eth=$new_master_vip_eth;
      $real_eth=~ s/:.*//g;
      my $new_master_network= `ssh $new_master_host '/sbin/ifconfig $real_eth'`;
      #ネットマスクの取得
      my $vip_netmask = join(".", $new_master_network =~ /Mask\:(\d+)\.(\d+)\.(\d+)\.(\d+)/ );
      #ブロードキャストアドレスの取得
      my $vip_broadcast = join(".", $new_master_network =~ /Bcast\:(\d+)\.(\d+)\.(\d+)\.(\d+)/ );
      #フェイルオーバ先に仮想IPを割り振る、そのとき仮想IPの切り替わりのためpingを発行する
      `ssh $new_master_host -o "ConnectTimeout=15" '/sbin/ifconfig $new_master_vip_eth $virtual_ip netmask $vip_netmask up; ping -I $virtual_ip -b $vip_broadcast -c 3 -c 3 -i 0.01 -q -W 10 > /dev/null'`;
 
      $exit_code = 0;
    };
    if ($@) {
      warn $@;
 
      # If you want to continue failover, exit 10.
      exit $exit_code;
    }
    exit $exit_code;
  }
  elsif ( $command eq "status" ) {
 
    # do nothing
    exit 0;
  }
  else {
    &usage();
    exit 1;
  }
}
 
sub usage {
  #仮想IPフェイルオーバのための入力も促す
  print
   "Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port --virtual_ip=ip --orig_master_vip_eth=eth --new_master_vip_eth=eth\n";
####
#  print
#"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}



実行権限を与える



chmod 755 /usr/bin/master_ip_failover




今回は、仮想IPをスクリプトで切り替えているため、
ifconfigが実行できる権限があるユーザーである必要があります。

そのため、rootユーザーなどが利用できず、sudoなどで行いたい場合には、
監視対象の各サーバーでその設定が必要となります。
またsudoの設定で、次のようなエラーが発生する場合には、 次の設定が必要となります。



sudo: sorry, you must have a tty to run sudo





次の「Defaults requiretty」をコメントアウトする。


sudo visudo
     53 # Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
     54 #         You have to run "ssh -t hostname sudo <cmd>".
     55 #
     56 Defaults    requiretty



■手順6)設定ファイルの編集

デフォルトで共通設定用の/etc/masterha_default.cnfの設定ファイルを読みにいくみたいなので、
その位置に空のファイルを作ってあげます。



#新規作成
touch /etc/masterha_default.cnf
 
#確認
# ls -alt /etc/masterha_default.cnf
-rw-r--r-- 1 root root 0  2月 12 04:45 /etc/masterha_default.cnf




今度は、各レプリケーション環境用の設定ファイルを作成します。
ここに設定項目を書いていきます。






# vi /etc/mha.cnf
[server default]
#監視対象サーバのmysqlのパスワード
#各サーバーで接続情報が違う場合には[server_XXX]セクションで定義しなおすこと。
#既存のユーザーとは別にmha用にアカウントを指定したい場合には、各サーバーで作成してあげること。(SELECT権限などの必要あり)
#GRANT ALL ON *.* TO 'mha'@'192.168.0.%' IDENTIFIED BY 'パスワード'などで各監視対象のmysqlサーバーでアカウントを作る。
user=mha
password=mhaユーザーのパスワード
 
#レプリケーションユーザーの接続情報
#orig_master_is_new_slaveオプションをつけた場合に必要になる。
#各サーバーで接続情報が違う場合には[server_XXX]セクションで定義しなおすこと。
repl_user=repl
repl_password=replユーザーのパスワード
 
#作業用ディレクトリの指定
manager_workdir=/tmp/mha
#ログファイルディレクトリの指定
manager_log=/tmp/mha/log/mha.log
 
#リモート先用の作業用ディレクトリ
remote_workdir=/tmp/mha
 
#ログレベル
log_level=info
 
#SSHの鍵認証に設定しているユーザー名
ssh_user=root
 
#仮想IPのフェイルオーバ用のスクリプト
#--virtual_ip
# 仮想IPアドレス
#--orig_master_vip_eth
# 仮想IPアドレスを設定しているmasterのネットワークインターフェイス名
#--new_master_vip_eth
# 新masterに適用する仮想IPアドレスのネットワークインターフェイス名
#
master_ip_failover_script=/usr/bin/master_ip_failover --virtual_ip=192.168.10.234 --orig_master_vip_eth=eth0:234 --new_master_vip_eth=eth0:234
 
##################
#
# 監視対象サーバー
# hostname
# ホスト名
# candidate_master
# 優先的にmasterに変更するサーバーか
# 0:優先的なサーバーとしない(デフォルト)
# 1:優先的に新しいmaster候補とする。ただし、バイナリーログが有効になっていること。slaveの遅延が発生していないなどの、
#   条件を満たしている限り、新しいmasterに優先される。
# ※複数個のサーバーに1が設定されている場合には、[serever_XXX]セクションのXXXの値が小さい方が優先される。
# ignore_fail
# スレーブサーバのいずれかに障害が発生した場合、フェイルオーバーを行うか。
# 0:指定されたslaveサーバーで障害が発生し他場合には、フェイルオーバーを行わない。(デフォルト)
# 1:指定されたslaveサーバーで障害が発生しても、フェイルオーバーを行う。
# no_master
# マスターの対象にするか
#       0:対象にする(デフォルト)
#       1:対象にしない
# master_binlog_dir
# バイナリーログのディレクトリの場所の指定
#       master_binlog_dir=/var/lib/mysql(デフォルト)
#
##################
[server1]
hostname=192.168.10.228
 
[server2]
hostname=192.168.10.229
 
[server3]
hostname=192.168.10.233




■手順7)mha-managerサーバーから各サーバーへのSSH接続用の公開鍵を作成する

mha-managerとmha-nodeの通信は公開鍵認証のSSHを利用するため、
mha-managerサーバーで公開鍵を作成します。
※SSHユーザーの接続情報の設定は設定ファイルで行える。

mha-managerサーバーで公開鍵の作成




ssh-keygen -f /root/.ssh/id_rsa -q -N ""


各サーバーの/root/.ssh/authorized_keysに公開鍵(/root/.ssh/id_rsa)を追記する。
master(192.168.10.228)に公開鍵を追加する。(mha-manager > mater)



cat /root/.ssh/id_rsa.pub | ssh 192.168.10.228 "cat >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys"




次のようなエラーが出る場合には、対象のサーバーで一度別のサーバーへSSH接続を実行すると、
自動で/root/.sshのディレクトリが作成されるので、実行するか、手動でディレクトリを作成すること。
手動で作成する場合にはディレクトリの権限を「700」にしておく必要がある。中のファイルは600にする。

もし「777」などにしてしまうと、鍵を使ったログインが正しく行われない可能性がある。
※bash: /root/.ssh/authorized_keys: そのようなファイルやディレクトリはありません

接続できるか確認(mha-manager > mater)



# ssh 192.168.10.228
Last login: Fri Feb  8 03:53:19 2013 from 192.168.10.28
# exit
logout




・slave1(192.168.10.229)に公開鍵を追加する。(mha-manager > slave1)




cat /root/.ssh/id_rsa.pub | ssh 192.168.10.229 "cat >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys"



接続できるか確認(mha-manager > slave1)



# ssh 192.168.10.229
Last login: Fri Feb  8 11:48:51 2013



slave2(192.168.10.233)に公開鍵を追加する。(mha-manager > slave2)




cat /root/.ssh/id_rsa.pub | ssh 192.168.10.233 "cat >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys"




接続できるか確認(mha-manager > slave2)



# ssh 192.168.10.233
Last login: Sat Feb  9 03:35:27 2013 from 192.168.10.227



mha-managerサーバーの/root/.ssh/known_hostsに各MySQLサーバの内容を記述するために 以下のコマンドをmha-managerサーバーで実行する



ssh-keyscan 192.168.10.228 192.168.10.229 192.168.10.233 >> /root/.ssh/known_hosts




mha-managerサーバーから各サーバーにSSHで接続できれば良いのかと思ったら、
各サーバー間でも接続が必要なようなので、
全サーバーで鍵を使ってログインできるようにしておく。
※起動時にSSH接続ができません!!( ‘д‘⊂彡☆))Д´) パーン的なメッセージが出ていました。

■手順8)master(192.168.10.228)から各サーバーへのSSH接続用の公開鍵を作成する
master(192.168.10.228)サーバーで公開鍵の作成



ssh-keygen -f /root/.ssh/id_rsa -q -N ""



・slave1(192.168.10.228)からmaster(192.168.10.227)


cat /root/.ssh/id_rsa.pub | ssh 192.168.10.227 "cat >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys"



・slave2(192.168.10.228)からmaster(192.168.10.229)

cat /root/.ssh/id_rsa.pub | ssh 192.168.10.229 "cat >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys"



・slave2(192.168.10.228)からmaster(192.168.10.233)

cat /root/.ssh/id_rsa.pub | ssh 192.168.10.233 "cat >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys"



■手順9)slave1(192.168.10.229)のSSH接続用の公開鍵を各サーバーへ追加する
slave1(192.168.10.229)サーバーで公開鍵の作成



ssh-keygen -f /root/.ssh/id_rsa -q -N ""



・slave2(192.168.10.229)からmaster(192.168.10.227)



cat /root/.ssh/id_rsa.pub | ssh 192.168.10.227 "cat >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys"


・slave2(192.168.10.229)からmaster(192.168.10.228)


cat /root/.ssh/id_rsa.pub | ssh 192.168.10.228 "cat >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys"



・slave2(192.168.10.229)からmaster(192.168.10.233)




cat /root/.ssh/id_rsa.pub | ssh 192.168.10.233 "cat >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys"


■手順10)slave2(192.168.10.233)のSSH接続用の公開鍵を各サーバーへ追加する
slave2(192.168.10.233)サーバーで公開鍵の作成



ssh-keygen -f /root/.ssh/id_rsa -q -N ""



・slave2(192.168.10.233)からmaster(192.168.10.227)




cat /root/.ssh/id_rsa.pub | ssh 192.168.10.227 "cat >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys"


・slave2(192.168.10.233)からmaster(192.168.10.228)



cat /root/.ssh/id_rsa.pub | ssh 192.168.10.228 "cat >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys"


・slave2(192.168.10.233)からmaster(192.168.10.229)



cat /root/.ssh/id_rsa.pub | ssh 192.168.10.229 "cat >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys"




■手順11)サーバー間でSSHが行えるかチェックする
mha-managerのコマンドとして、masterha_check_sshが用意されています。
こちらを利用すると、SSHの設定が正しく行われているか確認することが出来ます。




# masterha_check_ssh --conf=/etc/mha.cnf
Fri Feb 15 10:09:38 2013 - [info] Reading default configuratoins from /etc/masterha_default.cnf..
Fri Feb 15 10:09:38 2013 - [info] Reading application default configurations from /etc/mha.cnf..
Fri Feb 15 10:09:38 2013 - [info] Reading server configurations from /etc/mha.cnf..
Fri Feb 15 10:09:38 2013 - [info] Starting SSH connection tests..
Fri Feb 15 10:09:41 2013 - [debug]
Fri Feb 15 10:09:38 2013 - [debug]  Connecting via SSH from root@192.168.10.229(192.168.10.229:22) to root@192.168.10.228(192.168.10.228:22)..
Fri Feb 15 10:09:40 2013 - [debug]   ok.
Fri Feb 15 10:09:40 2013 - [debug]  Connecting via SSH from root@192.168.10.229(192.168.10.229:22) to root@192.168.10.233(192.168.10.233:22)..
Fri Feb 15 10:09:41 2013 - [debug]   ok.
Fri Feb 15 10:09:42 2013 - [debug]
Fri Feb 15 10:09:38 2013 - [debug]  Connecting via SSH from root@192.168.10.228(192.168.10.228:22) to root@192.168.10.229(192.168.10.229:22)..
Fri Feb 15 10:09:40 2013 - [debug]   ok.
Fri Feb 15 10:09:40 2013 - [debug]  Connecting via SSH from root@192.168.10.228(192.168.10.228:22) to root@192.168.10.233(192.168.10.233:22)..
Fri Feb 15 10:09:42 2013 - [debug]   ok.
Fri Feb 15 10:09:42 2013 - [debug]
Fri Feb 15 10:09:39 2013 - [debug]  Connecting via SSH from root@192.168.10.233(192.168.10.233:22) to root@192.168.10.228(192.168.10.228:22)..
Fri Feb 15 10:09:40 2013 - [debug]   ok.
Fri Feb 15 10:09:40 2013 - [debug]  Connecting via SSH from root@192.168.10.233(192.168.10.233:22) to root@192.168.10.229(192.168.10.229:22)..
Fri Feb 15 10:09:42 2013 - [debug]   ok.
Fri Feb 15 10:09:42 2013 - [info] All SSH connection tests passed successfully.



「 All SSH connection tests passed successfully.」が表示されれば問題ないということらしいです。
ここまでで、mha-managerサーバーの設定が完了になります(`・ω・´)シャキーン
次に、各サーバーの設定を行っていきたいと思います!

■手順12)master(192.168.10.228)に仮想IPの設定

masterに仮想IPを設定しておき、
masterが落ちた際には、新しいmasterに同じ仮想IPを設定することで、
アプリケーション側は仮想IP経由で接続を行っていれば修正の必要がなくなります。

現在のネットワークインターフェイスの設定を確認する



# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:16:3E:48:5F:B8
          inet addr:192.168.10.233  Bcast:192.168.10.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:137984 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2029 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:40625034 (38.7 MiB)  TX bytes:195783 (191.1 KiB)
 
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:560 (560.0 b)  TX bytes:560 (560.0 b)
 
lo:0      Link encap:Local Loopback
          inet addr:192.168.10.223  Mask:255.255.255.255
          UP LOOPBACK RUNNING  MTU:16436  Metric:1




仮想IPの192.168.10.234を設定する。
これで192.168.10.234に接続するとmasterに繋がるようになります。




# /sbin/ifconfig eth0:234 192.168.10.234 netmask 255.255.255.0 up



応答の確認を行う




#-I インターフェイス/IPアドレス 
#-b ブロードキャスト・アドレスへのecho要求パケットの送信を許可する。
#-c 試行回数 
#-i 間隔時間 
#-q 途中経過を表示しない 
#-w タイムアウト時間を指定する。単位はミリ秒
ping -I 192.168.10.234 -b 192.168.10.255 -c 3 -i 0.01 -q -W 0.1 -w 1 > /dev/null



ネットワークインターフェイスにeth0:234が追加されている事を確認する。


# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:16:3E:48:5F:B8
          inet addr:192.168.10.233  Bcast:192.168.10.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:138552 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2375 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:40751809 (38.8 MiB)  TX bytes:239131 (233.5 KiB)
 
eth0:234  Link encap:Ethernet  HWaddr 00:16:3E:48:5F:B8
          inet addr:192.168.10.234  Bcast:192.168.10.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
 
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:896 (896.0 b)  TX bytes:896 (896.0 b)
 
lo:0      Link encap:Local Loopback
          inet addr:192.168.10.223  Mask:255.255.255.255
          UP LOOPBACK RUNNING  MTU:16436  Metric:1




※停止する場合には「/sbin/ifconfig eth0:234 down」を実行する

■手順13)監視対象の各MySQL側の設定

各MySQLサーバー(master,slave1,slave2)で次の手順を行っておきます。
・mha4mysql-nodeのインストール
・作業用のディレクトリの作成

mha-nodeのダウンロード



#CentOS 6用
# wget https://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.54-0.el6.noarch.rpm
  
#CentOS 5用
# wget https://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.54-1.el5.noarch.rpm



インストール



#CentOS 6用
# yum localinstall --nogpgcheck mha4mysql-node-0.54-0.el6.noarch.rpm
 
#CentOS 5用
# yum localinstall --nogpgcheck mha4mysql-node-0.54-1.el5.noarch.rpm
Loaded plugins: fastestmirror, priorities, security
Setting up Local Package Process
Examining mha4mysql-node-0.54-1.el5.noarch.rpm: mha4mysql-node-0.54-1.el5.noarch
Marking mha4mysql-node-0.54-1.el5.noarch.rpm to be installed
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * elrepo: elrepo.org
 * epel: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * rpmforge: ftp.riken.jp
 * updates: ftp.tsukuba.wide.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package mha4mysql-node.noarch 0:0.54-1.el5 set to be updated
--> Finished Dependency Resolution
 
Dependencies Resolved
 
==============================================================================================================================================================================================
 Package                                     Arch                                Version                                 Repository                                                      Size
==============================================================================================================================================================================================
Installing:
 mha4mysql-node                              noarch                              0.54-1.el5                              /mha4mysql-node-0.54-1.el5.noarch                               98 k
 
Transaction Summary
==============================================================================================================================================================================================
Install       1 Package(s)
Upgrade       0 Package(s)
 
Total size: 98 k
Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : mha4mysql-node                                                                                                                                                         1/1
 
Installed:
  mha4mysql-node.noarch 0:0.54-1.el5
 
Complete!




■手順14)作業ディレクトリの作成





# mkdir -p /tmp/mha/
 
# chmod 777 -R /tmp/mha
 
# ls -alt  /tmp/mha/





■手順15)mha用の接続アカウントの作成。
手順6の設定ファイルの編集で、mhaがMySQLに接続する際に、
既存のアカウントとは別に専用のアカウントを指定した場合にはアカウントを作成しておく。





#mhaアカウントの作成
GRANT ALL ON *.* TO 'mha'@'192.168.0.%' IDENTIFIED BY 'パスワード';



権限は、何が必要だろう・・・とりあえず全部権限をあげしまいました:(;゙゚’ω゚’):
※各MySQLサーバーで手順13、14、15を行っておくこと!!チェックΣ(-◎∀◎-)d/

■手順16)レプリケーションのチェックを行う。

mha-managerのコマンドとして、masterha_check_replも用意されています。
masterha_check_replコマンドはレプリケーションの次の状態をチェックし、
異常がある場合にはエラーを返してくれます。

監視サーバー全てに次の設定を行っていること。 ・mha4mysql-nodeのインストール(手順13) ・作業ディレクトリの作成(手順14)
・masterha_check_sshと同じでサーバー間でSSHが正常に疎通できるか。
・すべてのslaveでI/O threads が起動しているか。
・すべてのslaveでSQL threads が起動しているか。
・レプリケーションの遅延が30秒以上かかっているか(デフォルト30秒)
・2つ以上のmasterがある場合に、複製フィルタリングルールが異なっているいるか。

コマンドのオプション

–seconds_behind_master=100
遅延のチェック時間を100秒に変更する
–skip_check_ssh
SSHの接続チャックは行わない。

レプリケーションをチェックしてみる。


masterha_check_repl --conf=/etc/mha.cnf
Fri Feb 15 10:12:41 2013 - [info] Reading default configuratoins from /etc/masterha_default.cnf..
Fri Feb 15 10:12:41 2013 - [info] Reading application default configurations from /etc/mha.cnf..
Fri Feb 15 10:12:41 2013 - [info] Reading server configurations from /etc/mha.cnf..
Fri Feb 15 10:12:41 2013 - [info] MHA::MasterMonitor version 0.55.
Fri Feb 15 10:12:42 2013 - [info] Dead Servers:
Fri Feb 15 10:12:42 2013 - [info] Alive Servers:
Fri Feb 15 10:12:42 2013 - [info]   192.168.10.228(192.168.10.228:3306)
Fri Feb 15 10:12:42 2013 - [info]   192.168.10.229(192.168.10.229:3306)
Fri Feb 15 10:12:42 2013 - [info]   192.168.10.233(192.168.10.233:3306)
Fri Feb 15 10:12:42 2013 - [info] Alive Slaves:
Fri Feb 15 10:12:42 2013 - [info]   192.168.10.229(192.168.10.229:3306)  Version=5.5.29-log (oldest major version between slaves) log-bin:enabled
Fri Feb 15 10:12:42 2013 - [info]     Replicating from 192.168.10.228(192.168.10.228:3306)
Fri Feb 15 10:12:42 2013 - [info]   192.168.10.233(192.168.10.233:3306)  Version=5.5.29-log (oldest major version between slaves) log-bin:enabled
Fri Feb 15 10:12:42 2013 - [info]     Replicating from 192.168.10.228(192.168.10.228:3306)
Fri Feb 15 10:12:42 2013 - [info] Current Alive Master: 192.168.10.228(192.168.10.228:3306)
Fri Feb 15 10:12:42 2013 - [info] Checking slave configurations..
Fri Feb 15 10:12:42 2013 - [warning]  relay_log_purge=0 is not set on slave 192.168.10.229(192.168.10.229:3306).
Fri Feb 15 10:12:42 2013 - [warning]  relay_log_purge=0 is not set on slave 192.168.10.233(192.168.10.233:3306).
Fri Feb 15 10:12:42 2013 - [info] Checking replication filtering settings..
Fri Feb 15 10:12:42 2013 - [info]  binlog_do_db= , binlog_ignore_db=
Fri Feb 15 10:12:42 2013 - [info]  Replication filtering check ok.
Fri Feb 15 10:12:42 2013 - [info] Starting SSH connection tests..
Fri Feb 15 10:12:46 2013 - [info] All SSH connection tests passed successfully.
Fri Feb 15 10:12:46 2013 - [info] Checking MHA Node version..
Fri Feb 15 10:12:47 2013 - [info]  Version check ok.
Fri Feb 15 10:12:47 2013 - [info] Checking SSH publickey authentication settings on the current master..
Fri Feb 15 10:12:48 2013 - [info] HealthCheck: SSH to 192.168.10.228 is reachable.
Fri Feb 15 10:12:48 2013 - [info] Master MHA Node version is 0.54.
Fri Feb 15 10:12:48 2013 - [info] Checking recovery script configurations on the current master..
Fri Feb 15 10:12:48 2013 - [info]   Executing command: save_binary_logs --command=test --start_pos=4 --binlog_dir=/var/lib/mysql,/var/log/mysql --output_file=/tmp/mha/save_binary_logs_test --manager_version=0.55 --start_file=mysql-bin.000012
Fri Feb 15 10:12:48 2013 - [info]   Connecting to root@192.168.10.228(192.168.10.228)..
  Creating /tmp/mha if not exists..    ok.
  Checking output directory is accessible or not..
   ok.
  Binlog found at /var/lib/mysql, up to mysql-bin.000012
Fri Feb 15 10:12:49 2013 - [info] Master setting check done.
Fri Feb 15 10:12:49 2013 - [info] Checking SSH publickey authentication and checking recovery script configurations on all alive slave servers..
Fri Feb 15 10:12:49 2013 - [info]   Executing command : apply_diff_relay_logs --command=test --slave_user='repl' --slave_host=192.168.10.229 --slave_ip=192.168.10.229 --slave_port=3306 --workdir=/tmp/mha --target_version=5.5.29-log --manager_version=0.55 --relay_log_info=/var/lib/mysql/relay-log.info  --relay_dir=/var/lib/mysql/  --slave_pass=xxx
Fri Feb 15 10:12:49 2013 - [info]   Connecting to root@192.168.10.229(192.168.10.229:22)..
  Checking slave recovery environment settings..
    Opening /var/lib/mysql/relay-log.info ... ok.
    Relay log found at /var/lib/mysql, up to mysql-relay-bin.000002
    Temporary relay log file is /var/lib/mysql/mysql-relay-bin.000002
    Testing mysql connection and privileges.. done.
    Testing mysqlbinlog output.. done.
    Cleaning up test file(s).. done.
Fri Feb 15 10:12:50 2013 - [info]   Executing command : apply_diff_relay_logs --command=test --slave_user='repl' --slave_host=192.168.10.233 --slave_ip=192.168.10.233 --slave_port=3306 --workdir=/tmp/mha --target_version=5.5.29-log --manager_version=0.55 --relay_log_info=/var/lib/mysql/relay-log.info  --relay_dir=/var/lib/mysql/  --slave_pass=xxx
Fri Feb 15 10:12:50 2013 - [info]   Connecting to root@192.168.10.233(192.168.10.233:22)..
  Checking slave recovery environment settings..
    Opening /var/lib/mysql/relay-log.info ... ok.
    Relay log found at /var/lib/mysql, up to mysql-relay-bin.000002
    Temporary relay log file is /var/lib/mysql/mysql-relay-bin.000002
    Testing mysql connection and privileges.. done.
    Testing mysqlbinlog output.. done.
    Cleaning up test file(s).. done.
Fri Feb 15 10:12:51 2013 - [info] Slaves settings check done.
Fri Feb 15 10:12:51 2013 - [info]
192.168.10.228 (current master)
 +--192.168.10.229
 +--192.168.10.233
 
Fri Feb 15 10:12:51 2013 - [info] Checking replication health on 192.168.10.229..
Fri Feb 15 10:12:51 2013 - [info]  ok.
Fri Feb 15 10:12:51 2013 - [info] Checking replication health on 192.168.10.233..
Fri Feb 15 10:12:51 2013 - [info]  ok.
Fri Feb 15 10:12:51 2013 - [info] Checking master_ip_failover_script status:
Fri Feb 15 10:12:51 2013 - [info]   /usr/bin/master_ip_failover --virtual_ip=192.168.10.234 --orig_master_vip_eth=eth0:234 --new_master_vip_eth=eth0:234 --command=status --ssh_user=root --orig_master_host=192.168.10.228 --orig_master_ip=192.168.10.228 --orig_master_port=3306
DEBUG PARAMETERS***********
command => status
ssh_user=s => root
orig_master_host => 192.168.10.228
orig_master_ip => 192.168.10.228
orig_master_port => 3306
virtual_ip => 192.168.10.234
orig_master_vip_eth => eth0:234
new_master_vip_eth => eth0:234
Fri Feb 15 10:12:51 2013 - [info]  OK.
Fri Feb 15 10:12:51 2013 - [warning] shutdown_script is not defined.
Fri Feb 15 10:12:51 2013 - [info] Got exit code 0 (Not master dead).
 
MySQL Replication Health is OK.



ここまででエラーがなければ問題ナシです!( ´∀`)bグッ!

■手順17)mha-managerの起動
mha-manager(192.168.10.227)サーバーで実際に起動してみる。(フォアグランドで起動される)
※–confに作成した設定ファイルの記述を忘れずに!



# masterha_manager --conf=/etc/mha.cnf
Sat Feb  9 06:26:27 2013 - [info] MHA::MasterMonitor version 0.55.
Sat Feb  9 06:26:27 2013 - [info] Dead Servers:
Sat Feb  9 06:26:27 2013 - [info] Alive Servers:
Sat Feb  9 06:26:27 2013 - [info]   192.168.10.228(192.168.10.228:3306)
Sat Feb  9 06:26:27 2013 - [info]   192.168.10.229(192.168.10.229:3306)
Sat Feb  9 06:26:27 2013 - [info]   192.168.10.233(192.168.10.233:3306)
Sat Feb  9 06:26:27 2013 - [info] Alive Slaves:
Sat Feb  9 06:26:27 2013 - [info]   192.168.10.229(192.168.10.229:3306)  Version=5.5.29-log (oldest major version between slaves) log-bin:enabled
Sat Feb  9 06:26:27 2013 - [info]     Replicating from 192.168.10.228(192.168.10.228:3306)
Sat Feb  9 06:26:27 2013 - [info]     Primary candidate for the new Master (candidate_master is set)
Sat Feb  9 06:26:27 2013 - [info]   192.168.10.233(192.168.10.233:3306)  Version=5.5.29-log (oldest major version between slaves) log-bin:enabled
Sat Feb  9 06:26:27 2013 - [info]     Replicating from 192.168.10.228(192.168.10.228:3306)
Sat Feb  9 06:26:27 2013 - [info]     Primary candidate for the new Master (candidate_master is set)
Sat Feb  9 06:26:27 2013 - [info] Current Alive Master: 192.168.10.228(192.168.10.228:3306)
Sat Feb  9 06:26:27 2013 - [info] Checking slave configurations..
Sat Feb  9 06:26:27 2013 - [warning]  relay_log_purge=0 is not set on slave 192.168.10.229(192.168.10.229:3306).
Sat Feb  9 06:26:27 2013 - [warning]  relay_log_purge=0 is not set on slave 192.168.10.233(192.168.10.233:3306).
Sat Feb  9 06:26:27 2013 - [info] Checking replication filtering settings..
Sat Feb  9 06:26:27 2013 - [info]  binlog_do_db= , binlog_ignore_db=
Sat Feb  9 06:26:27 2013 - [info]  Replication filtering check ok.
Sat Feb  9 06:26:27 2013 - [info] Starting SSH connection tests..
Sat Feb  9 06:26:32 2013 - [info] All SSH connection tests passed successfully.
Sat Feb  9 06:26:32 2013 - [info] Checking MHA Node version..
Sat Feb  9 06:26:33 2013 - [info]  Version check ok.
Sat Feb  9 06:26:33 2013 - [info] Checking SSH publickey authentication settings on the current master..
Sat Feb  9 06:26:34 2013 - [info] HealthCheck: SSH to 192.168.10.228 is reachable.
Sat Feb  9 06:26:34 2013 - [info] Master MHA Node version is 0.54.
Sat Feb  9 06:26:34 2013 - [info] Checking recovery script configurations on the current master..
Sat Feb  9 06:26:34 2013 - [info]   Executing command: save_binary_logs --command=test --start_pos=4 --binlog_dir=/var/lib/mysql,/var/log/mysql --output_file=/tmp/mha/save_binary_logs_test --manager_version=0.55 --start_file=mysql-bin.000011
Sat Feb  9 06:26:34 2013 - [info]   Connecting to root@192.168.10.228(192.168.10.228)..
  Creating /tmp/mha if not exists..    ok.
  Checking output directory is accessible or not..
   ok.
  Binlog found at /var/lib/mysql, up to mysql-bin.000011
Sat Feb  9 06:26:35 2013 - [info] Master setting check done.
Sat Feb  9 06:26:35 2013 - [info] Checking SSH publickey authentication and checking recovery script configurations on all alive slave servers..
Sat Feb  9 06:26:35 2013 - [info]   Executing command : apply_diff_relay_logs --command=test --slave_user='repl' --slave_host=192.168.10.229 --slave_ip=192.168.10.229 --slave_port=3306 --workdir=/tmp/mha --target_version=5.5.29-log --manager_version=0.55 --relay_log_info=/var/lib/mysql/relay-log.info  --relay_dir=/var/lib/mysql/  --slave_pass=xxx
Sat Feb  9 06:26:35 2013 - [info]   Connecting to root@192.168.10.229(192.168.10.229:22)..
  Checking slave recovery environment settings..
    Opening /var/lib/mysql/relay-log.info ... ok.
    Relay log found at /var/lib/mysql, up to mysql-relay-bin.000003
    Temporary relay log file is /var/lib/mysql/mysql-relay-bin.000003
    Testing mysql connection and privileges.. done.
    Testing mysqlbinlog output.. done.
    Cleaning up test file(s).. done.
Sat Feb  9 06:26:36 2013 - [info]   Executing command : apply_diff_relay_logs --command=test --slave_user='repl' --slave_host=192.168.10.233 --slave_ip=192.168.10.233 --slave_port=3306 --workdir=/tmp/mha --target_version=5.5.29-log --manager_version=0.55 --relay_log_info=/var/lib/mysql/relay-log.info  --relay_dir=/var/lib/mysql/  --slave_pass=xxx
Sat Feb  9 06:26:36 2013 - [info]   Connecting to root@192.168.10.233(192.168.10.233:22)..
  Checking slave recovery environment settings..
    Opening /var/lib/mysql/relay-log.info ... ok.
    Relay log found at /var/lib/mysql, up to mysql-relay-bin.000004
    Temporary relay log file is /var/lib/mysql/mysql-relay-bin.000004
    Testing mysql connection and privileges.. done.
    Testing mysqlbinlog output.. done.
    Cleaning up test file(s).. done.
Sat Feb  9 06:26:37 2013 - [info] Slaves settings check done.
Sat Feb  9 06:26:37 2013 - [info]
192.168.10.228 (current master)
 +--192.168.10.229
 +--192.168.10.233
 
Sat Feb  9 06:26:37 2013 - [info] Checking master_ip_failover_script status:
Sat Feb  9 06:26:37 2013 - [info]   /usr/bin/master_ip_failover --virtual_ip=192.168.10.234 --orig_master_vip_eth=eth0:234 --new_master_vip_eth=eth0:234 --command=status --ssh_user=root --orig_master_host=192.168.10.228 --orig_master_ip=192.168.10.228 --orig_master_port=3306
command => status
ssh_user=s => root
orig_master_host => 192.168.10.228
orig_master_ip => 192.168.10.228
orig_master_port => 3306
virtual_ip => 192.168.10.234
orig_master_vip_eth => eth0:234
new_master_vip_eth => eth0:234
Sat Feb  9 06:26:37 2013 - [info]  OK.
Sat Feb  9 06:26:37 2013 - [warning] shutdown_script is not defined.
Sat Feb  9 06:26:37 2013 - [info] Set master ping interval 3 seconds.
Sat Feb  9 06:26:37 2013 - [warning] secondary_check_script is not defined. It is highly recommended setting it to check master reachability from two or more routes.
Sat Feb  9 06:26:37 2013 - [info] Starting ping health check on 192.168.10.228(192.168.10.228:3306)..
Sat Feb  9 06:26:38 2013 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't respond..



■手順18)起動しているか確認する
別のコンソールを立ち上げて起動状態を確認する。



# masterha_check_status --conf=/etc/mha.cnf
mha (pid:3431) is running(0:PING_OK), master:192.168.10.228


■手順19)起動を停止してみる
別のコンソールから次のコマンドを実行して停止させる。



# masterha_stop --conf=/etc/mha.cnf
Stopped mha successfully.


フォアグランドで動いていたコンソールのログには次のメッセージが表示される



Sat Feb  9 06:35:57 2013 - [info] Got terminate signal. Exit.



■手順20)バックグラウンドで起動する
masterha_managerはデフォルトでは、フォアグランドで実行されるため、
バックグラウンドで動かすには、nohupコマンドを利用する必要があるみたいです。

nohupコマンドを実行して起動したコマンドは、ハングアップシグナルを無視します。
また、バックグランドジョブとして起動(コマンドの末尾に「&」を付けます)したコマンドは、
ログアウト後も、バックグランドで実行を続けます。



#バックグランドで実行する
# nohup masterha_manager --conf=/etc/mha.cnf < /dev/null > /tmp/mha/log/manager.log 2>&1 &
[1] 3780


プロセスの確認



# ps aux|grep perl
root      3780  0.4  5.7  20064  7532 pts/2    S    06:43   0:00 perl /usr/bin/masterha_manager --conf=/etc/mha.cnf

停止してみる



# masterha_stop --conf=/etc/mha.cnf
Stopped mha successfully.
[1]+  Exit 1                  nohup masterha_manager --conf=/etc/mha.cnf < /dev/null > /tmp/mha/log/app1.log 2>&1


プロセスがなくなった事を確認



# ps aux|grep perl
root      3871  0.0  0.5   5120   776 pts/2    R+   06:45   0:00 grep perl


以上(`・ω・´)ゞビシッ!!

これで、インストールと初期設定の方は完了になります。
次回「masterha_master_switchについて(前編)」では実際にフェイルオーバーを実行させたいと思います

この記事を書いた人

nakajima
nakajima
企画開発部のエンジニアです。プログラム、サーバーもどっちも楽しくて好きですが最近はサーバーの方がメインになってる気がします。