第1章 MySQL高可用介紹
1.1 企業(yè)高可用評估標準
評估標準是 全年無故障率指標:
3個9 99.9% 0.1%36524*60 = 525.6min (非計劃停機時間)
4個9 99.99% 0.01% = 52.56min 互聯(lián)網(wǎng)級別
5個9 99.999% 0.001% = 5.256min 金融級別
1.2 高可用產(chǎn)品介紹
常見產(chǎn)品:
主備系統(tǒng)類:
KA+雙主結(jié)構(gòu)+自主開發(fā)的腳本(節(jié)點監(jiān)控,數(shù)據(jù)校驗,數(shù)據(jù)補償) 3個9
傳統(tǒng)高可用服務(wù)+腳本Google公司產(chǎn)品 MMM 3-4個9
Facebook公司產(chǎn)品 MHA 4個9 , Taobao產(chǎn)品 TMHA , 騰訊產(chǎn)品TDSQL MHA
多活系統(tǒng): 金融級別常用
PXC(percona), MGC(mariadb) , MySQL Cluster 5個9
MySQL產(chǎn)品InnoDB Cluster , 阿里PolarDB ,騰訊TiDB 分布式高可用
第2章 MHA基礎(chǔ)架構(gòu)搭建
準備環(huán)境 需要最少三臺MySQL服務(wù)器+GTID主從模式 每一個mysql都是一個服務(wù)節(jié)點 需要安裝node
配置關(guān)機程序的軟連接 (MHA程序內(nèi)寫死了路徑 如果不是yum安裝 需要我們做個軟連接)
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /usr/local/mysql/bin/mysql/usr/bin/mysql
- 配置個節(jié)點ssh免交戶互信 截取日志恢復(fù)免交互.
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
測試: 將yes手工輸入
db01:
[root@db01 ~/.ssh]# ssh 10.0.0.51 hostname
[root@db01 ~/.ssh]# ssh 10.0.0.52 hostname
[root@db01 ~/.ssh]# ssh 10.0.0.53 hostname
db02:
[root@db02 ~]# ssh 10.0.0.51 hostname
[root@db02 ~]# ssh 10.0.0.52 hostname
[root@db02 ~]# ssh 10.0.0.53 hostname
db03:
[root@db03 ~]# ssh 10.0.0.51 hostname
[root@db03 ~]# ssh 10.0.0.52 hostname
[root@db03 ~]# ssh 10.0.0.53 hostname
2.1 安裝軟件
下載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需要的用戶 (主從同步狀態(tài) 所有庫也會有)
grant all privileges on *.* to mha@'10.0.0.%' identified by 'mha';
- Manager軟件安裝(db03) 需要單獨占用一個服務(wù)器
yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes# 依賴包
yum install -y mha4mysql-manager-0.56-0.el6.noarch.rpm# 主體
2.2 準備配置文件
配置文件準備MHA安裝的主機
(1) 創(chuàng)建配置文件目錄
mkdir -p /etc/mha
(2) 創(chuàng)建日志目錄
mkdir -p /var/log/mha/app1
(3) 編輯mha配置文件
cat > /etc/mha/app1.cnf<<EOF
[server default]
manager_log=/var/log/mha/app1/manager # manager 工作日志
manager_workdir=/var/log/mha/app1 # 工作目錄
master_binlog_dir=/data/binlog # 主庫的binlog位置
user=mha # MHA專用管理用戶
password=mha
ping_interval=2 # 心跳檢測的時間間隔,自動檢測4次
repl_password=123 # 復(fù)制用戶
repl_user=repl
ssh_user=root # ssh的互信用戶
[server1] # 指定高可用名單
hostname=10.0.0.51
port=3306
[server2]
hostname=10.0.0.52
candidate_master=1 # 設(shè)定選主權(quán)重
port=3306
[server3]
hostname=10.0.0.53
port=3306
EOF
2.3 狀態(tài)檢查(MHA服務(wù)端)
masterha_check_ssh --conf=/etc/mha/app1.cnf # 檢查ssh連接狀態(tài)
masterha_check_repl --conf=/etc/mha/app1.cnf # 檢查repllog狀態(tài)
2.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 &
參數(shù)解釋:
--conf=/etc/mha/app1.cnf: 業(yè)務(wù)配置文件,可以管理多套MHA架構(gòu)
--remove_dead_master_conf: 自動剔除故障主節(jié)點
--ignore_last_failover : 忽略最后一次failover.
2.5 查看MHA狀態(tài)
[root@db03 ~]#masterha_check_status --conf=/etc/mha/app1.cnf
2.6 停止命令
[root@db03 ~]# masterha_stop --conf=/etc/mha/app1.cnf
2.7 軟件結(jié)構(gòu)
Manager端 :
masterha_manger # 啟動MHA
masterha_check_ssh # 檢查MHA的SSH配置狀況
masterha_check_repl # 檢查MySQL復(fù)制狀況
masterha_master_monitor # 檢測master是否宕機
masterha_check_status # 檢測當前MHA運行狀態(tài)
masterha_master_switch # 控制故障轉(zhuǎn)移(自動或者手動)
masterha_conf_host # 添加或刪除配置的server信息
Node 節(jié)點端:
這些工具通常由MHA Manager的腳本觸發(fā),無需人為操作
save_binary_logs # 保存和復(fù)制master的二進制日志
apply_diff_relay_logs # 識別差異的中繼日志事件并將其差異的事件應(yīng)用于其他的
purge_relay_logs # 清除中繼日志(不會阻塞SQL線程)
第3章 MHA的工作原理(Fail over 過程)
通過
masterha_manger將MHA的manager進行啟動監(jiān)控: 通過
masterha_master_monitor監(jiān)控主從復(fù)制的主庫
利用ping_interval(參數(shù))秒探測一次主庫的狀態(tài),一共探測4次,無心跳認為主庫宕機選主: 通過三種模式 順序
1. 權(quán)重:candidate_master=1
2. 日志量
3. 配置文件順序
建議: 設(shè)置權(quán)重,選主最快 并 開啟GTID數(shù)據(jù)補償
兩種情況:
1. ssh能連: node端通過save_binary_logs自動保存主庫的binlog,保存至/var/tmp臨時文件,并且應(yīng)用.
2. ssh不能連: node端,通過apply_diff_relay_logs自動對比差異,互相補償.切換
manager端,masterha_master_switch腳本進行切換
將所有node節(jié)點: 使用命令stop slave;和reset slave all;從庫身份解除
剩余node節(jié)點,重構(gòu)主從關(guān)系.change master to xxx故障主庫信息會從配置文件清楚,manager程序自殺.
額外數(shù)據(jù)補償?shù)墓δ?binlog server功能)
應(yīng)用透明: vip
故障通知
自愈:待開發(fā). 建議配合云環(huán)境.
第4章 擴展配置
4.1 MHA 的vip功能
4.1.1 準備vip腳本
需要在官網(wǎng)下載
[root@db03 ~]#cp master_ip_failover.txt /usr/local/bin/master_ip_failover
修改腳本配置
vi /usr/local/bin/master_ip_failover
my $vip = '10.0.0.55/24'; # 配置vip
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";

