MySQL MHA高可用

第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)類:

  1. KA+雙主結(jié)構(gòu)+自主開發(fā)的腳本(節(jié)點監(jiān)控,數(shù)據(jù)校驗,數(shù)據(jù)補償) 3個9
    傳統(tǒng)高可用服務(wù)+腳本

  2. Google公司產(chǎn)品 MMM 3-4個9

  3. Facebook公司產(chǎn)品 MHA 4個9 , Taobao產(chǎn)品 TMHA , 騰訊產(chǎn)品TDSQL MHA

多活系統(tǒng): 金融級別常用

  1. PXC(percona), MGC(mariadb) , MySQL Cluster 5個9

  2. MySQL產(chǎn)品InnoDB Cluster , 阿里PolarDB ,騰訊TiDB 分布式高可用

第2章 MHA基礎(chǔ)架構(gòu)搭建

  1. 準備環(huán)境 需要最少三臺MySQL服務(wù)器+GTID主從模式 每一個mysql都是一個服務(wù)節(jié)點 需要安裝node

  2. 配置關(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

  1. 配置個節(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

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

yum install perl-DBD-MySQL -y# 依賴包

rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

  1. 在db01主庫中創(chuàng)建mha需要的用戶 (主從同步狀態(tài) 所有庫也會有)

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

  1. 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 過程)

  1. 通過masterha_manger將MHA的manager進行啟動

  2. 監(jiān)控: 通過masterha_master_monitor 監(jiān)控主從復(fù)制的主庫
    利用ping_interval(參數(shù))秒探測一次主庫的狀態(tài),一共探測4次,無心跳認為主庫宕機

  3. 選主: 通過三種模式 順序
    1. 權(quán)重:candidate_master=1
    2. 日志量
    3. 配置文件順序
    建議: 設(shè)置權(quán)重,選主最快 并 開啟GTID

  4. 數(shù)據(jù)補償
    兩種情況:
    1. ssh能連: node端通過save_binary_logs自動保存主庫的binlog,保存至/var/tmp臨時文件,并且應(yīng)用.
    2. ssh不能連: node端,通過apply_diff_relay_logs自動對比差異,互相補償.

  5. 切換
    manager端,masterha_master_switch腳本進行切換
    將所有node節(jié)點: 使用命令stop slave;reset slave all;從庫身份解除
    剩余node節(jié)點,重構(gòu)主從關(guān)系.change master to xxx

  6. 故障主庫信息會從配置文件清楚,manager程序自殺.

  7. 額外數(shù)據(jù)補償?shù)墓δ?binlog server功能)

  8. 應(yīng)用透明: vip

  9. 故障通知

  10. 自愈:待開發(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";
image.png

注意一定要和配置文件中的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é)果

觀察點包括 但不限于

  1. vip

  2. 主從身份

  3. 配置文件 是否將故障節(jié)點清除

  4. binlog server

  5. manager進程

  6. 看日志

[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

最后編輯于
?著作權(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ù)。

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

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