1. 程式人生 > 其它 >MySQL高可用之MHA叢集

MySQL高可用之MHA叢集

一、MHA概述

1.1 什麼是 MHA

MHA(MasterHigh Availability)是一套優秀的MySQL高可用環境下故障切換和主從複製的軟體。

MHA 的出現就是解決MySQL 單點故障的問題。

MySQL故障切換過程中,MHA能做到0-30秒內自動完成故障切換操作。

MHA能在故障切換的過程中最大程度上保證資料的一致性,以達到真正意義上的高可用。

1.2 MHA 的組成

1)MHA Node(資料節點)

  • MHA Node 執行在每臺 MySQL 伺服器上。

2)MHA Manager(管理節點)

  • MHA Manager 可以單獨部署在一臺獨立的機器上,管理多個 master-slave 叢集;也可以部署在一臺 slave 節點上。
  • MHA Manager 會定時探測叢集中的 master 節點。當 master 出現故障時,它可以自動將最新資料的 slave 提升為新的 master, 然後將所有其他的 slave 重新指向新的 master。整個故障轉移過程對應用程式完全透明。

1.3 MHA 的特點

  • 自動故障切換過程中,MHA試圖從宕機的主伺服器上儲存二進位制日誌,最大程度的保證資料不丟失
  • 使用半同步複製,可以大大降低資料丟失的風險,如果只有一個slave已經收到了最新的二進位制日誌,MHA可以將最新的二進位制日誌應用於其他所有的slave伺服器上,因此可以保證所有節點的資料一致性。
  • 目前MHA支援一主多從架構,最少三臺伺服器,即一主兩從

二、MySQL MHA搭建準備

2.1 實驗思路

1)MHA架構:①資料庫安裝 ②一主兩從 ③MHA搭建

2)故障模擬:①主庫失效 ②備選主庫成為主庫 ③原故障主庫恢復重新加入到MHA成為從庫

2.2 實驗準備

節點伺服器 系統 主機名 IP地址 安裝工具及服務
MHA manager 伺服器 CentOS7.4(64 位) manager 192.168.68.101 MHA node 和 manager 元件
Master 伺服器 CentOS7.4(64 位) mysql1 192.168.68.111 MHA node 元件
Slave1 伺服器 CentOS7.4(64 位) mysql2 192.168.68.112 MHA node 元件
Slave2 伺服器 CentOS7.4(64 位) mysql3 192.168.68.113 MHA node 元件

MHA一主兩從高可用叢集示意圖:

三、搭建 MySQL MHA

3.1 配置主從複製

1、四臺伺服器都關閉防火牆

 systemctl disable --now firewalld
 setenforce 0

2、修改 Master、Slave1、Slave2 節點的主機名

 ##Master 節點##
 hostnamectl set-hostname mysql1
 su
 ​
 ##Slave1節點##
 hostnamectl set-hostname mysql2
 su
 ​
 ##Slave2節點##
 hostnamectl set-hostname mysql3
 su

3、 在Master、Slave1、Slave2新增主機對映關係

 #三臺新增同樣的配置
 vim /etc/hosts
 192.168.68.111 mysql1
 192.168.68.112 mysql2
 192.168.68.113 mysql3

4、修改 Master、Slave1、Slave2 節點的 Mysql主配置檔案/etc/my.cnf

Master節點,開啟二進位制日誌。

Slave1、Slave2 節點,開啟二進位制日誌和中繼日誌。

 ##Master 節點##
 vim /etc/my.cnf
 [mysqld]
 server-id = 1
 log_bin = master-bin         #開啟二進位制日誌,指定存放位置
 log-slave-updates = true     #允許slave從master複製資料時可以寫入到自己的二進位制日誌中
 ​
 systemctl restart mysqld     #重啟mysql
 ​
 ##Slave1節點##
 vim /etc/my.cnf
 [mysqld]
 server-id = 2               #三臺伺服器的 server-id 不能相同
 log_bin = master-bin
 relay-log = relay-log-bin
 relay-log-index = slave-relay-bin.index
 ​
 systemctl restart mysqld
 ​
 ##Slave2節點##
 vim /etc/my.cnf
 [mysqld]
 server-id = 3               #三臺伺服器的 server-id 不能相同
 log_bin = master-bin
 relay-log = relay-log-bin
 relay-log-index = slave-relay-bin.index
 ​
 systemctl restart mysqld     #重啟mysql

