DBA(MySQL)學(xué)習(xí)-MHA高可用技術(shù)

1.準(zhǔn)備環(huán)境 看上節(jié)

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

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

1.2 配置各節(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

1.3 安裝軟件

下載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

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

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

每臺機(jī)器都修改一下hosts文件
[root@db01 ~]# cat /etc/hosts
127.0.0.1    localhost localhost.localdomain localhost4 localhost4.localdomain4
::1          localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.51 db01
[root@db02 ~]# cat /etc/hosts
127.0.0.1    localhost localhost.localdomain localhost4 localhost4.localdomain4
::1          localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.52 db02
[root@db03 ~]# cat /etc/hosts
127.0.0.1    localhost localhost.localdomain localhost4 localhost4.localdomain4
::1          localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.53 db03

1.5 狀態(tài)檢測(db03)

[root@db03 ~]# masterha_check_ssh  --conf=/etc/mha/app1.cnf 
Fri Jun 28 12:23:49 2019 - [debug]   ok.
Fri Jun 28 12:23:50 2019 - [info] All SSH connection tests passed successfully.  <<看這里
[root@db03 ~]# masterha_check_ssh  --conf=/etc/mha/app1.cnf 
MySQL Replication Health is OK.

1.6 開啟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.7 查看MHA狀態(tài)

[root@db03 ~]#  masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:9068) 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    |
+---------------+-------+

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

2.1 基礎(chǔ)主從()

1主1從
1主多從
多級主從
以上架構(gòu)大部分中小型企業(yè)中還在使用柑蛇,還有一部分用了RDS
============================================================
雙主
中型企業(yè),在高可用(谷歌MMM),分布式架構(gòu)(Mycat,DBLE)
============================================================
環(huán)狀
多主1從
幾乎是沒人用
============================================================

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

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

2.3 高可用架構(gòu)

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

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個9到4個9
(3)多活系統(tǒng)
PXC(不收費)扣蜻、MGC(不收費)逆巍、InnoDB Cluster(8.0,不收費)莽使、
Oracle RAC(收費)锐极、MySQL Cluster(收費)、Sysbase Cluster芳肌、DB2 Cluster

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

Mycat 1.65版
DBLE

2.5 NewSQL

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

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

3.1 架構(gòu)圖

image.png

image.png
Manager
Node
一主兩從(三臺機(jī)器)

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

(1)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運(yùn)行狀態(tài) 
masterha_master_switch      控制故障轉(zhuǎn)移(自動或者手動)
masterha_conf_host          添加或刪除配置的server信息
(2)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 安裝過程說明

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

4.2.1 manager啟動

(1)讀取--conf=/etc/mha/app1.cnf
(2)獲取到MHA相關(guān)的信息(1主2從)
(3)調(diào)用masterha_check_ssh腳本,使用ssh_user=root進(jìn)行互信檢查,進(jìn)行互信檢查
(4)調(diào)用masterha_check_repl 檢查主從復(fù)制情況
(5)manager啟動成功
(6)通過masterha_master_monitor 以ping_interval=2 為間隔持續(xù)健康主句狀態(tài)
網(wǎng)絡(luò),主機(jī)亿笤,數(shù)據(jù)庫恢復(fù)(mha)
(7)當(dāng)manager監(jiān)控到master宕機(jī)
(8)開始選主過程
     算法1:判斷是否有《強(qiáng)制主》參數(shù)
     算法2:判斷兩個從庫誰更新
     算法3:按照配置文件的書寫順序(從上往下)
(9)判斷主庫的SSH的連通性
     能:S1和S2立即保存(save_binary_logs)缺失部分的binlog到本地
     不能:
          在傳統(tǒng)模式下:調(diào)用apply_diff_relay_logs計算S1和S2的relay-log的差異需要通
[v內(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和S2構(gòu)建新的主從關(guān)系
(12)移除配置文件中故障節(jié)點
(13)manager工作完成,自殺净薛。
額外的功能:
(1)提供Binlog server
(2)應(yīng)用透明(VIP)
(3)實時通知管理員(send_report)
(4)自愈系統(tǒng)(待開發(fā))

5. 故障模擬及處理

停主庫db01

/etc/init.d/mysqld.server stop
image.png

修復(fù)主庫

(1)啟動主庫
/etc/init.d/mysqld.server start
(2)恢復(fù)主從結(jié)構(gòu)
[root@db03 ~]# grep -i 'change master to ' /var/log/mha/app1/manager
Fri Jun 28 18:17:00 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';
可以從db03從庫中找到'change master to'結(jié)構(gòu)

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;
(3)修改配置文件(db03)
[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
password=mha
ping_interval=2
repl_password=123
repl_user=repl
ssh_user=root
user=mha
[server1]
hostname=10.0.0.51
port=3306

[server2]
hostname=10.0.0.52
port=3306

[server3]
hostname=10.0.0.53
port=3306
(4)啟動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 &
查看狀態(tài)[root@db03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf

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日志的話士聪,也不會被選擇锦援。可以配合check_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功能

參數(shù)

master_ip_failover_script=/usr/local/bin/master_ip_failover
注意:/usr/local/bin/master_ip_failover,必須事先準(zhǔn)備好

修改腳本內(nèi)容

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";

更改manager配置文件:

vim /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      
注意:如果添加錯了可通過 ifconfig eth0:1 down這個命令刪除掉
[root@db02 ~]# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.52  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::20c:29ff:fea9:8a04  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a9:8a:04  txqueuelen 1000  (Ethernet)
        RX packets 17984  bytes 6555546 (6.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8794  bytes 1004168 (980.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.55  netmask 255.255.255.0  broadcast 10.0.0.255
        ether 00:0c:29:a9:8a:04  txqueuelen 1000  (Ethernet)

重啟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 &

郵件提醒

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)境
看日志文件:
[root@db03 /usr/local/bin]# grep -i 'change master to ' /var/log/mha/app1/manager
Fri Jun 28 20:25:47 2019 - [info]  All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='10.0.0.51', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='xxx';

start slave ;
3.恢復(fù)manager
3.1 修好的故障節(jié)點配置信息轧抗,加入到配置文件
[server1]
hostname=10.0.0.51
port=3306
3.2 啟動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 &
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瞬测,隨后出現(xiàn)的幾起案子横媚,更是在濱河造成了極大的恐慌,老刑警劉巖月趟,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灯蝴,死亡現(xiàn)場離奇詭異,居然都是意外死亡孝宗,警方通過查閱死者的電腦和手機(jī)穷躁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碳褒,“玉大人折砸,你說我怎么就攤上這事看疗。” “怎么了睦授?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵两芳,是天一觀的道長。 經(jīng)常有香客問我去枷,道長怖辆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任删顶,我火速辦了婚禮竖螃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逗余。我一直安慰自己特咆,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布录粱。 她就那樣靜靜地躺著腻格,像睡著了一般。 火紅的嫁衣襯著肌膚如雪啥繁。 梳的紋絲不亂的頭發(fā)上菜职,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音旗闽,去河邊找鬼酬核。 笑死,一個胖子當(dāng)著我的面吹牛适室,可吹牛的內(nèi)容都是我干的嫡意。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼亭病,長吁一口氣:“原來是場噩夢啊……” “哼鹅很!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起罪帖,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤促煮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后整袁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體菠齿,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年坐昙,在試婚紗的時候發(fā)現(xiàn)自己被綠了绳匀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖疾棵,靈堂內(nèi)的尸體忽然破棺而出戈钢,到底是詐尸還是另有隱情,我是刑警寧澤是尔,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布殉了,位于F島的核電站,受9級特大地震影響拟枚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恩溅,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一隔箍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧脚乡,春花似錦蜒滩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至窒典,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稽莉,已是汗流浹背瀑志。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留污秆,地道東北人劈猪。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像良拼,于是被迫代替她去往敵國和親战得。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容