1. 程式人生 > 其它 >理論+實驗:MHA高可用配置及故障切換(實驗超詳細版)

理論+實驗:MHA高可用配置及故障切換(實驗超詳細版)

目錄

一、案例概述

1.1 案例概述

■ 傳統的mysql主從架構存在的問題

  • 單點故障
    ◆目前MySQL已經成為市場上主流資料庫之一,考慮到業務的重要性,MySQL 資料庫單點問題已成為企業網站架構中最大的隱患。隨著技術的發展,MHA 的出現就是解決MySQL單點的問題。另外隨著企業資料量越來越龐大,資料庫的壓力又成為企業的另一個瓶頸,MySQL多主多從架構的出現可以減輕MySQL本身的壓力。本章將主要介紹 MHA的搭建和模擬 MySQL故障自動切換的過程。

1.2 案例前置知識點-1

■ MHA概述

  • —套優秀的MySQL高可用環境下故障切換和主從複製的軟體
  • MySQL故障過程中,MHA能做到0-30秒內自動完成故障切換

■ MHA的組成

  • MHA Manager (管理節點)
  • MHA Node (資料節點)

1.3 案例前置知識點-2

■ MHA特點

  • 自動故障切換過程中,MHA試圖從宕機的主伺服器上儲存二進位制日誌,最大程度的保證資料不丟失
  • 使用半同步複製,可以大大降低資料丟失的風險
  • 目前MHA支援一主多從架構,最少三臺服務,即一主兩從

1.4 案例環境

■ 案例拓撲圖

二、案例實施

2.1 實驗思路

1、MHA架構
2、資料庫安裝
3、一主兩從
4、MHA搭建

2.2 案例環境

本案例環境
伺服器 CentOS7.6(64 位) MHA-manager/20.0.0.4
管理節點,安裝 manager 元件
伺服器 CentOS7.6(64 位) Mysql1/20.0.0.3 Master 節點,安裝 node 元件
伺服器 CentOS7.6(64 位) Mysql2/20.0.0.5 Slave 節點,安裝 node 元件
伺服器 CentOS7.6(64 位) Mysql3/20.0.0.6 Slave 節點,安裝 node 元件

這裡作業系統是 CentOS7 版本,所以這裡下載 MHA 版本是 0.57 版本。

2.3 案例環境案例需求

本案例要求通過 MHA 監控 MySQL 資料庫在故障時進行自動切換,不影響業務。

2.4 案例實現思路

1、 安裝 MySQL 資料庫
2、 配置 MySQL 一主兩從
3、 安裝 MHA 軟體
4、 配置無密碼認證
5、 配置 MySQL MHA 高可用
6、 模擬 master 故障切換

在三臺 MySQL 節點上分別安裝資料庫,MySQL 版本請使用 5.6.36,cmake 版本請使
用 2.8.6。下面只在 Mysql1 上面做演示,安裝過程如下。

#####所有伺服器最好都清除一下快取,重啟一下#####



[root@localhost ~]# iptables -F
[root@localhost ~]# setenforce 0
[root@localhost ~]# init 6

[root@mysql1 ~]# vim /etc/hosts  ###對映一下,mysql1、mysql2、mysql3都要這麼做
20.0.0.3 mysql1
20.0.0.5 mysql2
20.0.0.6 mysql3

[root@mysql1 ~]# ping mysql3   ###ping一下就可以驗證是否對映成功
  1. 下面1-3步驟是mysql5.6的安裝步驟,我用的mysql5.7版本,已經裝好了,直接從步驟四開始做了
  • 也可以看我部落格:https://blog.csdn.net/weixin_44733021/article/details/108466141,部落格是5.7版本mysql安裝

1. 安裝編譯依賴的環境
[root@Mysql1 ~]# yum -y install ncurses-devel gcc-c++ perl-Module-Install

2. 安裝 gmake 編譯軟體
[root@Mysql1 ~]# tar zxvf cmake-2.8.6.tar.gz
[root@Mysql1 ~]# cd cmake-2.8.6
[root@Mysql1 cmake-2.8.6]# ./configure
[root@Mysql1 cmake-2.8.6]# gmake && gmake install

