1. 程式人生 > 其它 >Mysql資料庫—MHA高可用配置及故障切換

Mysql資料庫—MHA高可用配置及故障切換

目錄

一、MHA概述

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

二、MHA的組成

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

三、MHA的特點

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

四、搭建MHA

4.1 伺服器準備

主機 ip 功能 所需元件
manager 192.168.80.14 manager管理節點 manager元件,node元件
master 192.168.80.11 mysql5.7主資料庫 node元件
slave1 192.168.80.12 mysql5.7從資料庫 node元件
slave2 192.168.80.13 mysql5.7從資料庫 node元件

4.2 思路

1.先使用三臺mysql伺服器,配置一主兩從,實現主從複製
2.安裝MHA軟體
3.配置免密登入和MHA的高可用
4.模擬故障並進行檢視

4.3 三個節點安裝mysql5.7並修改主機名

#資料庫前面都裝過了,這邊就不具體安裝了

#關閉防火牆和安全功能
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

#修改主機名
hostnamectl set-hostname Mysql1(master)
hostnamectl set-hostname Mysql2(slave1)
hostnamectl set-hostname Mysql3(slave2)

4.4 修改三個節點的Mysql主配置檔案

#Master節點
vim /etc/my.cnf
[mysqld]
server-id = 1
log_bin = master-bin
log-slave-updates = true

systemctl restart mysqld

#Slave1、Slave2 節點
vim /etc/my.cnf
server-id = 2/3						#三臺伺服器的 server-id 不能一樣
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index

systemctl restart mysqld



4.5 在三個節點上都建立兩個軟連結

ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/

4.6 配置mysql一主兩從

4.6.1 三個節點進行mysql授權

mysql -uroot -p264196
grant replication slave on *.* to 'myslave'@'192.168.80.%' identified by '264196';		    #從資料庫同步使用
grant all privileges on *.* to 'mha'@'192.168.80.%' identified by 'manager';		#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;

4.6.2 master節點檢視二進位制檔案和同步點

show master status;

4.6.3 slave1、slave2節點執行同步操作

change master to master_host='192.168.80.11',master_user='myslave',master_password='264196',master_log_file='master-bin.000003',master_log_pos=1745; 

start slave;      #開啟從節點同步

4.6.4 Slave1、Slave2節點檢視資料同步結果

show slave status\G	
	
#確保IO和SQL執行緒都是 Yes,代表同步正常。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

4.6.5 兩個從節點必須設定為只讀模式

set global read_only=1;

4.6.6 插入資料測試資料庫同步


4.7 安裝MHA軟體

4.7.1 所有伺服器(4臺)都安裝MHA環境

systemctl stop firewalld
setenforce 0

#安裝epel源
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

4.7.2 所有伺服器安裝MHA軟體包

#在所有伺服器上必須先安裝node元件
對於每個作業系統版本不一樣,這裡 CentOS7.4 必須選擇 0.57 版本
cd /opt
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install

4.7.3 MHA manager節點上安裝manager元件

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_manager 			啟動manager的指令碼
masterha_check_status 		檢查當前MHA執行狀態
masterha_master_monitor 	檢查master是否宕機
masterha_master_switch 		控制故障轉移(自動或者手動)
masterha_conf_host 			新增或刪除配置的server資訊
masterha_stop  				關閉manager


#node 安裝後也會在/usr/local/bin目錄下生成幾個指令碼,需要進行檢查,主要包括以下
save_binary_logs			#儲存和複製master的二進位制日誌
apply_diff_relay_logs 		#識別差異的中繼日誌事件,並將其差異的事件應用於其他的slave
filter_mysqlbinlog			#去除不必要的ROLLBACK回滾事件(MHA 已不適用這個工具)
purge_relay_logs			#清除中繼日誌(不會阻塞SQL執行緒)


4.8 所有伺服器上配置無密碼認證

#一、在mannager上配置到所有資料庫節點的無密碼認證
#一路回車
ssh-keygen -t rsa
ssh-copy-id 192.168.80.11
ssh-copy-id 192.168.80.12
ssh-copy-id 192.168.80.13

#二、在master上配置到slave1和salve2的無密碼認證
ssh-keygen -t rsa
ssh-copy-id 192.168.80.12
ssh-copy-id 192.168.80.13

#三、在slave1上配置到master和salve2的無密碼認證
ssh-keygen -t rsa
ssh-copy-id 192.168.80.11
ssh-copy-id 192.168.80.13

#四、在slave2上配置到master和salve1的無密碼認證
ssh-keygen -t rsa
ssh-copy-id 192.168.80.11
ssh-copy-id 192.168.80.12




4.9 manager節點上配置MHA