5、在 Master、Slave1、Slave2 節點上都建立兩個軟連結

 ln -s /usr/local/mysql/bin/mysql /usr/sbin/
 ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
 ​
 ls /usr/sbin/mysql*     #檢視軟連結

6、登入資料庫進行授權

對slave和manager進行授權。

 ##----(1)所有資料庫節點進行mysql主從同步的授權------##
 grant replication slave on *.* to 'myslave'@'192.168.68.%' identified by '123123';   #從伺服器同步使用
 
 
 ##---(2)所有資料庫節點,授權給manager伺服器-----##
 
 grant all privileges on *.* to 'mha'@'192.168.68.%' identified by 'manager';  
 #為了防止因主機名導致的連線不上問題,再次對登入地址進行授權
 ​
 grant all privileges on *.* to 'mha'@'mysql1' identified by 'manager';              
 grant all privileges on *.* to 'mha'@'mysql2' identified by 'manager';
 grant all privileges on *.* to 'mha'@'mysql3' identified by 'manager';
 ​
 flush privileges;   #重新整理許可權

所有資料庫節點進行mysql主從同步的授權:

所有資料庫節點,授權給manager伺服器:

 slave2同理

7、配置主從同步

在 Master 節點檢視二進位制檔案和同步點(即偏移量),在 Slave1、Slave2 節點執行同步操作。

 ##(1)在 Master 節點檢視二進位制檔案和同步點(即偏移量)##
 show master status;
 +-------------------+----------+--------------+------------------+--
 | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | 
 +-------------------+----------+--------------+------------------+--
 |   mysql-bin.000012|      773 |              |                  |   
 +-------------------+----------+--------------+------------------+--
 ​
 ​
 ##(2)在 Slave1、Slave2 節點執行同步操作##
 change master to master_host='192.168.68.111',master_user='myslave',master_password='123123',master_log_file='mysql-bin.000012',master_log_pos=773; 
 ​
 start slave;     #開啟同步,如有報錯執行 reset slave;
 ​
 ##(3)在 Slave1、Slave2 檢視節點狀態##
 show slave status\G     
 //確保 IO 和 SQL 執行緒都是 Yes,代表同步正常。
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes
 ​
 #一般 "Slave_IO_Running: No" 的可能原因:
  1. 網路不通 
  2. my.cnf配置有問題(server-id重複)
  3. 密碼、file檔名、pos偏移量不對 
  4. 防火牆沒有關閉 
 ​
 ##(4)兩個從庫必須設定為只讀模式##
 set global read_only=1;
 ​
 ##(5)在Master主庫插入資料,測試資料庫同步##
 create database test1; 
 use test1;
 create table shop(id int);
 insert into shop values (1);
 ​
 #從資料庫中驗證是否同步成功
 select * from test1.shop;

1)在 Master 節點檢視二進位制檔案和同步點:

 2)在 Slave1、Slave2 節點執行同步操作:

 3)兩個從庫必須設定為只讀模式:

 4)在Master主庫插入資料,slave中驗證資料同步:

3.2 配置MHA

1、所有伺服器安裝MHA軟體

  • 對於每個作業系統版本不一樣,這裡 CentOS7.4 必須選擇 0.57 版本。
  • 在所有伺服器上必須先安裝 node 元件,最後在 MHA-manager 節點上安裝 manager 元件,因為 manager元件 依賴 node 元件。
 ##(1)所有伺服器上都安裝 MHA 依賴的環境,首先安裝 epel 源##
 yum install epel-release --nogpgcheck -y
 ​
 #安裝 MHA依賴環境
 yum install -y perl-DBD-MySQL \
 perl-Config-Tiny \
 perl-Log-Dispatch \
 perl-Parallel-ForkManager \
 perl-ExtUtils-CBuilder \
 perl-ExtUtils-MakeMaker \
 perl-CPAN
 ​
 ##(2)安裝 MHA 軟體包,必須先在所有伺服器上安裝 node 元件##
 #將安裝包上傳到/opt/目錄中,解壓安裝node元件##
 cd /opt/
 tar zxvf mha4mysql-node-0.57.tar.gz
 cd mha4mysql-node-0.57
 perl Makefile.PL
 make && make install
 ​
 ##(3)最後在 MHA manager 節點上安裝 manager 元件##(manager元件依賴node 元件)
 cd /opt/
 tar zxvf mha4mysql-manager-0.57.tar.gz
 cd mha4mysql-manager-0.57
 perl Makefile.PL
 make && 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
 ​
 #node 元件安裝後也會在/usr/local/bin 下面會生成幾個指令碼(這些工具通常由 MHAManager 的指令碼觸發,無需人為操作)主要如下:
 save_binary_logs       #儲存和複製 master 的二進位制日誌
 apply_diff_relay_logs  #識別差異的中繼日誌事件並將其差異的事件應用於其他的 slave
 filter_mysqlbinlog     #去除不必要的 ROLLBACK 事件(MHA 已不再使用這個工具)
 purge_relay_logs       #清除中繼日誌(不會阻塞 SQL 執行緒)
 ---------------------------------------------------------------------------------------------------