3. 安裝 MySQL 資料庫
[root@Mysql1 ~]# tar -zxvf mysql-5.6.36.tar.gz
[root@Mysql1 ~]# cd mysql-5.6.36
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DSYSCONFDIR=/etc
[root@Mysql1 mysql-5.6.36]# make && make install
[root@Mysql1 mysql-5.6.36]# cp support-files/my-default.cnf /etc/my.cnf
[root@Mysql1 mysql-5.6.36]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@Mysql1 ~]# chmod +x /etc/rc.d/init.d/mysqld
[root@Mysql1 ~]# chkconfig --add mysqld
[root@Mysql1 ~]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
[root@Mysql1 ~]# source /etc/profile
[root@Mysql1 ~]# groupadd mysql
[root@Mysql1 ~]# useradd -M -s /sbin/nologin mysql -g mysql
[root@Mysql1 ~]# chown -R mysql.mysql /usr/local/mysql
[root@Mysql1 ~]# mkdir -p /data/mysql
/usr/local/mysql/scripts/mysql_install_db \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data \
--user=mysql
  1. 修改 Master 的主配置檔案/etc/my.cnf 檔案,三臺伺服器的 server-id 不能一樣
[root@Mysql1 ~]# vi /etc/my.cnf
#default-character-set=utf8          ###最上面的字符集也要一定註釋掉,不然健康檢查過不去
[mysqld]
server-id = 1                           ###id千萬別一樣
log_bin = master-bin          ###開啟二進位制日誌
log-slave-updates = true    ###執行從伺服器進行同步

[root@mysql3 ~]# systemctl restart mysqld   ###重啟服務

配置從伺服器1:
在/etc/my.cnf 中修改或者增加下面內容。
[root@Mysql2 ~]# vim /etc/my.cnf
#default-character-set=utf8          ###最上面的字符集也要一定註釋掉,不然健康檢查過不去
server-id = 2                                   ###id千萬別一樣
log_bin = master-bin                      ###開啟二進位制日誌
relay-log = relay-log-bin                        ###中繼日誌要開啟
relay-log-index = slave-relay-bin.index   ###索引也要

[root@mysql3 ~]# systemctl restart mysqld  ###重啟服務

配置從伺服器2:
在/etc/my.cnf 中修改或者增加下面內容。
[root@Mysql2 ~]# vim /etc/my.cnf
#default-character-set=utf8          ###最上面的字符集也要一定註釋掉,不然健康檢查過不去
server-id = 3                                   ###id千萬別一樣
log_bin = master-bin                      ###開啟二進位制日誌
relay-log = relay-log-bin                        ###中繼日誌要開啟
relay-log-index = slave-relay-bin.index   ###索引也要

[root@mysql3 ~]# systemctl restart mysqld   ###重啟服務
  1. Mysql1、Mysql2、Mysql3 分別做兩個軟連結
