1. 程式人生 > 其它 >angr_ctf——從0學習angr(二):狀態操作和約束求解

angr_ctf——從0學習angr(二):狀態操作和約束求解

一、案例概述

傳統的MySQL主從架構存在的問題
● 單點故障

為了解決單點故障所帶來的的影響,我們可以使用MHA高可用架構。

二、案例前置知識點

1. MHA概述

● MHA(Master High Availability)是一套優秀的MySQL高可用環境下故障切換和主從複製的軟體。
● MHA的出現就是解決MySQL單點的問題。
● MySQL故障切換過程中,MHA能做到0-30秒內自動完成故障切換。
● MHA能在最大程度上保證資料的一致性,以達到真正意義上的高可用。

2. MHA的組成


(1)MHA Manager(管理節點)

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

(2)MHA Node(資料節點)

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

3. MHA特點

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

4. MHA切換過程

(1)從宕機崩潰的master儲存二進位制日誌事件(binlog events);
(2)識別含有最新更新的slave;
(3)應用差異的中繼日誌(relay log)到其他 slave;
(4)應用從master儲存的二進位制日誌事件(binlog events);
(5)提升一個slave為新master;
(6)使其他的slave連線新的master進行復制。

三、案例環境

1. 實驗思路

  1. MHA架構
    ● 資料庫安裝
    ● 一主兩從
    ● MHA搭建
  2. 故障模擬
    ● 主庫失效
    ● 備選主庫成為主庫
    ● 原故障主庫恢復重新加入到MHA成為從庫

2. 伺服器、主機名、系統、IP以及軟體版本配置

伺服器 主機名 系統 IP 軟體及版本
MHA manager節點伺服器 manager CentOS7.4(64位) 192.168.159.14 安裝MHA node和manager元件
Master節點伺服器 mysql1 CentOS7.4(64位) 192.168.159.11 安裝mysql5.7、MHA node元件
Slave1節點伺服器 mysql2 CentOS7.4(64位) 192.168.159.12 安裝mysql5.7、MHA node元件
Slave2節點伺服器 mysql3 CentOS7.4(64位) 192.168.1559.13 安裝mysql5.7、MHA node元件

3. 各伺服器環境配置

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

四、案例實施

1. 搭建MySQL MHA

(1)Master、Slave1、Slave2節點上安裝mysql5.7

(2)修改各伺服器節點的主機名

Master為mysql1,Slave1為mysql2,Slave2為mysql2,MHA為manager

[root@localhost opt]# hostnamectl set-hostname mysql1

(3)修改Master、Slave1、Slave2節點的MySQL主配置檔案

Master(192.168.159.11)

[root@mysql1 ~]# vim /etc/my.cnf
 
##mysqld項下新增引數
[mysqld]
server-id = 1
log_bin = master-bin
log-slave-updates = true
 
[root@mysql1 ~]# systemctl restart mysqld

Slave1(192.168.159.12)server-id = 2,Slave2(192.168.159.13)server-id = 3其餘一樣

[root@mysql2 ~]# vim /etc/my.cnf
 
##mysqld項下新增引數
[mysqld]
server-id = 2
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
 
[root@mysql2 ~]# systemctl restart mysqld

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

[root@mysql1 ~]# ln -s /usr/local/mysql/bin/{mysql,mysqlbinlog} /usr/sbin/

(5)配置mysql一主兩從

①所有資料庫節點進行mysql授權

Master(192.168.159.11)slave1和slave2

[root@mysql1 ~]# mysql -u root -p123456

mysql> grant replication slave on *.* to 'myslave'@'192.168.159.%' identified by '123456';##從資料庫同步使用
mysql> grant all privileges on *.* to 'mha'@'192.168.159.%' identified by '123456';##manager使用
mysql> grant all privileges on *.* to 'mha'@'mysql1' identified by '123456';##防止從庫通過主機名連線不上主庫
mysql> grant all privileges on *.* to 'mha'@'mysql2' identified by '123456';
mysql> grant all privileges on *.* to 'mha'@'mysql3' identified by '123456';

