1. 程式人生 > 其它 >MySQL-17-MHA高可用技術

MySQL-17-MHA高可用技術




環境準備

環境準備

至少準備3臺獨立的虛擬機器資料庫例項,建議4臺

這裡實驗只准備3臺,需要配置好 基於GTID的主從複製,具體怎麼配置可以參看前面的章節
db01 10.0.0.51		主庫
db02 10.0.0.52		從庫
db03 10.0.0.53		從庫 +  MHA  +  額外的資料補償服務(binlog-server)

基礎架構


軟體包

MHA軟體包




MHA 架構軟體結構說明

1 節點規劃
manager端: db03
node端: db01,db02,db03
1主2從,獨立資料庫例項


2 MHA軟體的構成(perl語言)
2.1 Manager工具包主要包括以下幾個工具:
mha4mysql-manager-0.56-0.el6.noarch.rpm

masterha_manager            啟動MHA 
masterha_check_ssh          檢查MHA的SSH配置狀況 
masterha_check_repl         檢查MySQL複製狀況 
masterha_master_monitor     檢測master是否宕機 
masterha_check_status       檢測當前MHA執行狀態 
masterha_master_switch      控制故障轉移(自動或者手動)
masterha_conf_host          新增或刪除配置的server資訊
masterha_stop               停止MHA服務

2.2 Node工具包主要包括以下幾個工具:
mha4mysql-node-0.56-0.el6.noarch.rpm
這些工具通常由MHA Manager的指令碼觸發,無需人為操作
save_binary_logs            儲存和複製master的二進位制日誌 
apply_diff_relay_logs       識別差異的中繼日誌事件並將其差異的事件應用於其他的
purge_relay_logs            清除中繼日誌(不會阻塞SQL執行緒)




MHA FailOver過程詳解

1 什麼是Failover?
故障轉移.
主庫宕機一直到業務恢復正常的處理過程(自動)

2 Failover讓你實現怎麼做?
	(1) 快速監控到主庫宕機
	(2) 選擇新主
	(3) 資料補償
	(4) 解除從庫身份
	(5) 剩餘從庫和新主庫構建主從關係
	(6) 應用透明
	(7) 故障節點自愈(待開發...)
	(8) 故障提醒

3 MHA的Failover如何實現?
	從啟動--->故障--->轉移--->業務恢復
	(1) MHA通過masterha_manger指令碼啟動MHA的功能.
	(2) 在manager啟動之前,會自動檢查ssh互信(masterha_check_ssh)和主從狀態(masterha_check_repl)
	(3) MHA-manager 通過 masterha_master_monitor指令碼(每隔ping_interval秒)
	(4) masterha_master_monitor探測主庫3次無心跳之後,就認為主庫宕機了.
	(5) 進行選主過程
		  演算法一: 
		    讀取配置檔案中是否有強制選主的引數?
		    candidate_master=1
		    check_repl_delay=0
		  演算法二:
		    自動判斷所有從庫的日誌量.將最接近主庫資料的從庫作為新主.
		  演算法三:
		    按照配置檔案先後順序的進行選新主.
		
		  擴充套件一下:
		  candidate_master=1的應用場景?
		    1 MHA+KeepAlive VIP(早期MHA架構)
		    2 多地多中心
	(6) 資料補償 
		  判斷主庫SSH的連通性
		  情況一: SSH能連
		    呼叫 save_binary_logs指令碼,立即儲存缺失部分的binlog到各個從節點,恢復
		  情況二: SSH無法連線
		    呼叫 apply_diff_relay_logs 指令碼,計算從庫的relaylog的差異,恢復到2號從庫
		  (6.1) 提供額外的資料補償的功能  @@
	(7)  解除從庫身份
	(8)  剩餘從庫和新主庫構建主從關係
	(9)  應用透明  @@
	(10) 故障節點自愈(待開發...)@@
	(11) 故障提醒@@



搭建

配置關鍵程式軟連線,這一步一定要配置,據說是程式裡面寫死了路徑。在3臺伺服器上都要執行

ln -s /application/mysql/bin/mysqlbinlog    /usr/bin/mysqlbinlog
ln -s /application/mysql/bin/mysql          /usr/bin/mysql

配置互信(這裡的思維是在db01建立鎖和鑰匙,然後把鎖和鑰匙發給db02,db03,這樣大家的鎖和鑰匙都一樣了)

