DBA之路 12_MySQL_主從復(fù)制進(jìn)階及MHA

上節(jié)回顧

主從復(fù)制:

1.介紹
    依賴于binlog的“實時”備份的一個多節(jié)點架構(gòu)
2.前提
    2臺機(jī)器/兩個實例
    主庫開啟二進(jìn)制日志
    server_id
    復(fù)制用戶
    數(shù)據(jù)預(yù)同步
    change master to
    start slave
3.名詞
    文件
        主庫:binlog
        從庫:relaylog    
              relay-log.info
              master.info
    線程
        主庫:
              binlog_dump_thread
        從庫:
              IO_thread
              SQL_thread
              purge-relay-log線程自動清理relay.log


4.原理
5.故障分析
show slave status\G

8.過濾復(fù)制

主庫(了解):
binlog_do_db
binlog_ignore_db
從庫:
Replicate_Do_DB: 
Replicate_Ignore_DB: 

Replicate_Do_Table: 
Replicate_Ignore_Table: 
Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 

例子:

只需要復(fù)制xyz庫的數(shù)據(jù)到從庫
vim /data/3309/my,cnf

replicate_do_db=xyz
白名單
systemctl restart myslqd3309

show slave status\G
Replicate_Do_DB: xyz

9.半同步復(fù)制

和傳統(tǒng)復(fù)制的區(qū)別:
是一個插件形式提供的功能
主庫:ack_receiver
從庫:ack_send

主庫的ack_receiver線程,只有接收到從庫發(fā)來的ack確認(rèn),主庫事務(wù)才能commit成功
從庫acksend只有等relaylog落地才能發(fā)送adc
主庫只會等10秒鐘,如果ACK還沒有收到,會自動替換為異步復(fù)制

10GTID復(fù)制(MHA環(huán)境準(zhǔn)備)

10.0作用

group commit,MTS都是依賴于GTID

10.1重點參數(shù)

gtid-mode=on
enforce-gtid-consistency=true
log_slave-updates=1----強(qiáng)制刷新從庫二進(jìn)制日志:1.MHA2.級聯(lián)復(fù)制的中間庫

10.2清理環(huán)境

10.3配置文件(后文4.1中有詳細(xì)步驟)

2.主從復(fù)制架構(gòu)演變

2.1基礎(chǔ)主從(不依賴第三方)

一主一從
一主多從
級聯(lián)主從
-------->以上架構(gòu)大部分中小型存在,還有一部分用了RDS
多主一從
-------->中型企業(yè),在MHA(MMM),分布式架構(gòu)中會出現(xiàn)。
雙主結(jié)構(gòu)
環(huán)狀復(fù)制
-------->幾乎沒人用

2.2高性能架構(gòu)---讀寫分離架構(gòu)

mysql-proxy---->0.8停了
360------------>二次開發(fā) Atlas Atlas-sharding 2016年
MySQL---------->mysql-router****
Percona--------->ProxySQL
Mariadb--------->Maxscale

2.3高可用架構(gòu)

2.3.1企業(yè)高可用標(biāo)準(zhǔn)(全年無故障率)

99%                   
99.9%
99.99%
99.999%
99.9999%

2.3.2高可用架構(gòu)產(chǎn)品

(1)負(fù)載均衡
     LVS,F5,Nginx有一定的高可用能力
(2)主備系統(tǒng)(單活)
    KA,HA(roseHA,RHCS),PowerHA,mc_sg,MHA,MMM