flush privileges;
②在Master節點檢視二進位制檔案和同步點
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |     1747 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
③在Slave1、Slave2節點執行同步操作

Slave1(192.168.159.12)Slave2(192.168.159.13)

mysql> change master to
master_host='192.168.159.11',
master_user='myslave',
master_password='123456',
master_log_file='master-bin.000001',
master_log_pos=1747;

mysql> start slave;
④在Slave1、Slave2節點檢視資料同步結果

Slave1(192.168.159.12)Slave2(192.168.159.13)一樣的就放一次程式碼

mysql> show slave status\G;

確保IO和SQL執行緒都是Yes,代表同步正常。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

⑤兩個從庫必須設定為只讀模式

Slave1(192.168.159.12)Slave2(192.168.159.13)

mysql> set global read_only=1;
⑥插入資料測試資料庫同步

在Master主庫插入一條資料,測試是否同步
Master(192.168.159.11)

mysql> show databases;			##檢視資料庫
mysql> create database test;	##新建test資料庫
mysql> create table test.test(id int,name char(20));	##新建表
mysql> insert into test.test values(1,'master1');		##新增表內容
mysql> select * from test.test;							##查看錶
+------+---------+
| id   | name    |
+------+---------+
|    1 | master1 |
+------+---------+
1 row in set (0.00 sec)

Slave1(192.168.159.12),Slave2(192.168.159.13)

mysql> select * from test.test;

(6)安裝MHA軟體

①所有伺服器上都安裝MHA依賴的環境,首先安裝epel源
[root@mysql1 ~]# yum install epel-release --nogpgcheck -y
[root@mysql1 ~]# yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

②安裝MHA軟體包,必須在所有伺服器上先安裝node元件

對於每個作業系統版本不一樣,這裡CentOS7.4必須選擇0.57版本。
在所有伺服器上必須先安裝node元件,最後在MHA-manager節點上安裝manager元件,因為manager依賴node元件。
這裡統一將安裝包上傳到/opt目錄中。

[root@mysql1 ~]# cd /opt
##傳入安裝包mha4mysql-node-0.57.tar.gz
[root@mysql1 opt]# tar zxvf mha4mysql-node-0.57.tar.gz
[root@mysql1 opt]# cd mha4mysql-node-0.57/
[root@mysql1 mha4mysql-node-0.57]# perl Makefile.PL
[root@mysql1 mha4mysql-node-0.57]# make && make install
③在MHA manager節點上安裝manager元件(先安裝node元件)

MHA manager(192.168.159.14)

[root@manager mha4mysql-node-0.57]# cd /opt
##傳入安裝包mha4mysql-manager-0.57.tar.gz
[root@manager opt]# tar zxvf mha4mysql-manager-0.57.tar.gz 
[root@manager opt]# cd mha4mysql-manager-0.57
[root@manager mha4mysql-manager-0.57]# perl Makefile.PL
[root@manager mha4mysql-manager-0.57]# make && make install
④node元件工具

node元件安裝後會在/usr/local/bin下面生成幾個指令碼檔案(這些工具通常由MHA Manager的指令碼觸發,無需人為操作)主要如下:
● save_binary_logs
儲存和複製master的二進位制日誌
● apply_diff_relay_logs
識別差異的中繼日誌事件並將其差異的事件應用於其他的slave
● filter_mysqlbinlog
去除不必要的ROLLBACK事件(MHA已不再使用這個工具)
● purge_relay_logs
清除中繼日誌(不會阻塞SQL執行緒)

⑤manager元件工具

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

(7)在所有伺服器上配置無密碼認證

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

MHA manager(192.168.159.14)

[root@manager mha4mysql-manager-0.57]# ssh-keygen -t rsa
#一直按回車
[root@manager mha4mysql-manager-0.57]# ssh-copy-id 192.168.159.11
#輸入yes,輸入IP對應的登入密碼
[root@manager mha4mysql-manager-0.57]# ssh-copy-id 192.168.159.12
[root@manager mha4mysql-manager-0.57]# ssh-copy-id 192.168.159.13
②在mysql1上配置到資料庫節點mysql2和mysql3的無密碼認證