1)所有伺服器上首先安裝 epel 源,之後安裝 MHA 依賴的環境:

 (2)先在所有伺服器上安裝 node 元件:

 (3)最後在 MHA manager 節點上安裝 manager 元件:

小貼士:

#manager 元件安裝後在/usr/local/bin/ 下面會生成幾個工具,主要包括以下幾個:

 #node 元件安裝後也會在/usr/local/bin/ 下面會生成幾個指令碼(這些工具通常由 MHAManager 的指令碼觸發,無需人為操作)主要如下:

2、在所有伺服器上配置無密碼認證

 ##(1)在 manager 節點上配置到所有資料庫節點的無密碼認證
 ssh-keygen -t rsa               #一路按回車鍵,生成金鑰。"-t rsa"指定金鑰的型別。
 ssh-copy-id 192.168.68.111    #將公鑰傳給所有資料庫節點,形成免密碼連線登入
 ssh-copy-id 192.168.68.112
 ssh-copy-id 192.168.68.113
 ​
 ##(2)在 mysql1 上配置到資料庫節點 mysql2 和 mysql3 的無密碼認證
 ssh-keygen -t rsa
 ssh-copy-id 192.168.68.112    #將公鑰傳給兩個從節點,形成免密碼連線登入
 ssh-copy-id 192.168.68.113
 ​
 ##(3)在 mysql2 上配置到資料庫節點 mysql1 和 mysql3 的無密碼認證
 ssh-keygen -t rsa
 ssh-copy-id 192.168.68.111
 ssh-copy-id 192.168.68.113
 ​
 ##(4)在 mysql3 上配置到資料庫節點 mysql1 和 mysql2 的無密碼認證
 ssh-keygen -t rsa
 ssh-copy-id 192.168.68.111
 ssh-copy-id 192.168.68.112

(1)在 manager 節點上配置到所有資料庫節點的無密碼認證

 (2)在 mysql1 上配置到資料庫節點 mysql2 和 mysql3 的無密碼認證

 (3)在 mysql2 上配置到資料庫節點 mysql1 和 mysql3 的無密碼認證

(4)在 mysql3 上配置到資料庫節點 mysql1 和 mysql2 的無密碼認證

3、在 manager 節點上配置 MHA

 ##(1)在 manager 節點上覆制相關指令碼到/usr/local/bin 目錄
 cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
 #拷貝後會有四個執行檔案
 ll /usr/local/bin/scripts/
 ​
 ------------ 虛線內是註釋 -------------------------------------------------------
 master_ip_failover          #自動切換時 VIP 的管理指令碼
 master_ip_online_change     #線上切換時 VIP 的管理指令碼
 power_manager               #故障發生後關閉主機的指令碼
 send_report                 #因故障切換後傳送報警的指令碼
 --------------------------------------------------------------------------------
 ​
 ​
 ##(2)複製上述的自動切換時 VIP 的管理指令碼到 /usr/local/bin 目錄,這裡使用master_ip_failover指令碼來管理 VIP 和故障切換
 cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
 ​
 ​
 ##(3)修改內容如下:(刪除原有內容,直接複製並修改vip相關引數。可在拷貝前輸入 :set paste 解決vim貼上亂序問題)
 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 = '192.168.68.100';                             #指定vip的地址
 my $brdc = '192.168.68.255';                            #指定vip的廣播地址
 my $ifdev = 'ens33';                                    #指定vip繫結的網絡卡
 my $key = '1';                                          #指定vip繫結的虛擬網絡卡序列號
 my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";   #代表此變數值為ifconfig ens33:1 192.168.68.100
 my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";    #代表此變數值為ifconfig ens33:1 192.168.68.100 down
 my $exit_code = 0;                                      #指定退出狀態碼為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";
 }
