第二十一周-day90-數(shù)據(jù)庫(kù)day12-MHA高可用架構(gòu)及讀寫分離

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)(讀寫性能都提高):
分庫(kù)分表——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)控主庫(kù)的狀態(tài)(主機(jī),數(shù)據(jù)庫(kù)狀態(tài))
2. 監(jiān)控到主庫(kù)宕機(jī)之后,會(huì)發(fā)生自動(dòng)選主(masterha_master_switch )
    (1) 權(quán)重: 參數(shù)
    (2) 日志量
    (3) 配置文件的順序
3. 數(shù)據(jù)補(bǔ)償
    (1) 當(dāng)主庫(kù)SSH能夠連接,各個(gè)從庫(kù)會(huì)立即保存(save_binary_logs)缺失部分的日志到/var/tmp,進(jìn)行數(shù)據(jù)補(bǔ)償.
    (2) 當(dāng)主庫(kù)SSH無法連接,通過腳本(apply_diff_relay_logs)自動(dòng)進(jìn)行從庫(kù)的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     檢測(cè)master是否宕機(jī) 
masterha_check_status       檢測(cè)當(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)境搭建

上篇文章末尾已搭建完成 ctrl+f搜索MHA搭建


2.5 故障模擬測(cè)試

2.5.1 關(guān)閉51主庫(kù)(db01上)

[root@db01 ~]# /etc/init.d/mysqld stop
Shutting down MySQL............ SUCCESS! 

2.5.2 此時(shí)主庫(kù)跳到52上(db03上查看)


2.5.3 修復(fù)主庫(kù)

[root@db01 ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS! 

2.5.4 修復(fù)從庫(kù)

[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ù)介紹

說明:
主庫(kù)宕機(jī)誰來接管?
1. 所有從節(jié)點(diǎn)日志都是一致的,默認(rèn)會(huì)以配置文件的順序去選擇一個(gè)新主。
2. 從節(jié)點(diǎn)日志不一致,自動(dòng)選擇最接近于主庫(kù)的從庫(kù)
3. 如果對(duì)于某節(jié)點(diǎn)設(shè)定了權(quán)重(candidate_master=1),權(quán)重節(jié)點(diǎn)會(huì)優(yōu)先選擇。
但是此節(jié)點(diǎn)日志量落后主庫(kù)100M日志的話,也不會(huì)被選擇??梢耘浜蟘heck_repl_delay=0,關(guān)閉日志量的檢查,強(qiáng)制選擇候選節(jié)點(diǎn)。
(1)  ping_interval=1
#設(shè)置監(jiān)控主庫(kù),發(fā)送ping包的時(shí)間間隔,嘗試三次沒有回應(yīng)的時(shí)候自動(dòng)進(jìn)行failover

(2) candidate_master=1
#設(shè)置為候選master,如果設(shè)置該參數(shù)以后,發(fā)生主從切換以后將會(huì)將此從庫(kù)提升為主庫(kù),即使這個(gè)主庫(kù)不是集群中事件最新的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)很長(zhǎng)時(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 主庫(kù)上,手工生成第一個(gè)vip地址(db02)

手工在主庫(kù)上綁定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)閉主庫(kù),看警告郵件(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 拉取主庫(kù)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 &

故障處理
主庫(kù)宕機(jī),binlogserver 自動(dòng)停掉,manager 也會(huì)自動(dòng)停止。
處理思路:
1、重新獲取新主庫(kù)的binlog到binlogserver中
2、重新配置文件binlog server信息
3、最后再啟動(dòng)MHA

3.管理員在高可用架構(gòu)維護(hù)的職責(zé)

  1. 搭建:MHA+VIP+SendReport+BinlogServer
  2. 監(jiān)控及故障處理
  3. 高可用架構(gòu)的優(yōu)化
    核心是:盡可能降低主從的延時(shí),讓MHA花在數(shù)據(jù)補(bǔ)償上的時(shí)間盡量減少。
    5.7 版本,開啟GTID模式,開啟從庫(kù)SQL并發(fā)復(fù)制。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容