Master(192.168.159.11)

[root@mysql1 mha4mysql-manager-0.57]# ssh-keygen -t rsa
[root@mysql1 mha4mysql-manager-0.57]# ssh-copy-id 192.168.159.12
[root@mysql1 mha4mysql-manager-0.57]# ssh-copy-id 192.168.159.13
③在mysql2上配置到資料庫節點mysql1和mysql3的無密碼認證

Slave1(192.168.159.12)

[root@mysql2 mha4mysql-manager-0.57]# ssh-keygen -t rsa
[root@mysql2 mha4mysql-manager-0.57]# ssh-copy-id 192.168.159.11
[root@mysql2 mha4mysql-manager-0.57]# ssh-copy-id 192.168.159.13
④在mysql3上配置到資料庫節點mysql1和mysql2的無密碼認證

Slave2(192.168.159.13)

[root@mysql3 mha4mysql-manager-0.57]# ssh-keygen -t rsa
[root@mysql3 mha4mysql-manager-0.57]# ssh-copy-id 192.168.159.11
[root@mysql3 mha4mysql-manager-0.57]# ssh-copy-id 192.168.159.12

(8)在manager節點上配置MHA

①在manager節點上覆制相關指令碼到/usr/local/bin目錄

MHA manager(192.168.159.14)

[root@manager mha4mysql-manager-0.57]# cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
[root@manager mha4mysql-manager-0.57]# cd samples/scripts/
[root@manager scripts]# ll
總用量 32
-rwxr-xr-x 1 1001 1001  3648 5月  31 2015 master_ip_failover			#自動切換時VIP的管理指令碼
-rwxr-xr-x 1 1001 1001  9870 5月  31 2015 master_ip_online_change	#線上切換時VIP的管理指令碼
-rwxr-xr-x 1 1001 1001 11867 5月  31 2015 power_manager				#故障發生後關閉主機的指令碼
-rwxr-xr-x 1 1001 1001  1360 5月  31 2015 send_report				#因故障切換後傳送報警的指令碼
②複製上述的自動切換時VIP的管理指令碼到/usr/local/bin目錄

這裡使用master_ip_failover指令碼來管理VIP和故障切換
MHA manager(192.168.159.14)

[root@manager scripts]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
③修改內容如下(修改VIP相關引數):

MHA manager(192.168.159.14)

[root@manager scripts]# 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.159.200';								#指定vip的地址
my $brdc = '192.168.159.255';								#指定vip的廣播地址
my $ifdev = 'ens33';										#指定vip繫結的網絡卡
my $key = '1';												#指定vip繫結的虛擬網絡卡序列號
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";		#代表此變數值為ifconfig ens33:1 192.168.159.200
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";		#代表此變數值為ifconfig ens33:1 192.168.159.200 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";
##################################################################################

清除全部內容貼上

#!/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.159.200';
my $brdc = '192.168.159.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";
###################################################################################
④建立MHA軟體目錄並拷貝配置檔案

這裡使用app1.cnf配置檔案來管理mysql節點伺服器
MHA manager(192.168.159.14)

[root@manager scripts]# mkdir /etc/masterha
[root@manager scripts]# cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha
[root@manager scripts]# vim /etc/masterha/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的路徑一致,以便MHAzhaodao 
master_ip_failover_script=/usr/local/bin/master_ip_failover
##設定自動failover時候的切換指令碼,也就是上一步修改的指令碼
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
##設定手動切換時候的切換指令碼
password=123456
##設定mysql中root使用者的密碼,這個密碼是前文中建立監控使用者的那個密碼
ping_interval=1
##設定監控主庫,傳送ping包的時間間隔,預設是3秒,嘗試三次沒有迴應的時候自動進行failover
remote_workdir=/tmp
##設定遠端mysql在發生切換時binlog的儲存位置
repl_password=123456
##設定複製使用者的密碼
repl_user=myslave
##設定複製使用者的使用者
report_script=/usr/local/send_report
##設定發生切換後傳送的報警的指令碼
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.159.12 -s 192.168.159.13
##指定檢查的從伺服器IP地址
shutdown_script=""
##設定故障發生後關閉故障主機指令碼(該指令碼的主要作用是關閉主機防止發生腦裂,這裡沒有指定)
ssh_user=root
##設定ssh的登入使用者名稱
user=mha
##設定監控使用者
 