1)在 manager 節點上覆制相關指令碼到/usr/local/bin/ 目錄。

 (2)將master_ip_failover(自動切換時 VIP 的管理指令碼)複製到/usr/local/bin 目錄,這裡使用master_ip_failover指令碼來管理 VIP 和故障切換。

 3)修改/usr/local/bin/master_ip_failover 指令碼,刪除原有內容,所有內容全都重新新增。

4、 manager節點編輯配置檔案,管理 mysql 節點伺服器

建立 MHA 軟體目錄並拷貝配置檔案,這裡使用app1.cnf配置檔案來管理 mysql 節點伺服器。

 mkdir /etc/masterha
 cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/   #複製配置檔案
 ​
 vim /etc/masterha/app1.cnf   #刪除原有內容,直接複製並修改節點伺服器的IP地址
 [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
 user=mha
 password=manager
 ping_interval=1
 remote_workdir=/tmp
 repl_password=123
 repl_user=myslave
 secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.68.112 -s 192.168.68.113
 shutdown_script=""
 ssh_user=root
 user=mha
 ​
 [server1]
 hostname=192.168.68.101
 port=3306
 ​
 [server2]
 candidate_master=1
 check_repl_delay=0
 hostname=192.168.68.112
 port=3306
 ​
 [server3]
 hostname=192.168.68.113
 port=3306

 編輯配置檔案 /etc/masterha/app1.cnf

 app1.cnf配置檔案註釋:

[server default]
 manager_log=/var/log/masterha/app1/manager.log   #manager日誌
 manager_workdir=/var/log/masterha/app1        #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  #設定手動切換時候的切換指令碼
 user=mha                #設定mysql使用者,給manager授權時建立的使用者
 password=manager        #設定mysql使用者的密碼,這個密碼是前文中建立監控使用者的那個密碼
 ping_interval=1         #設定監控主庫,傳送ping包的時間間隔,預設是3秒,嘗試三次沒有迴應的時候自動進行failover
 remote_workdir=/tmp     #設定遠端mysql在發生切換時binlog的儲存位置
 repl_password=123123    #設定複製使用者的密碼(主從同步授權時建立的使用者和密碼)
 repl_user=myslave       #設定複製使用者的使用者
 report_script=/usr/local/send_report    #設定發生切換後傳送的報警的指令碼
 secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.68.111 -s 192.168.68.112          #指定檢查的從伺服器IP地址
 shutdown_script=""      #設定故障發生後關閉故障主機指令碼(該指令碼的主要作用是關閉主機防止發生腦裂,這裡沒有使用,可以使用系統自帶的power_manager )
 ssh_user=root           #設定ssh的登入使用者名稱
 ​
 [server1]                  #master
 hostname=192.168.68.111
 port=3306
 ​
 [server2]                  #slave1
 hostname=192.168.68.112
 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]                #slave2
 hostname=192.168.68.113
 port=3306

5、第一次配置需要在 Master 節點上手動開啟虛擬IP

 /sbin/ifconfig ens33:1 192.168.68.100/24 (第一次配置需要在master節點上手動開啟虛擬ip)

6、在 manager 節點上測試 ssh 無密碼認證

在 manager 節點上測試 ssh 無密碼認證,如果正常最後會輸出 successfully,如下所示。

 masterha_check_ssh -conf=/etc/masterha/app1.cnf
 ​
 ​
 Sun Jun 12 22:44:40 2022 - [debug]  Connecting via SSH from root@192.168.68.101(192.168.68.101:22) to root@192.168.72.60(192.168.72.60:22)..
 Sun Jun 12 22:44:41 2022 - [debug]   ok.
 Sun Jun 12 22:44:41 2022 - [debug]  Connecting via SSH from root@192.168.68.101(192.168.68.101:22) to root@192.168.72.80(192.168.72.80:22)..
 Sun Jun 12 22:44:42 2022 - [debug]   ok.
 Sun Jun 12 22:44:43 2022 - [debug]
 Sun Jun 12 22:44:41 2022 - [debug]  Connecting via SSH from root@192.168.68.111(192.168.68.111:22) to root@192.168.72.192(192.168.72.192:22)..
 Sun Jun 12 22:44:42 2022 - [debug]   ok.
 Sun Jun 12 22:44:42 2022 - [debug]  Connecting via SSH from root@192.168.68.111(192.168.68.111:22) to root@192.168.72.80(192.168.72.80:22)..
 Sun Jun 12 22:44:42 2022 - [debug]   ok.
 Sun Jun 12 22:44:43 2022 - [debug]
 Sun Jun 12 22:44:41 2022 - [debug]  Connecting via SSH from root@192.168.68.112(192.168.68.112:22) to root@192.168.72.192(192.168.72.192:22)..
 Sun Jun 12 22:44:42 2022 - [debug]   ok.
 Sun Jun 12 22:44:42 2022 - [debug]  Connecting via SSH from root@192.168.68.112(192.168.68.112:22) to root@192.168.72.60(192.168.72.60:22)..
 Sun Jun 12 22:44:43 2022 - [debug]   ok.
 Sun Jun 12 22:44:43 2022 - [info] All SSH connection tests passed successfully.

