最近一位同学遇到的案例:凌晨数据库意外宕机,要求在一主两从的基础上,搭建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 1236 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.'

View Code

从库存在GTIDs空洞可能会导致切换异常:VIP正常切换,新主可用,新从到新主之间的复制报错,只有修复主从报错,才会做后续操作(new master cleanup、Failover Report、send mail)

• 为何不直接修改为GTID,Auto_Position=1

Slave GTIDs

Slave GTIDs>Master GTIDs,5.7下主从直接报错

• 如何解决

修改源码~~~

shell> vim /usr/share/perl5/vendor_perl/MHA/ServerManager.pm1550 return 1 if ( $_->{use_gtid_auto_pos} );-->修改为1550 #return 1 if ( $_->{use_gtid_auto_pos} );

shell> vim /usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm367 if ( !$_server_manager->is_gtid_auto_pos_enabled() ) {368 $log->info("GTID (with auto-pos) is not supported");-->修改为367 if ( $_server_manager->is_gtid_auto_pos_enabled() !=1) {368 $log->info("GTID (with auto-pos) is not supported");

View Code

为啥这样修改表示看不懂,感谢顺子(另一位同学)分享~

注意:传统复制(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=0Master

Executed_Gtid_Set:90b30799-9215-11e7-8645-000c29c1025c:1-14Slave

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

Master

Executed_Gtid_Set:90b30799-9215-11e7-8645-000c29c1025c:1-15Slave

Retrieved_Gtid_Set: 90b30799-9215-11e7-8645-000c29c1025c:15Executed_Gtid_Set: 90b30799-9215-11e7-8645-000c29c1025c:1-6:8-24

View Code

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

• GTID,auto_position=1change master to master_auto_position=1;

启动复制报错

Last_IO_Error: Got fatal error1236 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 != 1. The master may or may not have rolled back transactions that were already replica

View Code

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复制)

mysql auto position_MHA-Failover(GTID,Auto_Position=0)相关推荐

  1. mysql auto increment offset_MySQL auto_increment_increment,auto_increment_offset 用法

    MySQL中对于表上ID自增列可以在创建表的时候来指定列上的auto_increment属性:等同于SQL server中的identity属性:Oracle则是通过Sequence方式来实现.在My ...

  2. CentOS 6.5系统使用yum方式安装LAMP环境和phpMyAdmin,mysql8.0.1/mysql5.7.22+centos7,windows mysql安装、配置...

    介绍如何在CentOs6.2下面使用YUM配置安装LAMP环境,一些兄弟也很喜欢使用编译的安装方法,个人觉得如果不是对服务器做定制,用yum安装稳定简单,何必去download&make&am ...

  3. 使用GTID,将阿里云RDS数据库,同步到本地MySQL

    目标: 将阿里云RDS数据库,同步到本地MySQL.实现RDS为Master,本地MySQL为Slave 核心技术: GTID复制. 核心步骤:        下载线上物理文件,部署到本地,设置主从关 ...

  4. MySQL第四天(逻辑备份,AB复制、gtid,单表查询,)

    写在前面:笔记两种,以====分割开. 逻辑备份 较物理备份: 优点:不论是什么存储引擎,都可以用mysqldump备成SQL语句 缺点:速度较慢,导入时可能会出现格式不兼容的突发情况,无法做增量备份 ...

  5. mysql 安装更改目录权限设置密码_mysql-8.0 安装教程(自定义配置文件,密码方式已修改)...

    下载zip安装包: MySQL8.0 For Windows zip包下载地址:https://dev.mysql.com/downloads/file/?id=476233,进入页面后可以不登录.后 ...

  6. mysql 8.0 集群_集群架构03·MySQL初识,mysql8.0环境安装,mysql多实例

    官方网址 https://dev.mysql.com/downloads/mysql/ 社区版本分析 MySQL5.5:默认存储引擎改为InnoDB,提高性能和可扩展性,增加半同步复制 MySQL5. ...

  7. mysql 浮点数补零_如何执行MySQL的'SUM',但'0'小数位?

    我有一个含有MySQL表帐户余额,(因为这些值是AES_ENCRYPTED),其被存储为浮点数,具有两个小数位,以varbinary列类型.如何执行MySQL的'SUM',但'0'小数位? 我意识到, ...

  8. win10 mysql登录密码忘了_64位 windows10,MYSQL8.0.13重置密码(忘记密码或者无法登录)...

    上一节的MySQL的配置安装里,并没有用到配置文件my.ini.那在MYSQL8.0.13如何解决密码重置问题呢.我去网上搜了好多的资料都是改配置文件my.ini的,后来终于找到了一条命令:操作步骤如 ...

  9. mysql auto increment 插入_MySQL里AUTO_INCREMENT表里插入0值的问题

    在使用MYSQL数据库时,无法设置AUTO_INCREMENT从0开始自增,之后查询了相关资料整理. 快速概览 AUTO_INCREMENT列满足条件 在不同数据库引擎下所具有的特征 解决AUTO_I ...

最新文章

  1. 图像几何变换之透视变换
  2. 数值分析与算法-喻文健-国科大
  3. linux blind函数,Linux网络编程入门
  4. 分析jQuery源码时记录的一点感悟
  5. Spring - Spring Boot Spring Cloud
  6. Sparse Feature Learning
  7. Vue 生命周期LIFECYCLE是8个吗?
  8. Borg Maze POJ - 3026 (BFS + 最小生成树)
  9. td.moveRow方法
  10. 2021-09-14 if__name__ == ‘__main__‘的用法
  11. 得一微YS9083XT量产工具及方法FW190402
  12. 马里兰大学本科计算机科学,2020年马里兰大学本科专业设置
  13. 降噪耳机哪个牌子好?给大家推荐几款质量比较好的降噪耳机品牌
  14. 【无标题】2022年施工员-设备方向-通用基础(施工员)考试模拟100题及模拟考试
  15. CSS(基础,面试,常见用例)
  16. 华为云 ModelArts——简单的机器学习 初体验
  17. 全网最详细之如何安装gpu版的pytorch
  18. element文件的下载
  19. skimage的基本使用
  20. 为什么说 SSD 已经过时了

热门文章

  1. linux C++ 多线程编程
  2. 3.23 vi/vim:纯文本编辑器
  3. kubectl 命令管理(1)
  4. Apache构建web主机、日志分割及AWStats分析系统
  5. 移动端 c++ 开发_这 10 点值得移动端开发重点学习
  6. jedis使用_Mybatis的二级缓存、使用Redis做二级缓存
  7. mysql-日志浅析_mysql日志使用浅析
  8. 全链路压测构建高可用应用最佳实践
  9. 阿里云张毅萍:构建边缘云全站加速网络体系
  10. 使用率激增250%,这份报告再次将 Serverless 推向幕前