db01:
rm -rf /root/.ssh 
ssh-keygen
cd /root/.ssh 
mv id_rsa.pub authorized_keys
scp  -r  /root/.ssh  10.0.0.52:/root 
scp  -r  /root/.ssh  10.0.0.53:/root 

各節點驗證:為了以後ssh的時候不再需要輸入yes,命令一條一條的執行,不要3條一起執行
db01:
ssh 10.0.0.51 date
ssh 10.0.0.52 date
ssh 10.0.0.53 date
db02:
ssh 10.0.0.51 date
ssh 10.0.0.52 date
ssh 10.0.0.53 date
db03:
ssh 10.0.0.51 date
ssh 10.0.0.52 date
ssh 10.0.0.53 date

安裝軟體包(所有節點都要執行)

前言中的軟體包上傳到/server/tools目錄
cd /server/tools
yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

在db01主庫中建立mha需要的使用者(db01)

grant all privileges on *.* to mha@'10.0.0.%' identified by 'mha';
flush privileges;

Manager軟體安裝(db03)

yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm

配置檔案準備(db03)

建立配置檔案目錄
mkdir -p /etc/mha
建立日誌目錄
mkdir -p /var/log/mha/app1
編輯mha配置檔案
cat > /etc/mha/app1.cnf <<EOF
[server default]
manager_log=/var/log/mha/app1/manager        
manager_workdir=/var/log/mha/app1            
master_binlog_dir=/data/binlog       
user=mha						        # mha管理的賬號                                   
password=mha                 			        # mha管理的密碼              
ping_interval=2					        # 檢測主機是否存活的間隔,2s。預設會檢查3次,那麼就是6秒
repl_password=123					# 主從複製使用者的密碼
repl_user=repl						# 主從複製使用者的賬號
ssh_user=root                   			        # ssh連線用的賬號密碼            
[server1]                                   
hostname=10.0.0.51
port=3306                                  
[server2]            
hostname=10.0.0.52
port=3306
[server3]
hostname=10.0.0.53
port=3306
EOF

狀態檢查(db03)

SSH連線檢查
[root@db03 tools]# masterha_check_ssh  --conf=/etc/mha/app1.cnf 
Thu Dec 19 16:54:27 2019 - [debug]   ok.
Thu Dec 19 16:54:28 2019 - [info] All SSH connection tests passed successfully.


MySQL複製檢查
[root@db03 tools]# masterha_check_repl  --conf=/etc/mha/app1.cnf 
Thu Dec 19 16:55:02 2019 - [info]  ok.
Thu Dec 19 16:55:02 2019 - [warning] master_ip_failover_script is not defined.
Thu Dec 19 16:55:02 2019 - [warning] shutdown_script is not defined.
Thu Dec 19 16:55:02 2019 - [info] Got exit code 0 (Not master dead).
MySQL Replication Health is OK.

開啟MHA(db03)

nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover  < /dev/null> /var/log/mha/app1/manager.log 2>&1 &

檢視MHA狀態

[root@db03 tools]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:8535) is running(0:PING_OK), master:10.0.0.51

MHA 應用透明(vip)

db03:複製指令碼到指定的目錄(perl指令碼)
cp /server/tools/master_ip_failover.txt /usr/local/bin/master_ip_failover

# 修改一下eth1改為eth0
vim /usr/local/bin/master_ip_failover
my $vip = '10.0.0.55/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";

# 轉換一下格式(注意:一定要加執行許可權,不然可能導致MHA啟動不了)
[root@db03 bin]# yum install -y  dos2unix
[root@db03 bin]# dos2unix /usr/local/bin/master_ip_failover
[root@db03 bin]# chmod +x /usr/local/bin/master_ip_failover 

# 修改MHA的配置檔案,把vip的功能新增進去
[root@db03 bin]# vim /etc/mha/app1.cnf 
[server default]
master_ip_failover_script=/usr/local/bin/master_ip_failover


db01:手工新增vip
[root@db01 ~]# ifconfig eth0:1 10.0.0.55/24


db03 : 重啟MHA
[root@db03 bin]# masterha_stop --conf=/etc/mha/app1.cnf
[root@db03 bin]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover  < /dev/null> /var/log/mha/app1/manager.log 2>&1 &