(3)多活系統(tǒng)
    PXC(不收費),MGC(不收費),MYSQL Cluster(收費),InnoDB Cluster(8.0,不收費),Oracle RAC(收費),Sysbase Cluster,DB2 Cluster[c              
    

2.4分布式架構(gòu)(現(xiàn)在的趨勢)

Mycat 1.65
DBLE

2.5NewSQL

RDBMS+ NoSQL+分布式
sp
TiDB
巨杉
polarDB
OceanBase

3.MHA架構(gòu)模型

3.1架構(gòu)圖

3.2軟件結(jié)構(gòu)

Manager
Manager工具包主要包括以下幾個工具:
masterha_manger             啟動MHA 
masterha_check_ssh          檢查MHA的SSH配置狀況 
masterha_check_repl         檢查MySQL復(fù)制狀況 
masterha_master_monitor     檢測master是否宕機(jī) 
masterha_check_status       檢測當(dāng)前MHA運行狀態(tài) 
masterha_master_switch      控制故障轉(zhuǎn)移(自動或者手動)
masterha_conf_host          添加或刪除配置的server信息

Node
Node工具包主要包括以下幾個工具:
這些工具通常由MHA Manager的腳本觸發(fā),無需人為操作
save_binary_logs            保存和復(fù)制master的二進(jìn)制日志 
apply_diff_relay_logs       識別差異的中繼日志事件并將其差異的事件應(yīng)用于其他的
purge_relay_logs            清除中繼日志(不會阻塞SQL線程)

4.MHA工作過程

4.1安裝過程說明

配置關(guān)鍵程序軟連接

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

配置各節(jié)點互信

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 

各節(jié)點驗證

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

安裝軟件

下載mha軟件
mha官網(wǎng):https://code.google.com/archive/p/mysql-master-ha/
github下載地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads

所有節(jié)點安裝Node軟件依賴包

yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

在db01主庫中創(chuàng)建mha需要的用戶

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

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

配置文件準(zhǔn)備(db03)

創(chuàng)建配置文件目錄
 mkdir -p /etc/mha
創(chuàng)建日志目錄
 mkdir -p /var/log/mha/app1
編輯mha配置文件
vim /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

狀態(tài)檢查

互信檢查

masterha_check_ssh  --conf=/etc/mha/app1.cnf 

主從狀態(tài)檢查

[root@db03 ~]# masterha_check_ssh  --conf=/etc/mha/app1.cnf 
[root@db03 ~]# masterha_check_repl  --conf=/etc/mha/app1.cnf 

開啟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狀態(tài)

[root@db03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:4719) is running(0:PING_OK), master:10.0.0.51
[root@db03 ~]# mysql -umha -pmha -h 10.0.0.51 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 51    |
+---------------+-------+
[root@db03 ~]# mysql -umha -pmha -h 10.0.0.52 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 52    |
+---------------+-------+
[root@db03 ~]# mysql -umha -pmha -h 10.0.0.53 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 53    |
+---------------+-------+

4.2軟件工作過程(宕機(jī))

4.2.1manager啟動

(1)讀取--conf=/etc/mha/app1.cnf配置文件
(2)獲取到node相關(guān)的信息(1主2從)
(3)調(diào)用masterha_check_ssh使用ssh_user=root用戶進(jìn)行互信檢測
(4)調(diào)用masterha_check_repl檢查主從復(fù)制情況
(5)manager啟動成功
(6)通過masterha__master_monitor以ping_interval=2為間隔持續(xù)監(jiān)控主庫的狀態(tài)
    網(wǎng)絡(luò),主機(jī),數(shù)據(jù)庫狀態(tài)(mha用戶監(jiān)控狀態(tài))。
(7)當(dāng)manager監(jiān)控到master宕機(jī)。
(8)開始選主過程
      算法一:判斷是否有“強(qiáng)制主”參數(shù)
      算法二:判斷兩個從庫誰更新
      算法三:按照配置文件順序
(9)判斷主庫SSH的連通性
      能:S1和S2會立刻保存(save_binary_logs)缺失部分的binlog到本地
      不能:
          在傳統(tǒng)模式下:調(diào)用apply_diff_relay_logs計算S1和S2的relay-log的差異
          需要通過內(nèi)容進(jìn)行比較復(fù)雜的對比
          在GTID模式下:調(diào)用apply_diff_relay_logs計算S1和S2的relay-log的差異
          只需對比GTID號碼即可,效率較高。
      最后進(jìn)行數(shù)據(jù)補(bǔ)償
(10)解除S1從庫身份
(11)S2和S1構(gòu)建新的主從關(guān)系
(12)移除配置文件中故障節(jié)點
(13)manager工作完成,退出程序(一次性的高可用)

額外的功能

(1)提供了binlog server實時在異地保存二進(jìn)制日志
(2)應(yīng)用透明(VIP)
(3)實時通知管理員(send_report)
(4)自愈(待開發(fā))6

模擬故障

1.停主庫DB01

systemctl stop mysqld
觀察manager日志tail -f /var/log/mha/app1/manager
末尾必須顯示successfully,才算正常切換成功。

2.修復(fù)故障庫

[root@db01 ~]# /etc/init.d/mysqld start

3.恢復(fù)主從結(jié)構(gòu)

查看日志:
[root@db03 ~]# grep -i 'change master to ' /var/log/mha/app1/manager
Fri Jun 28 18:21:05 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='123';

db01:
CHANGE MASTER TO 
MASTER_HOST='10.0.0.52',
MASTER_PORT=3306, 
MASTER_AUTO_POSITION=1, 
MASTER_USER='repl', 
MASTER_PASSWORD='123';
start slave ;

4.修改配置文件(db03)

vim /etc/mha/app1.cnf
[server1]
hostname=10.0.0.51
port=3306

5.啟動MHA(db3)

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 &

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

6. Manager額外參數(shù)介紹

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

(2) candidate_master=1
#設(shè)置為候選master,如果設(shè)置該參數(shù)以后,發(fā)生主從切換以后將會將此從庫提升為主庫,即使這個主庫不是集群中事件最新的slave

(3)check_repl_delay=0
#默認(rèn)情況下如果一個slave落后master 100M的relay logs的話,
MHA將不會選擇該slave作為一個新的master,因為對于這個slave的恢復(fù)需要花費很長時間,通過設(shè)置check_repl_delay=0,MHA觸發(fā)切換在選擇一個新的master的時候?qū)雎詮?fù)制延時,這個參數(shù)對于設(shè)置了candidate_master=1的主機(jī)非常有用,因為這個候選主在切換的過程中一定是新的master