[root@Mysql1 ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@Mysql1 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
  1. Mysql1、Mysql2、Mysql3 啟動 MySQL。
[root@Mysql1 ~]# /usr/local/mysql/bin/mysqld_safe --user=mysql &
  1. 配置 MySQL 一主兩從,三臺都要做
1. MySQL 主從配置相對比較簡單。需要注意的是授權。步驟如下:
在所有資料庫節點上授權兩個使用者,一個是從庫同步使用,另外一個是 manager 使用。
mysql> grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by '123';
mysql> grant all privileges on *.* to 'mha'@'20.0.0.%' identified by 'manager';
mysql> flush privileges;  ###重新整理
-----------------------------------------!!!!第二條我沒做!!!!--------------------------------------
2. 下面三條授權按理論是不用新增的,但是做案例實驗環境時候通過 MHA 檢查MySQL 主從有報錯,
報兩個從庫通過主機名連線不上主庫,所以所有資料庫加上下面的授權。

mysql> grant all privileges on *.* to 'mha'@'Mysql1' identified by 'manager';
mysql> grant all privileges on *.* to 'mha'@'Mysql2' identified by 'manager';
mysql> grant all privileges on *.* to 'mha'@'Mysql3' identified by 'manager';
----------------------------------------------------------------------------------------------------------
3. 在 Mysql1 主機上檢視二進位制檔案和同步點
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |     885 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+

4. 接下來在 Mysql2 和 Mysql3 分別執行同步。
mysql> change master to master_host='20.0.0.3',master_user='myslave',master_password='123',master_log_file='master-bin.000003',master_log_pos=306; 
mysql> flush privileges;     ###重新整理
mysql> start slave;           ###啟動slave

5. 檢視 IO 和 SQL 執行緒都是 yes 代表同步是否正常。
mysql> show slave status\G;      ###兩個執行緒都yes就行
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

注意:這個時候主從同步就建立好了

必須設定mysql2、mysql3從庫為只讀模式:

mysql> set global read_only=1;
mysql> flush privileges;   ###重新整理一下

注意:設定完成直接驗證主從複製功能

-------------------------------------------------------安裝 MHA 軟體---------------------------------------------------------------------------

  1. 所有伺服器上都安裝 MHA 依賴的環境,首先安裝 epel 源(四臺都要裝!!!)
[root@MHA-manager ~]# yum install epel-release --nogpgcheck -y

yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN
  1. MHA 軟體包對於每個作業系統版本不一樣,這裡 CentOS7.4 必須選擇 0.57 版本,
    在<注意:所有伺服器>上必須先安裝 node 元件,最後在 MHA-manager 節點上安裝 manager 元件,
    因為 manager 依賴 node 元件,下面都是在 Mysql1 上操作演示安裝 node 元件。

mysql1、mysql2、mysql3上傳node就行、MHA的要上傳node、manager兩個包

[root@Mysql1 ~]# tar zxvf mha4mysql-node-0.57.tar.gz
[root@Mysql1 ~]# cd mha4mysql-node-0.57
[root@Mysql1 mha4mysql-node-0.57]# perl Makefile.PL  
[root@Mysql1 mha4mysql-node-0.57]# make
[root@Mysql1 mha4mysql-node-0.57]# make install
  1. 在 MHA-manager 上安裝 manager 元件(!注意:一定要先安裝node 元件才能安裝manager 元件)
[root@MHA-manager ~]# tar zxvf mha4mysql-manager-0.57.tar.gz 
[root@MHA-manager ~]# cd mha4mysql-manager-0.57/
[root@MHA-manager mha4MHA-manager-0.57]# perl Makefile.PL
[root@MHA-manager mha4MHA-manager-0.57]# make
[root@MHA-manager mha4MHA-manager-0.57]# make install

manager 安裝後在/usr/local/bin 下面會生成幾個工具,主要包括以下幾個:
masterha_check_ssh 檢查 MHA 的 SSH 配置狀況
masterha_check_repl 檢查 MySQL 複製狀況
masterha_manger 啟動 manager的指令碼
masterha_check_status 檢測當前 MHA 執行狀態
masterha_master_monitor 檢測 master 是否宕機
masterha_master_switch 控制故障轉移(自動或者手動)
masterha_conf_host 新增或刪除配置的 server 資訊
masterha_stop  關閉manager
  1. node 安裝後也會在/usr/local/bin 下面會生成幾個指令碼(這些工具通常由 MHA
    Manager 的指令碼觸發,無需人為操作)主要如下:
save_binary_logs 儲存和複製 master 的二進位制日誌
apply_diff_relay_logs 識別差異的中繼日誌事件並將其差異的事件應用於其他的 slave
filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用這個工具)
purge_relay_logs 清除中繼日誌(不會阻塞 SQL 執行緒)
  1. 配置無密碼認證
6. 在 manager 上配置到所有資料庫節點的無密碼認證
[root@MHA-manager ~]# ssh-keygen -t rsa //一路按回車鍵
[root@MHA-manager ~]# ssh-copy-id 20.0.0.3    ###yes  然後輸入密碼,密碼是root登入密碼
[root@MHA-manager ~]# ssh-copy-id 20.0.0.5   
[root@MHA-manager ~]# ssh-copy-id 20.0.0.6   
7. 在 Mysql1 上配置到資料庫節點Mysql2和Mysql3的無密碼認證
[root@Mysql1 ~]# ssh-keygen -t rsa
[root@Mysql1 ~]# ssh-copy-id 20.0.0.5    
[root@Mysql1 ~]# ssh-copy-id 20.0.0.6 
8. 在 Mysql2 上配置到資料庫節點Mysql1和Mysql3的無密碼認證
[root@Mysql2 ~]# ssh-keygen -t rsa
[root@Mysql2 ~]# ssh-copy-id 20.0.0.3    
[root@Mysql2 ~]# ssh-copy-id 20.0.0.6  
9. 在 Mysql3 上配置到資料庫節點Mysql1和Mysql2的無密碼認證
[root@Mysql3 ~]# ssh-keygen -t rsa
[root@Mysql3 ~]# ssh-copy-id  20.0.0.3   
[root@Mysql3 ~]# ssh-copy-id 20.0.0.5
  1. 配置 MHA(在MHA伺服器上配置)