db03:檢查一下狀態
[root@db03 bin]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:14410) is running(0:PING_OK), master:10.0.0.51

MHA 故障提醒(db03)

# 拷貝傳送郵件的指令碼到對應的目錄,這裡建議不要修改目錄
[root@db03 tools]# cp /server/tools/send /usr/local/bin/
[root@db03 tools]# cp /server/tools/sendEmail /usr/local/bin/
[root@db03 tools]# cp /server/tools/testpl /usr/local/bin/
[root@db03 ~]# cd /usr/local/bin/
[root@db03 tools]# chmod +x send
[root@db03 tools]# chmod +x sendEmail 
[root@db03 tools]# chmod +x testpl 

# 檢視測試指令碼
[root@db03 bin]# cat testpl 
#!/bin/bash
/usr/local/bin/sendEmail -o tls=no -f [email protected] -t [email protected] -s smtp.163.com:25 -xu 13142209450 -xp abc123 -u "MHA Waring" -m "YOUR MHA MAY BE FAILOVER" &>/tmp/sendmail.log

# 測試郵件傳送是否成功
[root@db03 bin]# ./testpl 

# MHA配置檔案新增郵件傳送功能,注意這裡是send不是testpl檔案
[root@db03 bin]# vim /etc/mha/app1.cnf 
[server default]
report_script=/usr/local/bin/send

# 重啟MHA:
[root@db03 bin]# masterha_stop --conf=/etc/mha/app1.cnf
[root@db03 bin]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover  < /dev/null> /var/log/mha/app1/manager.log 2>&1 &

額外的資料補償(binlog_server)

找一臺額外的機器,必須要有5.6以上的版本,支援gtid並開啟,我們直接用的第二個slave(db03)
vim /etc/mha/app1.cnf 
[binlog1]
no_master=1								# 不參與選主
hostname=10.0.0.53
master_binlog_dir=/data/mysql/binlog

建立必要目錄(注意,如果是MHA和db03在一臺伺服器是話,那麼資料庫binlog日誌的目錄和這裡的日誌目錄一定不能一樣!)
mkdir -p /data/mysql/binlog
chown -R mysql.mysql /data/*

拉取主庫binlog日誌
cd /data/mysql/binlog     ----->必須進入到自己建立好的目錄

注意:拉取日誌的起點,需要按照目前主庫正在使用的binlog為起點.
mysqlbinlog  -R --host=10.0.0.51 --user=mha --password=mha --raw  --stop-never mysql-bin.000001 &

重啟MHA-manager 
[root@db03 bin]# masterha_stop --conf=/etc/mha/app1.cnf
[root@db03 bin]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover  < /dev/null> /var/log/mha/app1/manager.log 2>&1 &



故障模擬及故障處理

1 宕掉 db01 資料庫
[root@db01 ~]# systemctl stop mysqld
  停止以後,MHA伺服器會自動做出以下反應:
	  1.managerha_master管理程序自動退出
	  2.傳送郵件到指定的郵箱
	  3.選舉出新的主庫,即VIP漂移到另外一臺資料庫
	  4.修改配置,剔除db01



2 恢復故障
2.1 啟動故障節點(db01)
[root@db01 ~]# systemctl start mysqld

2.2 恢復1主2從
db03:
[root@db03 bin]# grep "CHANGE MASTER TO"  /var/log/mha/app1/manager
Thu Jul 18 18:31:54 2019 - [info]  All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='10.0.0.52', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='xxx';

db01:
db01 [(none)]>CHANGE MASTER TO MASTER_HOST='10.0.0.52', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';
db01 [(none)]>start slave;


2.3 恢復配置檔案(db03)
[root@db03 binlog]# vim /etc/mha/app1.cnf
[server1]
hostname=10.0.0.51
port=3306


2.4 啟動MHA 
[root@db03 bin]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover  < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
[1] 16543
[root@db03 bin]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:16543) is running(0:PING_OK), master:10.0.0.52

2.5 恢復binlogserver 
cd /data/mysql/binlog    
rm -rf /data/mysql/binlog/*

注意:拉取日誌的起點,需要按照目前主庫正在使用的binlog為起點.
mysqlbinlog  -R --host=10.0.0.52 --user=mha --password=mha --raw  --stop-never mysql-bin.000001 &

轉載請註明出處喲~ https://www.cnblogs.com/lichengguo