mysql 失效转移_MySQL基于MHA的FailOver过程
大家好,我是anyux。本文介紹MySQL基于MHA的FailOver過程。
MHA FailOver過程詳解
什么是FailOver
故障轉移
主庫宕機,一直到業務恢復正常的處理過程
如何處理FailOver
1.快速監控到主庫宕機
2.選擇新主節點,選擇策略
mysqladmin ping
檢查數據庫狀態,主機狀態,端口等,判斷從庫節點讀取的master_log_file及read_master_log_pos節點大小,查看Retrieved_gtid_set(已接收到的gtid大小),executed_gtid_set(已執行的gtid號大小)
3.數據補償
4.解除從庫身份
5.剩余從庫和新主庫構建主從關系
6.應用透明
7.修復故障主節點(k8s可以實現節點自愈)
MHA的Failover如何實現
從啟動--->故障--->轉移---->業務恢復
1.MHA通過master_manager腳本啟動MHA功能
2.在manager啟動之前,會自動調用檢查ssh互信腳本(masterha_check_ssh)和主從狀態檢查腳本(masterha_check_repl)。如果檢查腳本不通過MHA無法啟動
3.MHA-manager 通過masterha_master_monitor腳本(每隔ping_interval秒)
4.masterha_master_monitor探測主庫3次無心跳之后,主認為主庫宕機了
5.進行選主過程
算法一:
讀取配置文件中是否有強制選主的參數
candidate_master=1check_repl_delay=0
算法二:
自動判斷所有從庫的日志量,將最接近主庫數據的從庫作為新主
算法三:
按照配置文件先后順序,選擇新主
6.數據補償
判斷主庫ssh的連通性
情況一:ssh能夠連接
調用save_binary_logs腳本,立即保存缺失部分的binlog到各個節點,恢復
情況二:ssh法連接
調用 apply_diff_relay_logs 腳本,計算從庫的relaylog差異,恢復到2號從庫
提供額外的數據補償功能
解除從庫身份
剩余從庫和主庫構建主從關系
應用透明
故障節點自愈
故障提醒
MHA應用透明(vip)
$vip是一個未被占用的地址,將來可實現地址飄移的,需要自己按情況調整
$brdc是廣播地址,按自身網絡情況調整
$ifdev是網卡名稱,設置為自己實際的網卡名稱
$ssh_start_vip是添加vip功能的
$ssh_stop_vip是關閉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";
復制下面代碼到db115主機下的 /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";}
字符轉換
yum install -y dos2unixcd /usr/local/bin/dos2unix master_ip_failover
添加執行權限
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
主從狀態檢查
masterha_check_repl --conf=/etc/mha/app1.cnf
返回ok
檢查mha狀態
masterha_check_status --conf=/etc/mha/app1.cnf
先關閉mha
masterha_stop ---conf=/etc/mha/app1.cnf
啟動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郵箱,需要獲取授權碼
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
測試驗證
將xxxx替換為自己的郵箱地址
前面是內容主體,-s 后面的參數,是郵件標題
echo "你好,先生" | mail -s "你好,請閱讀此文件" xxxx@xxxx.com
MHA是一次性的高可用服務,即數據庫如果宕機,mha就不再工作了,也會自動宕機
當mha出現時,我們可以使用send_report以郵件報警的方式來獲得錯誤信息數據,方便了解數據庫狀態。
將發送郵件的腳本內容復制到send_report文件中
cd /usr/local/binvim send_report
腳本內容如下:
#!/bin/bashecho "你好,先生,數據庫宕機了" | mail -s "數據庫宕機了,請登錄系統查看mha狀態" 1915530614@qq.com
添加執行權限
chmod +x send_report
然后修改配置文件,只需添加report_script即可
vim /etc/mha/app1.cnf[server default]report_script=/usr/local/bin/send_report
重啟mha
先關閉mha
masterha_stop --conf=/etc/mha/app1.cnf
啟動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狀態
masterha_check_status --conf=/etc/mha/app1.cnf
額外的數據補償(binlog_server)
實時地接收主庫的數據,將數據保存到其他地區的機器上,可以理解為異地備份
找到一臺額外機器,數據庫版本大于5.6,支持gtid并開啟
在db03上配置
no_master:表示不參與選主
hostname:設置ip地址
master_binlog_dir:新機器接收的二進制日志存放位置
vim /etc/mha/app1.cnf[binlog1]no_master=1hostname=192.168.255.116master_binlog_dir=/data/mysql/binlog
創建必要目錄
mkdir -p /data/mysql/binlogchown -R mysql.mysql /data/*
修改完成后,將主庫binlog接過來(從000001開始拉取,之后的binlog會自動按順序過來)
拉取主庫binlog日志
必須進入到自己創建好的目錄
cd /data/mysql/binlogmysqlbinlog -R --host=192.168.255.113 --user=mha --password=mha --raw --stop-never log-bin.000001 &
注意:
拉取日志的起點,需要按照目前從庫的已經獲得的二進制日志為起點
重啟mha
先關閉mha
masterha_stop ---conf=/etc/mha/app1.cnf
啟動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 &
故障模擬及故障處理
關閉db01數據庫
systemctl stop mysqld
獲取郵箱告警信息
恢復故障
啟動故障節點
systemctl start mysqld
恢復1主2從環境
在db115管理節點獲取恢復節點信息
grep -i "change master" /var/log/mha/app1/manager
登錄db01將日志的語句修改密碼后,在db01環境下執行即可
CHANGE MASTER TO MASTER_HOST='192.168.255.114', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='repl'
啟動從庫
start slave;
恢復db115上的配置文件
重新添加server1節點信息
[server1]hostname=192.168.255.113port=3306
啟動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狀態
masterha_check_status --conf=/etc/mha/app1.cnf
恢復binlogServer
必須進入到自己創建好的目錄
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需要按照實現情況獲取
總結
以上是生活随笔為你收集整理的mysql 失效转移_MySQL基于MHA的FailOver过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GC算法-引用计数法
- 下一篇: mysql 查询 带数据库实例_数据库查