7、在 manager 節點上測試 mysql 主從連線情況

在 manager 節點上測試 mysql 主從連線情況,最後出現MySQL Replication Health is OK 字樣說明正常。如下所示。

 masterha_check_repl -conf=/etc/masterha/app1.cnf
 ​
 ​
 Sun Jun 12 22:47:28 2022 - [info] Slaves settings check done.
 Sun Jun 12 22:47:28 2022 - [info]
 192.168.68.101(192.168.68.101:3306) (current master)
  +--192.168.68.101(192.168.68.101:3306)
  +--192.168.68.101(192.168.68.101:3306)
 ​
 Sun Jun 12 22:47:28 2022 - [info] Checking replication health on 192.168.68.111..
 Sun Jun 12 22:47:28 2022 - [info]  ok.
 Sun Jun 12 22:47:28 2022 - [info] Checking replication health on 192.168.68.111..
 Sun Jun 12 22:47:28 2022 - [info]  ok.
 Sun Jun 12 22:47:28 2022 - [info] Checking master_ip_failover_script status:
 Sun Jun 12 22:47:28 2022 - [info]   /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.68.101 --orig_master_ip=192.168.68.101 --orig_master_port=3306
 ​
 ​
 IN SCRIPT TEST====/sbin/ifconfig ens33:1 down==/sbin/ifconfig ens33:1 192.168.68.113===
 ​
 Checking the Status of the script.. OK
 Sun Jun 12 22:47:28 2022 - [info]  OK.
 Sun Jun 12 22:47:28 2022 - [warning] shutdown_script is not defined.
 Sun Jun 12 22:47:28 2022 - [info] Got exit code 0 (Not master dead).
 ​
 MySQL Replication Health is OK.     #出現該字樣說明主從連線正常

8、在 manager 節點上啟動 MHA

 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 &
 ​
 ​
 ------------------------------以下都是註釋-----------------------------------------------------------
 ​
 --remove_dead_master_conf   #該引數代表當發生主從切換後,老的主庫的 ip 將會從配置檔案中移除。
 --manger_log                #日誌存放位置。
 --ignore_last_failover      #在預設情況下,如果 MHA 檢測到連續發生宕機,且兩次宕機間隔不足 8 小時的話,則不會進行 Failover, 之所以這樣限制是為了避免 ping-pong 效應(來回切換導致腦裂)。該引數代表忽略上次 MHA 觸發切換產生的檔案,預設情況下,MHA 發生切換後會在 app1.failover.complete 日誌檔案中記錄,下次再次切換的時候如果發現該目錄下存在該檔案將不允許觸發切換, 除非在第一次切換後刪除該檔案,為了方便,這裡設定為--ignore_last_failover。
 ​
 -------------------------------------------------------------------------------------
 ​
 ●使用&後臺執行程式:結果會輸出到終端;使用Ctrl+C傳送SIGINT訊號,程式免疫;關閉session傳送SIGHUP訊號,程式關閉。
 ●使用nohup執行程式:結果預設會輸出到nohup.out;使用Ctrl+C傳送SIGINT訊號,程式關閉;關閉session傳送SIGHUP訊號,程式免疫。
 ●使用nohup和&配合來啟動程式 nohup ./test &:同時免疫SIGINT和SIGHUP訊號。
 ​
 -------------------------------------------------------------------------------------

