服務器信息:
manager: 192.168.28.184
master: 172.16.2.185
node: 172.16.2.186 172.16.0.171 192.168.12.20
主從搭建命令
stop slave;
change master to master_host='172.16.2.185',master_user='repuser',
master_password='repuser123',master_log_file='wm_binlog.000002',master_log_pos=154;
MHA會提供諸多工具程序, 其常見的如下所示:
Manager節(jié)點:
masterha_check_ssh:MHA 依賴的 ssh 環(huán)境監(jiān)測工具;
masterha_check_repl:MYSQL 復制環(huán)境檢測工具;
masterga_manager:MHA 服務主程序;
masterha_check_status:MHA 運行狀態(tài)探測工具;
masterha_master_monitor:MYSQL master 節(jié)點可用性監(jiān)測工具;
masterha_master_swith:master:節(jié)點切換工具;
masterha_conf_host:添加或刪除配置的節(jié)點;
masterha_stop:關(guān)閉 MHA 服務的工具。
Node節(jié)點:(這些工具通常由MHA Manager的腳本觸發(fā),無需人為操作)
save_binary_logs:保存和復制 master 的二進制日志;
apply_diff_relay_logs:識別差異的中繼日志事件并應用于其他 slave;
purge_relay_logs:清除中繼日志(不會阻塞 SQL 線程);
自定義擴展:
secondary_check_script:通過多條網(wǎng)絡路由檢測master的可用性;
master_ip_failover_script:更新application使用的masterip;
report_script:發(fā)送報告;
init_conf_load_script:加載初始配置參數(shù);
master_ip_online_change_script;更新master節(jié)點ip地址。
2.3工作原理

MHA工作原理總結(jié)為以下幾條:
(1) 從宕機崩潰的 master 保存二進制日志事件(binlog events);
(2) 識別含有最新更新的 slave ;
(3) 應用差異的中繼日志(relay log) 到其他 slave ;
(4) 應用從 master 保存的二進制日志事件(binlog events);
(5) 提升一個 slave 為新 master ;
(6) 使用其他的 slave 連接新的 master 進行復制。
其最大特點是 可以修復多個Slave之間的差異日志,最終使所有Slave保持數(shù)據(jù)一致
VIP切換腳本
vim master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
my (
? ? $command,? ? ? ? ? $ssh_user,? ? ? ? $orig_master_host, $orig_master_ip,
? ? $orig_master_port, $new_master_host, $new_master_ip,? ? $new_master_port
);
my $vip = '172.16.2.187/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
$ssh_user = "root";
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,
);
exit &main();
sub main {
? ? print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
? ? if ( $command eq "stop" || $command eq "stopssh" ) {
? ? ? ? my $exit_code = 1;
? ? ? ? eval {
? ? ? ? ? ? print "Disabling the VIP on old master: $orig_master_host \n";
? ? ? ? ? ? &stop_vip();
? ? ? ? ? ? $exit_code = 0;
? ? ? ? };
? ? ? ? if ($@) {
? ? ? ? ? ? warn "Got Error: $@\n";
? ? ? ? ? ? exit $exit_code;
? ? ? ? }
? ? ? ? exit $exit_code;
? ? }
? ? elsif ( $command eq "start" ) {
? ? ? ? my $exit_code = 10;
? ? ? ? eval {
? ? ? ? ? ? print "Enabling the VIP - $vip on the new master - $new_master_host \n";
? ? ? ? ? ? &start_vip();
? ? ? ? ? ? $exit_code = 0;
? ? ? ? };
? ? ? ? if ($@) {
? ? ? ? ? ? warn $@;
? ? ? ? ? ? exit $exit_code;
? ? ? ? }
? ? ? ? exit $exit_code;
? ? }
? ? elsif ( $command eq "status" ) {
? ? ? ? print "Checking the Status of the script.. OK \n";
? ? ? ? exit 0;
? ? }
? ? else {
? ? ? ? &usage();
? ? ? ? exit 1;
? ? }
}
sub start_vip() {
? ? `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
? ? return 0? unless? ($ssh_user);
? ? `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub usage {
? ? "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";
}
MHA集群配置文件
vim app1.cnf
[server default]
manager_log=/etc/masterha/manager.log
manager_workdir=/etc/masterha
master_binlog_dir=/mysql/logs/3306/binlog
master_ip_failover_script=/etc/masterha/scripts/master_ip_failover
password=123456
ping_interval=1
repl_password=repuser123
repl_user=repuser
ssh_user=root
user=root
[server1]
hostname=172.16.2.186
port=3306
[server2]
hostname=172.16.0.171
port=3306
[server3]
hostname=192.168.12.20
port=3306
相關(guān)命令:
-- 檢查ssh連通性
masterha_check_ssh --conf=/etc/masterha/app1.cnf

-- 檢查集群配置健康狀態(tài)
masterha_check_repl --conf=/etc/masterha/app1.cnf

-- 檢查MHA集群狀態(tài)
masterha_check_status --conf=/etc/masterha/app1.cnf

-- 啟動MHA集群?
masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover &
--ignore_last_failover
默認情況下,如果MHA檢查到主庫發(fā)生宕機,且兩次宕機時間間隔不足8小時,則不會發(fā)生切換,該參數(shù)可以避免上述情況
日志分析
tail -f /etc/masterha/manager.log





特別注意:
1. MHA啟動之后自動處理好集群主從讀寫關(guān)系
2.manager節(jié)點也需要 node包
3.故障切換后 masterha_manager進程會自動down掉,需重新啟動(可腳本實現(xiàn)檢測并自動啟動)?
vim check_manager_status.sh
#!/bin/bash
while :
do
MGECHECK=`ps -ef|grep masterha_manager |egrep -v grep| wc -l`
if [ $MGECHECK -eq 0 ];then
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover > /dev/null ?2>&1
else
echo "MHA manager start"
fi
sleep 5
done
寫入開機啟動: echo /usr/local/bin/check_manager_status.sh >> /etc/rc.d/rc.local
搭建參考: https://www.cnblogs.com/sky-cheng/p/10972424.html
感謝作者.