mysql 失效转移_MySQL基于MHA的FailOver过程
大家好,我是anyux。本文介紹MySQL基于MHA的FailOver過程。
MHA FailOver過程詳解
什么是FailOver
故障轉(zhuǎn)移
主庫宕機(jī),一直到業(yè)務(wù)恢復(fù)正常的處理過程
如何處理FailOver
1.快速監(jiān)控到主庫宕機(jī)
2.選擇新主節(jié)點(diǎn),選擇策略
mysqladmin ping
檢查數(shù)據(jù)庫狀態(tài),主機(jī)狀態(tài),端口等,判斷從庫節(jié)點(diǎn)讀取的master_log_file及read_master_log_pos節(jié)點(diǎn)大小,查看Retrieved_gtid_set(已接收到的gtid大小),executed_gtid_set(已執(zhí)行的gtid號(hào)大小)
3.數(shù)據(jù)補(bǔ)償
4.解除從庫身份
5.剩余從庫和新主庫構(gòu)建主從關(guān)系
6.應(yīng)用透明
7.修復(fù)故障主節(jié)點(diǎn)(k8s可以實(shí)現(xiàn)節(jié)點(diǎn)自愈)
MHA的Failover如何實(shí)現(xiàn)
從啟動(dòng)--->故障--->轉(zhuǎn)移---->業(yè)務(wù)恢復(fù)
1.MHA通過master_manager腳本啟動(dòng)MHA功能
2.在manager啟動(dòng)之前,會(huì)自動(dòng)調(diào)用檢查ssh互信腳本(masterha_check_ssh)和主從狀態(tài)檢查腳本(masterha_check_repl)。如果檢查腳本不通過MHA無法啟動(dòng)
3.MHA-manager 通過masterha_master_monitor腳本(每隔ping_interval秒)
4.masterha_master_monitor探測(cè)主庫3次無心跳之后,主認(rèn)為主庫宕機(jī)了
5.進(jìn)行選主過程
算法一:
讀取配置文件中是否有強(qiáng)制選主的參數(shù)
candidate_master=1check_repl_delay=0
算法二:
自動(dòng)判斷所有從庫的日志量,將最接近主庫數(shù)據(jù)的從庫作為新主
算法三:
按照配置文件先后順序,選擇新主
6.數(shù)據(jù)補(bǔ)償
判斷主庫ssh的連通性
情況一:ssh能夠連接
調(diào)用save_binary_logs腳本,立即保存缺失部分的binlog到各個(gè)節(jié)點(diǎn),恢復(fù)
情況二:ssh法連接
調(diào)用 apply_diff_relay_logs 腳本,計(jì)算從庫的relaylog差異,恢復(fù)到2號(hào)從庫
提供額外的數(shù)據(jù)補(bǔ)償功能
解除從庫身份
剩余從庫和主庫構(gòu)建主從關(guān)系
應(yīng)用透明
故障節(jié)點(diǎn)自愈
故障提醒
MHA應(yīng)用透明(vip)
$vip是一個(gè)未被占用的地址,將來可實(shí)現(xiàn)地址飄移的,需要自己按情況調(diào)整
$brdc是廣播地址,按自身網(wǎng)絡(luò)情況調(diào)整
$ifdev是網(wǎng)卡名稱,設(shè)置為自己實(shí)際的網(wǎng)卡名稱
$ssh_start_vip是添加vip功能的
$ssh_stop_vip是關(guān)閉vip功能的
my $vip = '192.168.255.200';my $brdc = '192.168.255.255';my $ifdev = 'ens33';my $key = '1';my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
復(fù)制下面代碼到db115主機(jī)下的 /usr/local/bin/master_ip_failover文件中
#!/usr/bin/env perluse strict;use warnings FATAL => 'all';use Getopt::Long;my ($command, $ssh_user, $orig_master_host, $orig_master_ip,$orig_master_port, $new_master_host, $new_master_ip, $new_master_port);my $vip = '192.168.255.200';my $brdc = '192.168.255.255';my $ifdev = 'ens33';my $key = '1';my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";GetOptions('command=s' => \$command,'ssh_user=s' => \$ssh_user,'orig_master_host=s' => \$orig_master_host,'orig_master_ip=s' => \$orig_master_ip,'orig_master_port=i' => \$orig_master_port,'new_master_host=s' => \$new_master_host,'new_master_ip=s' => \$new_master_ip,'new_master_port=i' => \$new_master_port,);exit &main();sub main {print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";if ( $command eq "stop" || $command eq "stopssh" ) {my $exit_code = 1;eval {print "Disabling the VIP on old master: $orig_master_host \n";&stop_vip();$exit_code = 0;};if ($@) {warn "Got Error: $@\n";exit $exit_code;}exit $exit_code;}elsif ( $command eq "start" ) {my $exit_code = 10;eval {print "Enabling the VIP - $vip on the new master - $new_master_host \n";&start_vip();$exit_code = 0;};if ($@) {warn $@;exit $exit_code;}exit $exit_code;}elsif ( $command eq "status" ) {print "Checking the Status of the script.. OK \n";exit 0;}else {&usage();exit 1;}}sub start_vip() {`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;}# A simple system call that disable the VIP on the old_mastersub stop_vip() {`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;}sub usage {print"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";}
字符轉(zhuǎn)換
yum install -y dos2unixcd /usr/local/bin/dos2unix master_ip_failover
添加執(zhí)行權(quán)限
chmod +x /usr/local/bin/master_ip_failover
編輯配置文件
vim /etc/mha/app1.cnf[server default]master_ip_failover_script=/usr/local/bin/master_ip_failover
檢查主庫
masterha_check_status --conf=/etc/mha/app1.cnf
db01手工添加vip
yum install -y net-toolsifconfig ens33:1 192.168.255.200/24ip a | grep 200
db03重啟mha
主從狀態(tài)檢查
masterha_check_repl --conf=/etc/mha/app1.cnf
返回ok
檢查mha狀態(tài)
masterha_check_status --conf=/etc/mha/app1.cnf
先關(guān)閉mha
masterha_stop ---conf=/etc/mha/app1.cnf
啟動(dòng)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 &
MHA故障郵箱提醒
安裝郵件
yum -y install sendmailyum -y install mailx
編輯配置文件,此次是使用163郵箱,需要獲取授權(quán)碼
vim /etc/mail.rcset from=xxxx@163.comset smtp=smtp.163.comset smtp-auth-user=xxxx@163.comset smtp-auth-password=xxxxxset smtp-auth=login
測(cè)試驗(yàn)證
將xxxx替換為自己的郵箱地址
前面是內(nèi)容主體,-s 后面的參數(shù),是郵件標(biāo)題
echo "你好,先生" | mail -s "你好,請(qǐng)閱讀此文件" xxxx@xxxx.com
MHA是一次性的高可用服務(wù),即數(shù)據(jù)庫如果宕機(jī),mha就不再工作了,也會(huì)自動(dòng)宕機(jī)
當(dāng)mha出現(xiàn)時(shí),我們可以使用send_report以郵件報(bào)警的方式來獲得錯(cuò)誤信息數(shù)據(jù),方便了解數(shù)據(jù)庫狀態(tài)。
將發(fā)送郵件的腳本內(nèi)容復(fù)制到send_report文件中
cd /usr/local/binvim send_report
腳本內(nèi)容如下:
#!/bin/bashecho "你好,先生,數(shù)據(jù)庫宕機(jī)了" | mail -s "數(shù)據(jù)庫宕機(jī)了,請(qǐng)登錄系統(tǒng)查看mha狀態(tài)" 1915530614@qq.com
添加執(zhí)行權(quán)限
chmod +x send_report
然后修改配置文件,只需添加report_script即可
vim /etc/mha/app1.cnf[server default]report_script=/usr/local/bin/send_report
重啟mha
先關(guān)閉mha
masterha_stop --conf=/etc/mha/app1.cnf
啟動(dòng)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 &
檢查mha狀態(tài)
masterha_check_status --conf=/etc/mha/app1.cnf
額外的數(shù)據(jù)補(bǔ)償(binlog_server)
實(shí)時(shí)地接收主庫的數(shù)據(jù),將數(shù)據(jù)保存到其他地區(qū)的機(jī)器上,可以理解為異地備份
找到一臺(tái)額外機(jī)器,數(shù)據(jù)庫版本大于5.6,支持gtid并開啟
在db03上配置
no_master:表示不參與選主
hostname:設(shè)置ip地址
master_binlog_dir:新機(jī)器接收的二進(jìn)制日志存放位置
vim /etc/mha/app1.cnf[binlog1]no_master=1hostname=192.168.255.116master_binlog_dir=/data/mysql/binlog
創(chuàng)建必要目錄
mkdir -p /data/mysql/binlogchown -R mysql.mysql /data/*
修改完成后,將主庫binlog接過來(從000001開始拉取,之后的binlog會(huì)自動(dòng)按順序過來)
拉取主庫binlog日志
必須進(jìn)入到自己創(chuàng)建好的目錄
cd /data/mysql/binlogmysqlbinlog -R --host=192.168.255.113 --user=mha --password=mha --raw --stop-never log-bin.000001 &
注意:
拉取日志的起點(diǎn),需要按照目前從庫的已經(jīng)獲得的二進(jìn)制日志為起點(diǎn)
重啟mha
先關(guān)閉mha
masterha_stop ---conf=/etc/mha/app1.cnf
啟動(dòng)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 &
故障模擬及故障處理
關(guān)閉db01數(shù)據(jù)庫
systemctl stop mysqld
獲取郵箱告警信息
恢復(fù)故障
啟動(dòng)故障節(jié)點(diǎn)
systemctl start mysqld
恢復(fù)1主2從環(huán)境
在db115管理節(jié)點(diǎn)獲取恢復(fù)節(jié)點(diǎn)信息
grep -i "change master" /var/log/mha/app1/manager
登錄db01將日志的語句修改密碼后,在db01環(huán)境下執(zhí)行即可
CHANGE MASTER TO MASTER_HOST='192.168.255.114', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='repl'
啟動(dòng)從庫
start slave;
恢復(fù)db115上的配置文件
重新添加server1節(jié)點(diǎn)信息
[server1]hostname=192.168.255.113port=3306
啟動(dòng)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 &
檢查mha狀態(tài)
masterha_check_status --conf=/etc/mha/app1.cnf
恢復(fù)binlogServer
必須進(jìn)入到自己創(chuàng)建好的目錄
cd /data/mysql/binlogrm -rf /data/mysql/binlog/*mysqlbinlog -R --host=192.168.255.11x --user=mha --password=mha --raw --stop-never log-bin.000001 &
注意:
log-bin.000001需要按照實(shí)現(xiàn)情況獲取
總結(jié)
以上是生活随笔為你收集整理的mysql 失效转移_MySQL基于MHA的FailOver过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GC算法-引用计数法
- 下一篇: jmeter php网站,jmeter实