1. 查看MHA配置文件
[root@db03 ~]# cat /etc/mha/app1.cnf
[server default]
manager_log=/var/log/mha/app1/manager
manager_workdir=/var/log/mha/app1
master_binlog_dir=/data/binlog
user=mha
password=mha
ping_interval=2
repl_password=123
repl_user=repl
ssh_user=root
[server1]
hostname=10.0.0.51
port=3306
[server2]
hostname=10.0.0.52
port=3306
[server3]
hostname=10.0.0.53
port=3306
2. 檢查主從狀態(tài)
[root@db03 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
MySQL Replication Health is OK.
3.開啟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 &
1. 主從復(fù)制架構(gòu)演變介紹
1.1 基本結(jié)構(gòu)
(1)一主一從
(2)一主多從
(3)多級(jí)主從
(4)雙主
(5)循環(huán)復(fù)制
1.2 高級(jí)應(yīng)用架構(gòu)演變
1.2.1 高性能架構(gòu)
(1) 讀寫分離架構(gòu)(讀性能較高)
代碼級(jí)別
MySQL proxy (Atlas,mysql router,proxySQL(percona),maxscale)析校、
amoeba(taobao)
xx-dbproxy等构罗。
(2) 分布式架構(gòu)(讀寫性能都提高):
分庫分表——cobar--->TDDL(頭都大了),DRDS
Mycat--->DBLE自主研發(fā)等铜涉。
NewSQL-->TiDB
1.2.2 高可用架構(gòu)
(3)單活:MMM架構(gòu)——mysql-mmm(google)
(4)單活:MHA架構(gòu)——mysql-master-ha(日本DeNa),T-MHA
(5)多活:MGR ——5.7 新特性 MySQL Group replication(5.7.17) --->Innodb Cluster
(6)多活:MariaDB Galera Cluster架構(gòu),(PXC)Percona XtraDB Cluster、MySQL Cluster(Oracle rac)架構(gòu)
2. 高可用MHA ☆☆☆☆☆
2.1 架構(gòu)工作原理
1. MHA通過腳本(masterha_master_monitor)實(shí)時(shí)監(jiān)控主庫的狀態(tài)(主機(jī),數(shù)據(jù)庫狀態(tài))
2. 監(jiān)控到主庫宕機(jī)之后,會(huì)發(fā)生自動(dòng)選主(masterha_master_switch )
(1) 權(quán)重: 參數(shù)
(2) 日志量
(3) 配置文件的順序
3. 數(shù)據(jù)補(bǔ)償
(1) 當(dāng)主庫SSH能夠連接,各個(gè)從庫會(huì)立即保存(save_binary_logs)缺失部分的日志到/var/tmp,進(jìn)行數(shù)據(jù)補(bǔ)償.
(2) 當(dāng)主庫SSH無法連接,通過腳本(apply_diff_relay_logs)自動(dòng)進(jìn)行從庫的relaylog的差異處理,進(jìn)行數(shù)據(jù)補(bǔ)償.
4. 構(gòu)建新的主從關(guān)系,并將故障節(jié)點(diǎn)移除(配置文件移除)
5. MHA主進(jìn)程完成工作后,自動(dòng)退出.
6. 應(yīng)用透明 VIP(master_ip_failover_script=/usr/local/bin/master_ip_failover)
7. 故障通知 (report_script=/usr/local/bin/send)
8. 提供額外數(shù)據(jù)補(bǔ)償?shù)氖侄?binlog server)
9. 自動(dòng)自愈,待開發(fā)....
2.2 架構(gòu)介紹:
1主2從遂唧,master:db01 slave:db02 db03 ):
MHA 高可用方案軟件構(gòu)成
Manager軟件:選擇一個(gè)從節(jié)點(diǎn)安裝
Node軟件:所有節(jié)點(diǎn)都要安裝
2.3 MHA軟件構(gòu)成
Manager工具包主要包括以下幾個(gè)工具:
masterha_manger 啟動(dòng)MHA
masterha_check_ssh 檢查MHA的SSH配置狀況
masterha_check_repl 檢查MySQL復(fù)制狀況
masterha_master_monitor 檢測master是否宕機(jī)
masterha_check_status 檢測當(dāng)前MHA運(yùn)行狀態(tài)
masterha_master_switch 控制故障轉(zhuǎn)移(自動(dòng)或者手動(dòng))
masterha_conf_host 添加或刪除配置的server信息
Node工具包主要包括以下幾個(gè)工具:
這些工具通常由MHA Manager的腳本觸發(fā)芙代,無需人為操作
save_binary_logs 保存和復(fù)制master的二進(jìn)制日志
apply_diff_relay_logs 識(shí)別差異的中繼日志事件并將其差異的事件應(yīng)用于其他的
purge_relay_logs 清除中繼日志(不會(huì)阻塞SQL線程)
2.4 MHA環(huán)境搭建
2.5 故障模擬測試
2.5.1 關(guān)閉51主庫(db01上)
[root@db01 ~]# /etc/init.d/mysqld stop
Shutting down MySQL............ SUCCESS!
2.5.2 此時(shí)主庫跳到52上(db03上查看)
2.5.3 修復(fù)主庫
[root@db01 ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!
2.5.4 修復(fù)從庫
[root@db01 ~]# mysql -e "change master to master_host='10.0.0.52',master_user='repl',master_password='123' ,MASTER_AUTO_POSITION=1;"
[root@db01 ~]# mysql -e "start slave;"
[root@db01 ~]# mysql -e "show slave status \G"|grep Running:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
2.5.5 修改配置文件(db03)
2.5.6 啟動(dòng)MHA (db03)
[root@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 &
[1] 7658
[root@db03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:7658) is running(0:PING_OK), master:10.0.0.52
2.6 Manager額外參數(shù)介紹
說明:
主庫宕機(jī)誰來接管?
1. 所有從節(jié)點(diǎn)日志都是一致的盖彭,默認(rèn)會(huì)以配置文件的順序去選擇一個(gè)新主纹烹。
2. 從節(jié)點(diǎn)日志不一致,自動(dòng)選擇最接近于主庫的從庫
3. 如果對(duì)于某節(jié)點(diǎn)設(shè)定了權(quán)重(candidate_master=1)召边,權(quán)重節(jié)點(diǎn)會(huì)優(yōu)先選擇铺呵。
但是此節(jié)點(diǎn)日志量落后主庫100M日志的話,也不會(huì)被選擇隧熙∑遥可以配合check_repl_delay=0,關(guān)閉日志量的檢查贞盯,強(qiáng)制選擇候選節(jié)點(diǎn)音念。
(1) ping_interval=1
#設(shè)置監(jiān)控主庫,發(fā)送ping包的時(shí)間間隔躏敢,嘗試三次沒有回應(yīng)的時(shí)候自動(dòng)進(jìn)行failover
(2) candidate_master=1
#設(shè)置為候選master闷愤,如果設(shè)置該參數(shù)以后,發(fā)生主從切換以后將會(huì)將此從庫提升為主庫件余,即使這個(gè)主庫不是集群中事件最新的slave
(3)check_repl_delay=0
#默認(rèn)情況下如果一個(gè)slave落后master 100M的relay logs的話讥脐,
MHA將不會(huì)選擇該slave作為一個(gè)新的master遭居,因?yàn)閷?duì)于這個(gè)slave的恢復(fù)需要花費(fèi)很長時(shí)間,
通過設(shè)置check_repl_delay=0,MHA觸發(fā)切換在選擇一個(gè)新的master的時(shí)候?qū)?huì)忽略復(fù)制延時(shí)旬渠,
這個(gè)參數(shù)對(duì)于設(shè)置了candidate_master=1的主機(jī)非常有用魏滚,因?yàn)檫@個(gè)候選主在切換的過程中一定是新的master
2.7 MHA的vip功能(db03)
2.7.1 拷貝master_ip_failover腳本到/user/local/bin下
[root@db03 /server/tools]# ll
total 9936
-rw-r--r-- 1 root root 4963681 Jun 28 11:35 Atlas-2.2.1.el6.x86_64.rpm
-rw-r--r-- 1 root root 20904 Jun 28 11:36 email_2019-最新.zip
-rw-r--r-- 1 root root 2248 Jun 28 11:36 master_ip_failover.txt
-rw-r--r-- 1 root root 5051108 Aug 19 18:16 MHA-2019-6.28.zip
-rw-r--r-- 1 root root 87119 Jun 28 11:34 mha4mysql-manager-0.56-0.el6.noarch.rpm
-rw-r--r-- 1 root root 36326 Jun 28 11:35 mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db03 /server/tools]# cp master_ip_failover.txt /usr/local/bin/master_ip_failover
[root@db03 /server/tools]# cd /usr/local/bin/
[root@db03 /usr/local/bin]# yum install -y dos2unix
[root@db03 /usr/local/bin]# dos2unix master_ip_failover
dos2unix: converting file master_ip_failover to Unix format ...
[root@db03 /usr/local/bin]# chmod +x master_ip_failover
2.7.2 更改manager配置文件:
vim /etc/mha/app1.cnf
添加此行:
master_ip_failover_script=/usr/local/bin/master_ip_failover
2.7.3 修改文件內(nèi)容:
[root@db03 /usr/local/bin]# 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";
vim /usr/local/bin/master_ip_failover
2.7.4 主庫上,手工生成第一個(gè)vip地址(db02)
手工在主庫上綁定vip坟漱,注意一定要和配置文件中的ethN一致鼠次,我的是eth0:1(1是key指定的值)
ifconfig eth0:1 10.0.0.55/24
2.7.8 重啟mha
masterha_stop --conf=/etc/mha/app1.cnf
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 &
2.7.9 郵件提醒
(1) 添加配置選項(xiàng)
vi /etc/mha/app1.cnf
report_script=/usr/local/bin/send
(2) 拷貝腳本
[root@db03 /server/tools]# cp email/* /usr/local/bin
(3) 添加執(zhí)行權(quán)限
[root@db03 /usr/local/bin]# chmod +x ./*
[root@db03 /usr/local/bin]# ll
total 92
-rwxr-xr-x 1 root root 2166 Aug 20 15:44 master_ip_failover
-rwxr-xr-x 1 root root 35 Aug 20 15:52 send
-rwxr-xr-x 1 root root 80213 Aug 20 15:52 sendEmail
-rwxr-xr-x 1 root root 204 Aug 20 15:53 testpl
(4) 修改腳本
[root@db03 /usr/local/bin]# vim testpl
#!/bin/bash
/usr/local/bin/sendEmail -o tls=no -f lichenxing0430@163.com -t 245684979@qq.com -s smt
p.163.com:25 -xu lichenxing0430 -xp <passworld> -u "MHA Waring" -m "YOUR MHA MAY BE F
AILOVER ,發(fā)送成功芋齿!" &>/tmp/sendmail.log
(5)停止MHA
masterha_stop --conf=/etc/mha/app1.cnf
(6)開啟MHA
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 &
(7) 發(fā)送郵件
[root@db03 /usr/local/bin]# ./testpl
(8) 關(guān)閉主庫,看警告郵件(db02)
[root@db02 ~]# pkill mysqld
(9) 查看vip并收到郵件
(10) 故障恢復(fù)(db03)
mysql -e "change master to master_host='10.0.0.51',master_user='repl',master_password='123' ,MASTER_AUTO_POSITION=1;"
mysql -e "start slave;"
mysql -e "show slave status \G"|grep "Running:"
3. binlog server(db03)
3.1 添加配置文件
vim /etc/mha/app1.cnf
[binlog1]
no_master=1
hostname=10.0.0.53
master_binlog_dir=/data/mysql/binlog
3.2 創(chuàng)建必要目錄
mkdir -p /data/mysql/binlog
chown -R mysql.mysql /data/*
3.3 拉取主庫binlog日志
cd /data/mysql/binlog
mysqlbinlog -R --host=10.0.0.51 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &
3.4 重啟MHA
masterha_stop --conf=/etc/mha/app1.cnf
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 &
故障處理
主庫宕機(jī)柠衅,binlogserver 自動(dòng)停掉,manager 也會(huì)自動(dòng)停止绍刮。
處理思路:
1想暗、重新獲取新主庫的binlog到binlogserver中
2、重新配置文件binlog server信息
3栅炒、最后再啟動(dòng)MHA3.管理員在高可用架構(gòu)維護(hù)的職責(zé)
- 搭建:MHA+VIP+SendReport+BinlogServer
- 監(jiān)控及故障處理
- 高可用架構(gòu)的優(yōu)化
核心是:盡可能降低主從的延時(shí)掂摔,讓MHA花在數(shù)據(jù)補(bǔ)償上的時(shí)間盡量減少。
5.7 版本赢赊,開啟GTID模式乙漓,開啟從庫SQL并發(fā)復(fù)制。