最近一位同学遇到的案例:凌晨数据库意外宕机,要求在一主两从的基础上,搭建MHA做故障切换。在部署测试中遇到一些问题找到我,交流的过程挖出一些之前忽略的坑,感谢这位同学无私分享!
• GTID环境,KILL主库,新主库和从库丢失数据(之前已知)
• 在数据库进程挂掉、数据库服务器关机或重启、开启防火墙、关闭网络服务等状况下,测试MHA是否正常切换(之前没考虑脑裂问题)
• 线上部分环境GTID,Auto_Position=0,故障切换会变成GTID,Auto_Position=1(之前没考虑)
• 梳理故障切换流程(之前梳理)

一、GTID环境,KILL主库,新主库和从库丢失数据

需在配置文件将Master/Binlog Server配置到[binlogN],才能补全Dead Master上的差异数据,否则只应用到Latest Slave
发散:[binlogN]指定到Binlog Server,kill -9 master_mysqld,MHA是从Binlog Server上获取还是从Dead Master上获取差异binlog?
指定到Binlog Server就从Binlog Server上获取,指定到Dead Master就到Dead Master获取;如果没有指定,就不会补全差异数据

二、MHA切换测试

在数据库进程挂掉,数据库服务器关机或重启、开启防火墙、关闭网络服务等状况下,测试MHA是否正常切换
MySQL5.7.21,基于Row+Gtid搭建的一主两从复制结构:Master132->{Slave133、Slave134};VIP在132上,mha-manager 0.56在134上

测试场景 XX.132 XX.133 XX.134 说明
132:kill -9 mysqld 不可用 MHA正常切换,数据不丢失
132:关闭或重启132服务器 不可用 MHA正常切换,数据可能丢失
134:iptables -I INPUT -s XX.132 -j DROP 可用 MHA正常切换,原主库正常访问,133成为新主库,132和133同时存在VIP
132:service network stop/ifconfig eth0 down 不可用 MHA正常切换,数据可能丢失

注:上述表格是配置[binlogN]指定到Binlog Server,没有指定secondary_check_script的测试结果
关闭数据库服务器,数据可能丢失的原因:Binlog Server是异步,高并发下binlog延迟可以理解
开启防火墙,模拟主库与mha-manager不通讯,出现脑裂。配置文件添加"secondary_check_script=masterha_secondary_check -s remote_host1 -s remote_host2",remote_host1、remote_host2尽量与mha-manager、MySQL Server处于不同网段

三、GTID,Auto_Position=0,故障切换变成GTID,Auto_Position=1

3.1、Auto_Position

线上部分环境GTID,Auto_Position=0,故障切换会变成GTID,Auto_Position=1
• 有何风险
如果S1从库的GTIDs存在空洞,S2从库的GTIDs正常,随着时间推移,S2将S1上GTIDs空洞对应的binlog删除。此时发生故障切换,且选择S2做为新Master,在S1 change master to S2 master_auto_position=1会报错

Got fatal error  from master when reading data from binary log: 'The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.'

从库存在GTIDs空洞可能会导致切换异常:VIP正常切换,新主可用,新从到新主之间的复制报错,只有修复主从报错,才会做后续操作(new master cleanup、Failover Report、send mail)
• 为何不直接修改为GTID,Auto_Position=1
Slave GTIDs<Master GTIDs,如果Diff GTIDs对应的binlog在Master已被purge,修改为Auto_Position=1会继续报错
Slave GTIDs>Master GTIDs,5.7下主从直接报错
• 如何解决
修改源码~~~