9、在 manager 節點上檢視 MHA 狀態 和 MHA 日誌,可以看到 master的地址

 #檢視 MHA 狀態,可以看到當前的 master 是 Mysql1 節點。
 masterha_check_status --conf=/etc/masterha/app1.cnf
 ​
 #檢視 MHA 日誌,也可以看到當前的 master 是 192.168.68.101
 cat /var/log/masterha/app1/manager.log | grep "current master"

10、在Mysql1上檢視 VIP 地址 192.168.68.100 是否存在

檢視 Mysql1 的 VIP 地址 192.168.68.100 是否存在,這個 VIP 地址不會因為 manager 節點停止 MHA 服務而消失。

 ifconfig
 ​
 #若要關閉 manager 服務,可以使用如下命令。
 masterha_stop --conf=/etc/masterha/app1.cnf
 #或者可以直接採用 kill 程序 ID 的方式關閉。

3.3 故障模擬

在Mysql1上停止mysql服務,MHA 會自動修改 app1.cnf 檔案內容,將宕機的 mysql1 節點刪除。 mysql2 會自動接管 VIP,成為新的master。

 ##(1)在 Master 節點 Mysql1 上停止mysql服務
 systemctl stop mysqld
 或
 pkill -9 mysql
 ​
 ##(2)在 manager 節點上監控觀察日誌記錄
 tail -f /var/log/masterha/app1/manager.log
 ​
 Master 192.168.72.192(192.168.68.113:3306) is down!  #監控到master宕機
 ​
 Selected 192.168.72.60(192.168.68.111:3306) as a new master.  #選舉mysql2成功新的master
 ​
 ​
 ##(3)正常自動切換一次後,MHA 程序會退出。MHA 會自動修改 app1.cnf 檔案內容,將宕機的 mysql1 節點刪除。
 vim /etc/masterha/app1.cnf   #檢視manager節點的配置檔案
 ​
 ##(4)檢視 mysql2 是否接管 VIP
 ifconfig
 ​
 ​
 ------------------------故障切換備選主庫的演算法------------------------
 ​
 故障切換備選主庫的演算法:
 1.一般判斷從庫的是從(position/GTID)判斷優劣,資料有差異,最接近於master的slave,成為備選主。
 ​
 2.資料一致的情況下,按照配置檔案順序,選擇備選主庫。
 ​
 3.設定有權重(candidate_master=1),按照權重強制指定備選主。
 ​
 (1)預設情況下如果一個slave落後master 100M的relay logs的話,即使有權重,也會失效。
 ​
 (2)如果 check_repl_delay=0 的話,即使落後很多日誌,也強制選擇其為備選主。

1)在 Master 節點 Mysql1 上停止mysql服務:

 

 (2)在 manager 節點上監控觀察日誌記錄,manager選舉了mysql2作為新的主伺服器:

 (3)檢視manager節點的配置檔案。MHA 會自動修改 app1.cnf 檔案內容,將宕機的 mysql1 節點刪除。

 (4) mysql2 已接管 VIP

3.4 故障修復

1)修復mysql1(即修復原來的主節點)

 systemctl restart mysqld

2)修復主從資料

 #在新的主庫伺服器 Mysql2 中檢視二進位制日誌檔案和同步點
 show master status;
 +-------------------+----------+--------------+------------------+      
 | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |     
 +-------------------+----------+--------------+------------------+       
 | master-bin.000002 |     1745 |              |                  |                   
 +-------------------+----------+--------------+------------------+   
 ​
 ​
 #在原主庫伺服器 mysql1 執行同步操作,同步現在主庫中的資料
 change master to master_host='192.168.68.101',master_user='myslave',master_password='123123',master_log_file='master-bin.000002',master_log_pos=1745;
 ​
 start slave;

在新的主庫伺服器 Mysql2 檢視二進位制日誌檔案和同步點:

 在原主庫伺服器 mysql1 執行同步操作,同步現在主庫中的資料:

3)在 manager 節點上修改配置檔案app1.cnf

重新把三臺mysql節點伺服器這個記錄新增進去,因為它檢測到主節點失效時候會自動刪除主節點。

將mysql1新增為新的候選master。

 vi /etc/masterha/app1.cnf
 ......
 secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.72.192 -s 192.168.72.80
 ......
 [server1]
 hostname=192.168.68.111
 port=3306
 ​
 [server2]
 candidate_master=1
 check_repl_delay=0
 hostname=192.168.68.112
 port=3306
 ​
 [server3]
 hostname=192.168.68.113
 port=3306

4)在 manager 節點上啟動 MHA

 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