1.   在 manager 節點上覆制相關指令碼到/usr/local/bin 目錄。
[root@MHA-manager ~]# cp -ra /root/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
//拷貝後會有四個執行檔案
[root@atlas ~]# ll /usr/local/bin/scripts/
總用量 32
-rwxr-xr-x 1 mysql mysql 3648 5 月 31 2015 master_ip_failover  #自動切換時 VIP 管理的指令碼
-rwxr-xr-x 1 mysql mysql 9872 5 月 25 09:07 master_ip_online_change #線上切換時 vip 的管理
-rwxr-xr-x 1 mysql mysql 11867 5 月 31 2015 power_manager #故障發生後關閉主機的指令碼
-rwxr-xr-x 1 mysql mysql 1360 5 月 31 2015 send_report #因故障切換後傳送報警的指令碼
  1. 複製上述的自動切換時 VIP 管理的指令碼到/usr/local/bin 目錄,這裡使用指令碼管理 VIP,(在MHA伺服器上配置)
[root@MHA-manager ~]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
  1. 修改內容如下:(刪除原有內容,直接複製)(在MHA伺服器上配置)

裡面全是註釋掉的,需要用替換方法 去掉註釋符 % s/^#// ,%全文,s替換,^# 開頭的替換成空的
注意:但第一行需要把#加上!!!


