mysql 5.7 MHA集群故障切換

服務器信息:

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 {

? ? 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";

}

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

MHA故障切換-日志01
MHA故障切換-日志02


MHA故障切換-日志03


MHA故障切換-日志04


MHA故障切換-日志05

特別注意:

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
感謝作者.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容