MySQL-17-MHA高可用技術
阿新 • • 發佈:2021-07-22
環境準備
環境準備
至少準備3臺獨立的虛擬機器資料庫例項,建議4臺
這裡實驗只准備3臺,需要配置好 基於GTID的主從複製,具體怎麼配置可以參看前面的章節
db01 10.0.0.51 主庫
db02 10.0.0.52 從庫
db03 10.0.0.53 從庫 + MHA + 額外的資料補償服務(binlog-server)
基礎架構
軟體包
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