[root@MHA-manager ~]#vim /usr/local/bin/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 = '20.0.0.200'; 
my $brdc = '20.0.0.255';
my $ifdev = 'ens33';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
my $exit_code = 0;
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
##################################################################################
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 \"`;
}
# A simple system call that disable the VIP on the old_master
sub stop_vip() {
    
`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";
}



#############################新增內容部分解釋#########################################
my $vip = '20.0.0.200';                  ###這個是漂移地址,一定要和當前伺服器節點一個網段
my $brdc = '20.0.0.255';      ###廣播號,廣播號確定了結束地址
my $ifdev = 'ens33';                      ###當前網絡卡名稱,有的是eta,需要根據情況更改
my $key = '1';                                 ###邏輯子介面編號
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";    ###用ens33做他的邏輯子介面的漂移地址 
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";  ###關閉
my $exit_code = 0;   ###關閉是正常關閉,返回的值是0
  1. 建立 MHA 軟體目錄並拷貝配置檔案。
[root@MHA-manager ~]# mkdir /etc/masterha
[root@MHA-manager ~]# cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
[root@MHA-manager ~]# vim /etc/masterha/app1.cnf  
###把裡面東西直接刪掉用下面的修改###
[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/usr/local/mysql/data
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=manager
ping_interval=1
remote_workdir=/tmp
repl_password=123
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 20.0.0.5 -s 20.0.0.6
shutdown_script=""
ssh_user=root
user=mha

[server1]
hostname=20.0.0.3
port=3306

[server2]
candidate_master=1
check_repl_delay=0
hostname=20.0.0.5
port=3306

[server3]
hostname=20.0.0.6
port=3306
-------------------------------------------------配置檔案解析---------------------------------------------------------------------
[server default]
manager_workdir=/var/log/masterha/app1.log               ##manager工作目錄
manager_log=/var/log/masterha/app1/manager.log            #manager日誌
master_binlog_dir=/usr/local/mysql/data/                #master儲存binlog的位置,這裡的路徑要與master裡配置的binlog的路徑一致,以便mha能找到
#master_ip_failover_script= /usr/local/bin/master_ip_failover    #設定自動failover時候的切換指令碼,也就是上邊的哪個指令碼
master_ip_online_change_script= /usr/local/bin/master_ip_online_change  #設定手動切換時候的切換指令碼
password=manager      #設定mysql中root使用者的密碼,這個密碼是前文中建立監控使用者的那個密碼
user=mha        #設定監控使用者root
ping_interval=1      #設定監控主庫,傳送ping包的時間間隔,預設是3秒,嘗試三次沒有迴應的時候自動進行railover
remote_workdir=/tmp    #設定遠端mysql在發生切換時binlog的儲存位置
repl_password=123        #設定複製使用者的密碼
repl_user=myslave           #設定複製使用者的使用者
report_script=/usr/local/send_report      //設定發生切換後傳送的報警的指令碼
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.195.130 -s 192.168.195.131
shutdown_script=""  #設定故障發生後關閉故障主機指令碼(該指令碼的主要作用是關閉主機放在發生腦裂,這裡沒有使用)
ssh_user=root      #設定ssh的登入使用者名稱

[server1]
hostname=192.168.195.129
port=3306

[server2]
hostname=192.168.195.130
port=3306
candidate_master=1    #//設定為候選master,如果設定該引數以後,發生主從切換以後將會將此從庫提升為主庫,即使這個主庫不是叢集中事件最新的slave
check_repl_delay=0    #預設情況下如果一個slave落後master 100M的relay logs的話,MHA將不會選擇該slave作為一個新的master,因為對於這個slave的恢復需要花費很長時間,通過設定check_repl_delay=0,MHA觸發切換在選擇一個新的master的時候將會忽略複製延時,這個引數對於設定了candidate_master=1的主機非常有用,因為這個候選主在切換的過程中一定是新的master

[server3]
hostname=192.168.195.131
port=3306
  1. 測試 ssh 無密碼認證,如果正常最後會輸出 successfully,如下所示。
[root@MHA-manager ~]# masterha_check_ssh -conf=/etc/masterha/app1.cnf

Tue Nov 26 23:09:45 2019 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Tue Nov 26 23:09:45 2019 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Tue Nov 26 23:09:45 2019 - [info] Reading server configuration from /etc/masterha/app1.cnf..
Tue Nov 26 23:09:45 2019 - [info] Starting SSH connection tests..
Tue Nov 26 23:09:46 2019 - [debug] 
Tue Nov 26 23:09:45 2019 - [debug]  Connecting via SSH from [email protected](192.168.195.130:22) to [email protected](192.168.195.131:22)..
Tue Nov 26 23:09:46 2019 - [debug]   ok.
Tue Nov 26 23:09:47 2019 - [debug] 
Tue Nov 26 23:09:46 2019 - [debug]  Connecting via SSH from [email protected](192.168.195.131:22) to [email protected](192.168.195.130:22)..
Tue Nov 26 23:09:47 2019 - [debug]   ok.
Tue Nov 26 23:09:47 2019 - [info] All SSH connection tests passed successfully.
----------------------------mysql5.7注意--------------------------------------
請註釋/etc/my.cnf 中 【client】下 #default-character-set=utf8
在所有資料庫中建立以下指令軟連線
 ln -s /usr/local/mysql/bin/mysql /usr/sbin/
 ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
[root@MHA-manager ~]# masterha_check_repl -conf=/etc/masterha/app1.cnf   ###健康檢查

Tue Nov 26 23:10:29 2019 - [info] Slaves settings check done.
Tue Nov 26 23:10:29 2019 - [info] 
192.168.195.130(192.168.195.130:3306) (current master)
 +--192.168.195.131(192.168.195.131:3306)

Tue Nov 26 23:10:29 2019 - [info] Checking replication health on 192.168.195.131..
Tue Nov 26 23:10:29 2019 - [info]  ok.
Tue Nov 26 23:10:29 2019 - [info] Checking master_ip_failover_script status:
Tue Nov 26 23:10:29 2019 - [info]   /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.195.130 --orig_master_ip=192.168.195.130 --orig_master_port=3306 


IN SCRIPT TEST====/sbin/ifconfig ens33:1 down==/sbin/ifconfig ens33:1 192.168.195.200===

Checking the Status of the script.. OK 
Tue Nov 26 23:10:29 2019 - [info]  OK.
Tue Nov 26 23:10:29 2019 - [warning] shutdown_script is not defined.
Tue Nov 26 23:10:29 2019 - [info] Got exit code 0 (Not master dead).

MySQL Replication Health is OK.

//注意:第一次配置需要去master上手動開啟虛擬IP
[root@Mysql1 ~]# /sbin/ifconfig ens33:1 20.0.0.200/24
  1. 啟動 MHA
[root@MHA-manager ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
[1] 129929



--remove_dead_master_conf 該引數代表當發生主從切換後,老的主庫的 ip 將會從配置檔案中移除。
--manger_log 日誌存放位置。
--ignore_last_failover 在預設情況下,如果 MHA 檢測到連續發生宕機,且兩次宕機間
隔不足 8 小時的話,則不會進行 Failover,之所以這樣限制是為了避免 ping-pong 效應。該
引數代表忽略上次 MHA 觸發切換產生的檔案,預設情況下,MHA 發生切換後會在日誌記
目錄,也就是上面設定的日誌 app1.failover.complete 檔案,下次再次切換的時候如果發現
該目錄下存在該檔案將不允許觸發切換,除非在第一次切換後收到刪除該檔案,為了方便,
這裡設定為–ignore_last_failover。
  1. 檢視 MHA 狀態,可以看到當前的 master 是 Mysql1 節點。
[root@MHA-manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:7763) is running(0:PING_OK), master:20.0.0.3
  1. 檢視 MHA 日誌,也以看到當前的 master 是 20.0.0.3,如下所示。
[root@MHA-manager ~]# cat /var/log/masterha/app1/manager.log
----- Failover Report -----

app1: MySQL Master failover 20.0.0.3(20.0.0.3:3306) to 20.0.0.5(20.0.0.5:3306) succeeded

Master 20.0.0.3(20.0.0.3:3306) is down!

Check MHA Manager logs at localhost.localdomain:/var/log/masterha/app1/manager.log for details.

Started automated(non-interactive) failover.
Invalidated master IP address on 20.0.0.3(20.0.0.3:3306)
The latest slave 20.0.0.5(20.0.0.5:3306) has all relay logs for recovery.
Selected 20.0.0.5(20.0.0.5:3306) as a new master.
20.0.0.5(20.0.0.5:3306): OK: Applying all logs succeeded.
20.0.0.5(20.0.0.5:3306): OK: Activated master IP address.
20.0.0.6(20.0.0.6:3306): This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
20.0.0.6(20.0.0.6:3306): OK: Applying all logs succeeded. Slave started, replicating from 20.0.0.5(20.0.0.5:3306)
20.0.0.5(20.0.0.5:3306): Resetting slave info succeeded.
Master failover to 20.0.0.5(20.0.0.5:3306) completed successfully.
  1. 檢視 Mysql1 的 VIP 地址 20.0.0.200 是否存在?,這個 VIP 地址不會因為manager 節點停止 MHA 服務而消失。
[root@Mysql1 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 20.0.0.3  netmask 255.255.255.0  broadcast 20.0.0.255
        inet6 fe80::be3f:d090:5539:5db1  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:70:4f:5b  txqueuelen 1000  (Ethernet)
        RX packets 968912  bytes 200636579 (191.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1197148  bytes 142066822 (135.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 20.0.0.0.200  netmask 255.255.255.0  broadcast 20.0.0.255
        ether 00:0c:29:70:4f:5b  txqueuelen 1000  (Ethernet)

驗證

[root@MHA-manager ~]#tailf /var/log/masterha/app1/manager.log     //啟用監控觀察日誌記錄(在MHA伺服器上)

[root@Mysql1 ~]# pkill -9 mysql 或 systemctl stop mysqld   //檢視master變化 (可以在mysql1上面終止)

[root@mysql2 ~]# ifconfig      ###在mysql2上面就可以看見地址漂移了
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 20.0.0.200  netmask 255.0.0.0  broadcast 20.255.255.255
        ether 00:0c:29:9d:de:4f  txqueuelen 1000  (Ethernet)


故障模擬:

在主庫上:
pkill mysqld
可以看到從庫的狀態,其中之一肯定有切換到主庫的
切換備選主庫的演算法:
1.一般判斷從庫的是從(position/GTID)判斷優劣,資料有差異,最接近於master的slave,成為備選主。
2.資料一致的情況下,按照配置檔案順序,選擇備選主庫。
3.設定有權重(candidate_master=1),按照權重強制指定備選主。
1)預設情況下如果一個slave落後master 100M的relay logs的話,即使有權重,也會失效。
2)如果check_repl_delay=0的話,即使落後很多日誌,也強制選擇其為備選主。
故障修復步驟:
1.修復db
/etc/init.d/mysqld start
2.修復主從
>change master to master_host='192.168.195.130',master_user='myslave',master_password='123',master_log_file='master-bin.000002',master_log_pos=154;
>start slave;
3.修改配置檔案(再把這個記錄新增進去,因為它檢測掉失效時候會自動消失)
vi /etc/masterha/app1.cnf
[server1]
hostname=192.168.195.129
port=3306
4.啟動manager(在manager那臺機器上)
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &

dos2unix /usr/local/bin/master_ip_failover 解決中英字不相容報錯的問題