7.MHA的vip功能(db3)

參數(shù)
master_ip_failover_script=/usr/local/bin/master_ip_failover
注意:/usr/local/bin/master_ip_failover,必須事先準(zhǔn)備好
修改腳本內(nèi)容
vi  /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";
chmod +x /usr/local/bin/master_ip_failover

更改manager配置文件
vi /etc/mha/app1.cnf
添加:
master_ip_failover_script=/usr/local/bin/master_ip_failover
注意:
[root@db03 ~]# dos2unix /usr/local/bin/master_ip_failover 
dos2unix: converting file /usr/local/bin/master_ip_failover to Unix format ...
[root@db03 ~]# chmod +x /usr/local/bin/master_ip_failover 
主庫上,手工生成第一個vip地址
手工在主庫上綁定vip,注意一定要和配置文件中的ethN一致,我的是eth0:1(1是key指定的值)
ifconfig eth0:1 10.0.0.55/24
重啟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 &

8.郵件提醒

1. 參數(shù):
report_script=/usr/local/bin/send
2. 準(zhǔn)備郵件腳本
send_report

(1)準(zhǔn)備發(fā)郵件的腳本(上傳 email_2019-最新.zip中的腳本,到/usr/local/bin/中)
(2)將準(zhǔn)備好的腳本添加到mha配置文件中,讓其調(diào)用

3. 修改manager配置文件,調(diào)用郵件腳本
vi /etc/mha/app1.cnf
report_script=/usr/local/bin/send

(3)停止MHA
masterha_stop --conf=/etc/mha/app1.cnf
(4)開啟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 &
        
(5) 關(guān)閉主庫,看警告郵件  

故障修復(fù)

1. 恢復(fù)故障節(jié)點

(1)實例宕掉
/etc/init.d/mysqld start 
(2)主機(jī)損壞,有可能數(shù)據(jù)也損壞了
備份并恢復(fù)故障節(jié)點。

2.恢復(fù)主從環(huán)境

看日志文件:
CHANGE MASTER TO MASTER_HOST='10.0.0.52', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';
start slave ;

3.恢復(fù)manager

3.1修好的故障節(jié)點配置信息,加入到配置文件
[server1]
hostname=10.0.0.51
port=3306
啟動manager
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(db03)
參數(shù):
binlogserver配置:
找一臺額外的機(jī)器,必須要有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
創(chuàng)建必要目錄
mkdir -p /data/mysql/binlog
chown -R mysql.mysql /data/*
修改完成后,將主庫binlog拉過來(從000001開始拉,之后的binlog會自動按順序過來)
拉取主庫binlog日志
cd /data/mysql/binlog     -----》必須進(jìn)入到自己創(chuàng)建好的目錄
mysqlbinlog  -R --host=10.0.0.52 --user=mha --password=mha --raw  --stop-never mysql-bin.000001 &
注意:
拉取日志的起點,需要按照目前從庫的已經(jīng)獲取到的二進(jìn)制日志點為起點

重啟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 自動停掉,manager 也會自動停止。
處理思路:
1、重新獲取新主庫的binlog到binlogserver中
2、重新配置文件binlog server信息
3、最后再啟動MHA

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

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