[server1]
hostname=192.168.159.11
port=3306
 
[server2]
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
hostname=192.168.159.12
port=3306
 
[server3]
hostname=192.168.159.13
port=3306
[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=123456
ping_interval=1
remote_workdir=/tmp
repl_password=123456
repl_user=myslave
report_script=/usr/local/send_report
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.159.12 -s 192.168.159.13
shutdown_script=""
ssh_user=root
user=mha
 
[server1]
hostname=192.168.159.11
port=3306
 
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.159.12
port=3306

[server3]
hostname=192.168.159.13
port=3306

(9)第一次配置需要在master節點上手動開啟虛擬IP

Master(192.168.159.11)

[root@mysql1 mha4mysql-node-0.57]# /sbin/ifconfig ens33:1 192.168.159.200/24

(10)在manager節點上測試ssh無密碼認證

如果正常最後會輸出successfully
MHA manager(192.168.159.14)

[root@manager scripts]# masterha_check_ssh -conf=/etc/masterha/app1.cnf

(11)在manager節點上測試mysql主從連線情況

最後出現MySQL Replication Health is OK 字樣說明正常。
MHA manager(192.168.159.14)

出現報錯

[root@manager scripts]# masterha_check_repl -conf=/etc/masterha/app1.cnf
......
Wed Sep 28 15:03:11 2022 - [info] Checking replication health on 192.168.159.12..
Wed Sep 28 15:03:11 2022 - [info]  ok.
Wed Sep 28 15:03:11 2022 - [info] Checking replication health on 192.168.159.13..
Wed Sep 28 15:03:11 2022 - [info]  ok.
Wed Sep 28 15:03:11 2022 - [info] Checking master_ip_failover_script status:
Wed Sep 28 15:03:11 2022 - [info]   /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.159.11 --orig_master_ip=192.168.159.11 --orig_master_port=3306 
Wed Sep 28 15:03:11 2022 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations. Can't exec "/usr/local/bin/master_ip_failover": 許可權不夠 at /usr/local/share/perl5/MHA/ManagerUtil.pm line 68.
Wed Sep 28 15:03:11 2022 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Wed Sep 28 15:03:11 2022 - [info] Got exit code 1 (Not master dead).

MySQL Replication Health is NOT OK!
Wed Sep 28 15:03:11 2022 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln229]  Failed to get master_ip_failover_script status with return code 1:0.
Wed Sep 28 15:03:11 2022 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations.  at /usr/local/bin/masterha_check_repl line 48.
Wed Sep 28 15:03:11 2022 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Wed Sep 28 15:03:11 2022 - [info] Got exit code 1 (Not master dead).

MySQL Replication Health is NOT OK!

/usr/local/bin/master_ip_failover許可權不夠,先給與許可權

報229,427,525錯誤是master_ip_failover配置錯誤

如果實驗中還出現報錯,刪除slave節點伺服器中mysql主配置檔案中的“default-character-set=utf8”後重啟mysqld服務。

還有幾點注意的,免密,軟連結等

(12)在manager節點上啟動MHA

MHA manager(192.168.159.14)

[root@manager scripts]# 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] 9469

● --remove_dead_master_conf:該引數代表當發生主從切換後,老的主庫的 ip 將會從配置檔案中移除。
● --manager_log:日誌存放位置。
● --ignore_last_failover:在預設情況下,如果 MHA 檢測到連續發生宕機,且兩次宕機間隔不足 8 小時的話,則不會進行 Failover, 之所以這樣限制是為了避免 ping-pong 效應。該引數代表忽略上次 MHA 觸發切換產生的檔案,預設情況下,MHA 發生切換後會在日誌記目錄,也就是上面設定的日誌app1.failover.complete檔案,下次再次切換的時候如果發現該目錄下存在該檔案將不允許觸發切換,除非在第一次切換後收到刪除該檔案,為了方便,這裡設定為--ignore_last_failover。