1、在MHA節點上覆制相關指令碼到/usr/local/bin目錄
cp -ra /root/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.複製上述的master_ip_failover(自動切換時VIP管理的指令碼)到/usr/local/bin目錄 這裡使用指令碼管理VIP
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
3.修改master_ip_failover內容(刪除原有內容,直接複製並修改vip相關引數
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.80.200';			    #浮動IP
my $brdc = '192.168.80.255';			#廣播地址
my $ifdev = 'ens33';					#使用的網絡卡為ens33
my $key = '1';							#虛擬介面
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";							#使用ifoconfig命令將其啟動,同時設定浮動地址
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";							#可以使用ifconfig命令將其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";
}
4.建立MHA軟體目錄並拷貝配置檔案
mkdir /etc/masterha
cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
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
user=mha					
ping_interval=1
remote_workdir=/tmp
repl_password=264196
repl_user=myslave		
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.80.12-s 192.168.80.13
shutdown_script=""
ssh_user=root			

[server1]
hostname=192.168.80.11
port=3306

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

[server3]
hostname=192.168.80.13
port=3306

---------------------------------------------
說明:
#manager日誌
manager_log=/var/log/masterha/app1/manager.log

#manager工作目錄
manager_workdir=/var/log/masterha/app1

#master儲存binlog的位置,這裡的路徑要於master裡配置的binlog的路徑一致,以便MHA能找到
master_binlog_dir=/usr/local/mysql/data

#設定自動failover時候切換指令碼,也就是上一個配置的指令碼
master_ip_failover_script=/usr/local/bin/master_ip_failover

#設定手動切換時候的切換指令碼
master_ip_online_change_script=/usr/local/bin/master_ip_online_change

#此處密碼為之前建立監控使用者的密碼
password=manager

#設定監控使用者
user=mha

#設定監控主庫,傳送ping包的事件間隔,預設為3秒,嘗試三次沒有迴應的時候自動進性failover
ping_interval=1

#設定遠端的MySQL在發生切換時binlog的(臨時)儲存位置
remote_workdir=/tmp

#設定複製(slaves)使用者的密碼
repl_password=264196

#設定複製使用者的賬戶
repl_user=myslave

#設定發生切換後傳送的報警的指令碼
report_script=/usr/local/send_report

#設定檢查從伺服器的指令碼
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.80.12 -s 192.168.80.13

#設定故障發生後關閉故障主機指令碼
shutdown_script=""

#設定ssh的登入使用者名稱
ssh_user=root

[server2]
#設定候選master,如果設定了此引數,發生主從切換後,會將此庫提升為主庫
candidate_master=1
#支援複製的檢查,預設情況下如果一個slave落後master 100M的relay logs(中繼日誌)的話,
MHA將不會選擇該slave作為新的master,設定為0的話會忽略此規則
check_repl_delay=0

hostname=192.168.80.12
port=3306


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

/sbin/ifconfig ens33:1 192.168.80.200/24

4.11 manager節點上測試ssh無密碼認證

masterha_check_ssh -conf=/etc/masterha/app1.cnf
如果正常最後會輸出successfully

4.12 manager節點上測試mysql主從連線情況

masterha_check_repl -conf=/etc/masterha/app1.cnf
最後出現 MySQL Replication Health is OK字樣說明正常

4.13 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

4.14 檢視MHA狀態

masterha_check_status --conf=/etc/masterha/app1.cnf
可以看到當前的 master 是 Mysql1 節點。

4.15 檢視當前日誌資訊

cat /var/log/masterha/app1/manager.log 

4.16 檢視Mysql1的VIP地址

ifconfig
VIP地址不會因為manager節點停止MHA服務而消失

4.17 關閉manager服務

masterha_stop --conf=/etc/masterha/app1.cnf
或者可以直接採用kill程序ID的方式關閉

五、故障模擬

#在manager節點上監控觀察日誌記錄
tail -f /var/log/masterha/app1/manager.log

#在Master節點Mysql1上停止mysql服務
systemctl stop mysqld
或
pkill -9 mysql

#正常自動切換一次後,MHA程序會退出。HMA會自動修改app1.cnf檔案內容,將宕機的mysql1節點刪除。檢視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.修復mysql
systemctl restart mysqld

2.修復主從
#在現主庫伺服器 Mysql2 檢視二進位制檔案和同步點
mysql -uroot -p264196
show master status;

#在原主庫伺服器mysql1執行同步操作
change master to master_host='192.168.80.12',master_user='myslave',master_password='264196',master_log_file='master-bin.000001',master_log_pos=154;

start slave;

3.在manager節點上修改配置檔案app1.cnf(再把這個記錄新增進去,因為它檢測掉失效時候會自動消失)
vi /etc/masterha/app1.cnf
......
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.80.10 -s 192.168.80.12
......
[server1]
hostname=192.168.80.12
port=3306

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

[server3]
hostname=192.168.80.13
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 &

masterha_check_status --conf=/etc/masterha/app1.cnf