mysql 失效转移_MySQL基于MHA的FailOver过程

大家好,我是anyux。本文介绍MySQL基于MHA的FailOver过程。

2d41e1c605ea16bc52cf10209c53f4ae.png

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号从库

提供额外的数据补偿功能

解除从库身份

剩余从库和主库构建主从关系

应用透明

故障节点自愈

故障提醒

4fdd3b80b0df2d37f1b5da4f771c873d.png

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 &

be1e0b5d06d5735951cd53ab574ee6ad.png

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

获取邮箱告警信息

d584c1bffbc4b0581f8a29f99056850c.png

恢复故障

启动故障节点

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需要按照实现情况获取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kali 切换图形界面_kali Linux 文本图形界面切换遇到的怪问题

前段装了在Virtual Box上装一个Kali Linux玩&#xff0c;然后设为了开机进入文本界面&#xff0c;后来遇到无法上网的问题&#xff0c;网上找到解决方法&#xff0c;说是NAT地址转换和host-only双网卡顺序问题&#xff0c;按照网上的说法调整顺序后一切正常。问题及调整方法详见…

linux mysql更改生效_linux下面MySQL变量修改及生效

今天在访问mysql项目的时候突然报500错误&#xff0c;没有找到连接&#xff0c;因此想到mysql的连接时间。mysql> show global variables;主要就是连接时间是28800(8小时)&#xff0c;而且任务调度也没打开&#xff0c;因此想到修改全局变量的值。1.修改任务调度装:1.1具体的…

linux刻录win10u盘_手把手教你装系统之【制作官方win10安装U盘】

本帖最后由 蚂蚁炒花甲 于 2019-11-11 22:58 编辑很多粉粉在收到linux版本的笔记本后用不惯&#xff0c;但又不知道如何装win10系统下面我就来教大家&#xff0c;如何自己动手 制作win10 安装U盘想学习的粉粉们&#xff0c;可以跟着我 学习下手把手教你装系统之【官方win10 U盘…

mysql 魔术设置_mysql主从复制实践

1.master服务器上安装mysql&#xff0c;正常安装mysql参考2.slave服务器上安装mysql&#xff0c;正常安装mysql参考3.配置3.1master服务器配置cnf文件vim /etc/my.cnf加入配置[mysqld]log-bin master-binlog-bin-index master-bin.indexserver-id 1重启mysql服务service mys…

scrapy爬取天气存MySQL_Scrapy实战篇(五)之爬取历史天气数据

本篇文章我们以抓取历史天气数据为例&#xff0c;简单说明数据抓取的两种方式&#xff1a;1、一般简单或者较小量的数据需求&#xff0c;我们以requests(selenum)beautiful的方式抓取数据2、当我们需要的数据量较多时&#xff0c;建议采用scrapy框架进行数据采集&#xff0c;sc…

mysql 第二天数据_MySQL入门第二天------数据库操作