(13)檢視MHA狀態,可以看到當前的master是MySQL1節點

MHA manager(192.168.159.14)

[root@manager scripts]# masterha_check_status --conf=/etc/masterha/app1.cnf

(14)檢視MHA日誌,也可以看到當前的master

[root@manager bin]# cat /var/log/masterha/app1/manager.log | grep "current master"

(15)檢視MySQL1的 VIP地址192.168.159.200是否存在,這個VIP地址不會因為manager節點停止MHA服務而消失

Master(192.168.159.11)

[root@mysql1 mha4mysql-node-0.57]# ifconfig

(16)關閉manager服務

若要關閉 manager 服務,可以使用如下命令。
masterha_stop --conf=/etc/masterha/app1.cnf

[root@manager scripts]# masterha_stop --conf=/etc/masterha/app1.cnf

或者可以直接採用 kill 程序 ID 的方式關閉。

[root@manager scripts]# 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 &
##啟動manager
[root@manager scripts]# kill 10387
##殺死程序
[root@manager scripts]# masterha_check_status --conf=/etc/masterha/app1.cnf
##檢視狀態為已停止

2. 故障模擬與修復

(1)故障模擬

①在manager節點上監控觀察日誌記錄

MHA manager(192.168.159.14)

[root@manager scripts]# tail -f /var/log/masterha/app1/manager.log
②在Master節點mysql1上停止mysql服務

Master(192.168.159.11)

[root@mysql1 mha4mysql-node-0.57]# systemctl stop mysqld
或
[root@mysql1 mha4mysql-node-0.57]# pkill -9 mysql
③MHA快速調整新Master為mysql2節點伺服器

MHA manager(192.168.159.14)

④檢視manager的app1.cnf檔案

MHA manager(192.168.159.14)

正常自動切換一次後,MHA 程序會退出。HMA 會自動修改 app1.cnf 檔案內容,將宕機的 mysql1 節點刪除。

⑤檢視mysql2是否接管VIP

Slave1(192.168.159.12)

[root@mysql2 mha4mysql-node-0.57]# ifconfig

稱為新master後成功接管VIP

(2)故障切換備選主庫的演算法

  1. 一般判斷從庫的是從(position/GTID)判斷優劣,資料有差異,最接近於master的slave,成為備選主。
  2. 資料一致的情況下,按照配置檔案順序,選擇備選主庫。
  3. 設定有權重(candidate_master=1),按照權重強制指定備選主。
    ● 預設情況下如果一個slave落後master 100M的relay logs的話,即使有權重,也會失效。
    ● 如果check_repl_delay=0的話,即使落後很多日誌,也強制選擇其為備選主。

(3)故障修復步驟

①修復mysql

Master(192.168.159.11)

[root@mysql1 mha4mysql-node-0.57]# systemctl restart mysqld
②修復主從

在現主庫伺服器mysql2檢視二進位制檔案和同步點
Slave1(192.168.159.12)

[root@mysql2 mha4mysql-node-0.57]# mysql -uroot -p123456
mysql> show master status;

在原主庫伺服器mysql1執行同步操作
Master(192.168.159.11)

[root@mysql1 mha4mysql-node-0.57]# mysql -u root -p123456

mysql> change master to
master_host='192.168.159.11',
master_user='myslave',
master_password='123456',
master_log_file='master-bin.000001',
master_log_pos=1747;

mysql> start slave;
③在manager節點上修改配置檔案app1.cnf

將mysql1的記錄添加回去,因為測試故障時已被自動刪除
MHA manager(192.168.159.14)

[root@manager scripts]# vim /etc/masterha/app1.cnf
④在manager節點上啟動MHA

MHA manager(192.168.159.14)

[root@manager scripts]# 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] 12884

[root@manager scripts]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:12884) is running(0:PING_OK), master:192.168.159.11

此時master仍是mysql2節點,如若需要讓mysql1重新成為master,停止mysql2節點的mysql服務即可。
mysql1獲得mater地位以及VIP後,重新啟動mysql2的mysql服務,並新增進slave叢集中。