注意一定要和配置文件中的ethN一致,我的是eth0:1(1是key指定的值)
賦予權(quán)限
當不提權(quán)時的 報錯
dos2unix: converting file /usr/local/bin/master_ip_failover to Unix format ...
[root@db03 ~]# chmod +x /usr/local/bin/master_ip_failover # 賦予權(quán)限
4.1.2 更改manager配置文件:
vim /etc/mha/app1.cnf
在全局設(shè)置中添加:
master_ip_failover_script=/usr/local/bin/master_ip_failover # 指定腳本位置
4.1.3 主庫上,手工生成第一個vip地址
手工在主庫上綁定vip,注意一定要和配置文件中的ethN一致,我的是eth0:1(1是key指定的值)
ifconfig eth0:1 10.0.0.55/24 # 重啟失效
4.1.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 &
binlog server 宕機補償日志功能
思路 將主binlog日志 備份到MHA服務(wù)器上 防止斷電等情況造成slave端數(shù)據(jù)缺失
4.2.1 配置參數(shù):
vim /etc/mha/app1.cnf
添加模塊
[binlog1]
no_master=1 # 開啟功能
hostname=10.0.0.53 # 指定存放服務(wù)器ip
master_binlog_dir=/data/mysql/binlog # 指定MHA服務(wù)器 存放binlog備份文件地址
4.2.2 創(chuàng)建必要目錄
mkdir -p /data/mysql/binlog
chown -R mysql.mysql /data/*
4.2.3 拉取主庫binlog日志
cd /data/mysql/binlog
mysqlbinlog -R --host=10.0.0.51 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &
注意: 生產(chǎn)中, 拉取起點從正在使用的binlog 開始
4.2.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 &
4.3 郵件提醒
4.3.1 準備腳本
官網(wǎng)下
[root@db03 ~]# unzip email_2019-最新.zip
[root@db03 ~]# cd email/
[root@db03 ~/email]# ll
總用量 88
-rw-r--r-- 1 root root 35 12月 27 2017 send
-rw-r--r-- 1 root root 80213 9月 30 2009 sendEmail
-rw-r--r-- 1 root root 203 4月 19 2019 testpl
轉(zhuǎn)移路徑:
[root@db03 ~/email]#cp -a * /usr/local/bin/
[root@db03 ~/email]# cd /usr/local/bin/
提權(quán):
[root@db03 /usr/local/bin]# chmod +x /usr/local/bin/*
4.3.2 修改參數(shù):
vim /etc/mha/app1.cnf
全局中添加參數(shù)
report_script=/usr/local/bin/send
4.3.3 重啟MHA
關(guān)閉
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 &
第5章 測試MHA高可用能力,并恢復(fù).
5.1 停主庫
pkill mysqld
5.2 觀察切換結(jié)果
觀察點包括 但不限于
vip
主從身份
配置文件 是否將故障節(jié)點清除
binlog server
manager進程
看日志
[root@db03 ~]# vim /var/log/mha/app1/manager
5.3 修復(fù)全新的高可用環(huán)境
1 修復(fù)主從
原主 : 將原主故障修復(fù)完成后 當作從指向新主
change master to
master_host='10.0.0.52',
master_user='repl',
master_password='123' ,
MASTER_AUTO_POSITION=1;
start slave;
2 修復(fù)配置文件
MHA服務(wù)器
vim /etc/mha/app1.cnf
將丟棄的原主節(jié)點添加上
[server1]
hostname=10.0.0.51
port=3306
3 修復(fù)binlog server
[root@db03 ~]# cd /data/mysql/binlog/
刪除故障節(jié)點的binlog備份
[root@db03 /data/mysql/binlog]#rm -rf /data/mysql/binlog/*
拉去新節(jié)點的binlog
mysqlbinlog -R --host=10.0.0.52 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &
檢查VIP
新節(jié)點ip a
4 互信檢查,主從檢查
masterha_check_ssh --conf=/etc/mha/app1.cnf
masterha_check_repl --conf=/etc/mha/app1.cnf
5 再次啟動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 &
6 檢查狀態(tài)
[root@db03 /data/mysql/binlog]# masterha_check_status --conf=/etc/mha/app1.cnf