一、基本命令1、启动服务器cmdnet start [服务器名称]net start mysql572、停止服务器cmdnet stop [服务器名称]net stop mysql573、链接数据库mysql -u 用户名 -p 登录密码mysql -u root -p4、退出登录quitexit\q5、查看版本(连接后执行)select version();6、查看当前时间(连接…

如何打开java_怎样运行java

怎样运行java? 第一步:下载并安装JDK 6.0,安装路劲为: C:\java\jdk1.6 . 第二步:对“我的电脑”按右键,选“属性”,在“系统属性”窗口中选“高级”标签,再按“环境变量”按钮,弹出一个“环境变量”的窗口,在系统变量中新建一个变量,变量名为“JAVA_HOME“,变量值为…

java 字符串匹配_多模字符串匹配算法原理及Java实现代码

多模字符串匹配算法在这里指的是在一个字符串中寻找多个模式字符字串的问题。一般来说&#xff0c;给出一个长字符串和很多短模式字符串&#xff0c;如何最快最省的求出哪些模式字符串出现在长字符串中是我们所要思考的。该算法广泛应用于关键字过滤、入侵检测、病毒检测、分词…

java http 异步请求框架_GitHub - huangdali/MyHttpUtils: 一个非常好用的异步网络请求框架...

轻量级网络请求框架MyHttputils 一、前言本版代码大换血&#xff0c;使用了策略模式和构造模式来组织代码&#xff0c;增加了更加人性化的请求构造&#xff0c;代码质量提高、效率显著提升。(但是使用风格基本没变哦)2.0.2版本的基本的用法在《android网络请求框架》一个轻量级…

mysql 推送微信公众号_10分钟完成微信公众号第三方平台全网发布

背景&#xff1a;在微信公众平台配置服务器URL时&#xff0c;使用了新浪云SAE自带的二级域名&#xff0c;提交时出现一个安全风险的警告&#xff0c;网上查了下&#xff0c;许多服务平台和团队也遇到同样的问题。经过一番研究 …为什么会有安全风险的警告&#xff1f;微信公众平…

java排序算法原理_排序算法原理与实现(java)

排序算法原理与实现(java) Java程序员必知的8大排序 [来源&#xff1a;本站 | 日期&#xff1a;2012年12月24日 | 浏览173 次] 字体:[大 中 小] 8种排序之间的关系: 1&#xff0c; 直接插入排序 (1)基本思想&#xff1a;在要排序的一组数中&#xff0c;假设前面(n-1)[n>2] 个…

ios django 连接mysql_Django---Django连接Mysql数据库

前面介绍了Django平台的数据交互&#xff0c;这些数据都是在本地存放着&#xff0c;修改内容或者重新启动服务&#xff0c;数据就消失了&#xff0c;如果我们把数据存放在数据库中&#xff0c;不就保存了吗&#xff1f;Django数据库Django中自带的也有数据库(sqlite3)&#xff…

java xmpp openfire_XMPP协议学习笔记三(Openfire服务器端搭建开发环境)

在了解了XMPP的基本结构和一些概念之后&#xff0c;我们暂时告别枯燥的理论学习&#xff0c;来动手搭建一下OpenfireSpark的开发环境&#xff0c;实际感受一下搭建整套IM通讯系统的过程。开发环境&#xff1a;windows XP sp3&#xff0c;Eclipse3.6.1&#xff0c;jdk1.6.0_24&a…

java接口经常变动前端怎么办_Java进程故障排查(CPU资源占用高,接口响应超时,功能接口停滞等)...

故障分析# 导致系统不可用情况(频率较大)&#xff1a;1)代码中某个位置读取数据量较大&#xff0c;导致系统内存耗尽&#xff0c;进而出现Full GC次数过多&#xff0c;系统缓慢&#xff1b;2)代码中有比较消耗CPU的操作&#xff0c;导致CPU过高&#xff0c;系统运行缓慢&#x…

使用java实现面向对象编程第二章_java面向对象编程——第二章 java基础语法

第二章java基础语法1、java关键字abstractbooleanbreakbytecasecatchcharclassconstcontinuedefaultdodoubleelseextendsassertfinalfinallyfloatforgotoifimplementsimportinstanceofintinterfacelongnativenewstrictfppackageprivateprotectedpublicreturnshortstaticsupersw…

用java实现楼层导航_JS实现网站楼层导航效果代码实例

壹 ❀ 引言对于楼层导航而言&#xff0c;还有个重要的功能就是&#xff0c;随着滚动条滚动&#xff0c;达到某层时得同步点亮楼层导航的小图片。由于我前面也说了不打算使用JQ&#xff0c;所以想着用JS去实现它&#xff0c;实现并不难&#xff0c;主要得弄清滚动满足怎样的条件…

费尔马小定理素数java_利用费马小定理判断素数

今天听了ljss神犇的数论课&#xff0c;顿时感觉————我真的是太弱啦&#xff01;我只能稍微写一下我能听懂的部分orz那么这就是今天我为数不多能听懂一点的之一......QAQ首先先介绍今天的主角&#xff1a;费马小定理————转自维基百科没看懂的话我稍微解释一下&#xff0…

java aspectj_AspectJ基本用法

AOP虽然是方法论&#xff0c;但就好像OOP中的Java一样&#xff0c;一些先行者也开发了一套语言来支持AOP。目前用得比较火的就是AspectJ了&#xff0c;它是一种几乎和Java完全一样的语言&#xff0c;而且完全兼容Java(AspectJ应该就是一种扩展Java&#xff0c;但它不是像Groovy…

php json to object,PHP JSON_FORCE_OBJECT函数实现强转对象

JSON_FORCE_OBJECT在多级数组中&#xff0c;JSON_FORCE_OBJECT会将所有嵌套数值数组编码为对象。如果你只关注第一级数组(例如&#xff0c;使其适合作为MySQL JSON列)&#xff0c;那么可以将第一级数组强制转换为对象&#xff0c;例如&#xff1a;$ json json_encode((object)…

php推送示例wordpress,给WordPress的编辑后台添加提示框的代码实例分享

WordPress 3.5 新添加了一个提示框功能&#xff0c;可以创建一个提示框&#xff0c;然后指向任何元素&#xff0c;比如下边的例子&#xff1a;本文就来教你怎么创建一个这样的提示框。首先需要添加提示框的脚本&#xff0c;这样才能使用提示框的 JS 方法。//挂载提示框脚本func…