shell> vim /usr/share/perl5/vendor_perl/MHA/ServerManager.pm
return if ( $_->{use_gtid_auto_pos} );
-->修改为
#return if ( $_->{use_gtid_auto_pos} ); shell> vim /usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm
if ( !$_server_manager->is_gtid_auto_pos_enabled() ) {
$log->info("GTID (with auto-pos) is not supported");
-->修改为
if ( $_server_manager->is_gtid_auto_pos_enabled() != ) {
$log->info("GTID (with auto-pos) is not supported");

为啥这样修改表示看不懂,感谢顺子(另一位同学)分享~
注意:传统复制(gtid_mode=off),MHA不会利用Binlog Server补全差异数据(又是一个坑●-●)

Binlog Server
Starting from MHA version 0.56, MHA supports new section [binlogN]. In binlog section, you can define mysqlbinlog streaming servers. When MHA does GTID based failover, MHA checks binlog servers, and if binlog servers are ahead of other slaves, MHA applies differential binlog events to the new master before recovery. When MHA does non-GTID based (traditional) failover, MHA ignores binlog servers.

3.2、什么情况会出现GTID空洞

1、从库暂停Slave Thread->主库写数据->主库flush log、purge log->从库启动Slave Thread->报错,缺失binary log
手工执行change master_auto_position=0;change binlog file & pos;
2、搭建复制时change master_auto_position=0;->复制过程暂停Slave Thread->change new_file & new_pos->从库启动Slave Thread
master_auto_position=1,Slave连接Master时,会把Executed_Gtid_Set中的GTIDs发给Master,Master会跳过Executed_Gtid_Set,把没有执行过的GTIDs发送给Slave
情况1:再次change master_auto_position=1;它依旧会去查找那些被purge的binlog,然后抛出错误
情况2:再次change master_auto_position=1;只要主上对应binlog没被purge,它能自动将空洞GTID补全
前提:Master没有对GTIDs空洞相应的记录进行DML操作,不然复制早就报错了,可能就错过这个坑~不过仔细想想,从库本来就有空洞,复制也没报错,侧面反映Master没有对GTIDs空洞相应的记录进行DML操作
扩展阅读:[MySQL FAQ]系列 — 5.6版本GTID复制异常处理一例

3.3、relay-log是如何获取及应用

Slave GTIDs>Master GTIDs,relay-log是如何获取及应用

• GTID,auto_position=
Master
Executed_Gtid_Set:90b30799--11e7--000c29c1025c:-
Slave
set global Gtid_Purged='90b30799-9215-11e7-8645-000c29c1025c:1-6:8-24';
-->Master写入一条数据
Master
Executed_Gtid_Set:90b30799--11e7--000c29c1025c:-
Slave
Retrieved_Gtid_Set: 90b30799--11e7--000c29c1025c:
Executed_Gtid_Set: 90b30799--11e7--000c29c1025c:-:-

新写入的binlog会写到从库的relay-log,但是不会应用(可以通过查看数据、解析日志确认)!

• GTID,auto_position=
change master to master_auto_position=;
启动复制报错
Last_IO_Error: Got fatal error from master when reading data from binary log: Slave has more GTIDs than the master has, using the master`s SERVER_UUID. This may indicate that the end of the binary log was truncated or that the last binary log file was lost, e.g., after a power or disk failure when sync_binlog != . The master may or may not have rolled back transactions that were already replica

relay-log获取
Auto_Position=0,如果开启relay-log自动修复机制,发生crash时根据relay_log_info中记录的已执行的binlog位置从master上重新获取写入relay-log
Auto_Position=1,Slave连接Master时,会把Executed_Gtid_Set中的GTIDs发给Master,Master会跳过Executed_Gtid_Set,把没有执行过的GTIDs发送给Slave。如果Slave上的GTIDs大于Master上的GTIDs,5.7下直接报错,5.6下不会报错(有环境的自行验证,顺便看看relay-log会不会有记录写入)
relay-log应用
如果relay-log中的GTIDs包含在Executed_Gtid_Set里,则不会apply-log

四、故障切换流程

MHA在传统复制和GTID复制下,主库发生故障,如何选举New Master,如何修复差异数据
详细流程请参考:MHA-手动Failover流程(传统复制&GTID复制)

MHA-Failover(GTID,Auto_Position=0)的更多相关文章

  1. MHA failover GTID 专题

    https://yq.aliyun.com/articles/238882?spm=5176.8067842.tagmain.18.73PjU3 摘要: MHA failover GTID 专题 这里 ...

  2. MySQL MHA FailOver后,原Master节点自动以Slave角色加入解群的研究与实现

    MHA是一套MySQL高可用管理软件,除了检测Master宕机后,提升候选Slave为New Master之外(漂虚拟IP),还会自动让其他Slave与New Master 建立复制关系.MHA Ma ...

  3. MHA ssh检查,repl复制检查和在线切换日志分析

    一.SSh 检查日志分析 执行过程及对应的日志: 1.读取MHA manger 节点上的配置文件 2.根据配置文件,得到各个主机的信息,逐一进行SSH检查 3.每个主机都通过SSH连接除了自己以外的其 ...

  4. MS SQL 错误 :17883,严重度: 1,状态: 0

    公司一台老旧的SQL SERVER 2000 数据库,一周内会出现若干次(一次或多次)CPU 持续100%,导致应用程序没有反应的情况,如下图所示: 错误信息如下所示: 日期 2013/7/12 2: ...

  5. 在win7-64bit环境下,boa-constructor 0.6.1 的palette面板中没有控件图标的解决方法

    在win7-64bit环境下,boa-constructor 0.6.1 的palette面板中没有控件图标,空白一片.将面板窗口拉大,发现那些图标在很下面的位置,X轴的排列与正常状态一致. 软件环境 ...

  6. 用仿ActionScript的语法来编写html5——终篇,LegendForHtml5Programming1.0开源库件

    一,LegendForHtml5Programming1.0库件是什么?它是一个javascript库,它模仿了ActionScript的语法,用于html5的开发,目前实现的功能相对较少,还不能称之 ...

  7. 编写一函数用来实现左右循环移位。函数原型为move(value,n);n>0时右移n位,n<0时左移|n|位。

    #include<stdio.h> #include<stdlib.h> int main(){ setbuf(stdout,NULL); int move(int,int); ...

  8. 动态IP无法获取默认网关,显示0.0.0.0的解决办法

    IP地址使用自动获取IP方式,可以获取到IP地址和子网掩码,默认网关无法获取,显示0.0.0.0,通过修复Winsock和LSP可以解决该问题,具体步骤如下:一.修复winsock1.单击开始> ...

  9. SATA1.0,2.0,3.0区别

    外观没区别,接口都一样,线也一样,就是传输速率不一样,控制芯片不一样SATA1.0理论传输速度为1.5Gbit/s SATA2.0理论传输速度为3Gbit/sSATA2.0理论传输速度为6Gbit/s ...

随机推荐

  1. CSS实现水平垂直同时居中的6种思路

    前面的话 水平居中和垂直居中已经单独介绍过,本文将介绍水平垂直同时居中的6种思路 水平对齐+行高 [思路一]text-align + line-height实现单行文本水平垂直居中 <style ...

  2. CSS变形transform(2d)

    前面的话 CSS变形transform是一些效果的集合,主要是移动.旋转.缩放和倾斜这四种基本操作,还可以通过设置matrix矩阵来实现更复杂的效果.变形transform可以实现2D和3D两种效果. ...

  3. 数字对——RMQ+二分答案

    题目描述 小H是个善于思考的学生,现在她又在思考一个有关序列的问题. 她的面前浮现出一个长度为n的序列{ai},她想找出一段区间[L, R](1 <= L <= R <= n). 这 ...

  4. BZOJ3732Network——kruskal重构树+倍增+LCA/最小生成树+倍增

    题目描述 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 & ...

  5. Spring IOC和Spring AOP的实现原理(源码主线流程)

    写在前面 正本文参考了<spring技术内幕>和spring 4.0.5源码.本文只描述原理流程的主线部分,其他比如验证,缓存什么可以具体参考源码理解. Spring IOC 一.容器初始 ...

  6. 自学Linux Shell15.1-处理信号

    点击返回 自学Linux命令行与Shell脚本之路 15.1-处理信号 Linux使用信号与系统上运行的进程进行通信.可以使用这些信号控制Shell脚本的运行,只需要让shell脚本在接收到来自Lin ...

  7. 洛谷 P1378 油滴扩展 改错

    P1378 油滴扩展 题目描述 在一个长方形框子里,最多有\(N(0≤N≤6)\)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油 ...

  8. Python文件和异常

    程序和运行时数据是在内存中驻留的,涉及到数据交换的地方,通常是磁盘.网络等,因此需要IO接口. IO编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但是只能单 ...

  9. 愚人节CDACMFinal

    这个啊,愚人节的ACM之赛,其实还是很有意思的.之前因为星期天不能休息还怨声载道,但真的打起来了就是觉得特别有意思. 我们队,最开始乱搞电脑,cmd都没有办法调用了,霎时间十分慌张(而且我过于慌张忘了 ...

  10. [luogu1655][小朋友的球]

    luogu1665 思路 一道第二类斯特兰数的模板题.只不过需要写个高精. f[i][j]表示前i个球放到j个盒子里的方案数.第i个球可以单独一个盒子,所以f[i][j]+=f[i-1][j-1].还 ...