写点什么

记一次 MHA 切换故障踩的坑

发布于: 2020 年 05 月 16 日
记一次MHA切换故障踩的坑

MHA简单架构如下



HK8591.jpg



主机高可用(MHA)

  • Master1:192.168.1.74

  • Master-bak:192.168.1.75:3306

  • Master-vip:192.168.1.174

  • Manager:192.168.1.77

其他用途

  • Delay:192.168.1.75:3307

  • Slave:192.168.1.78:3307




故障演练

早上 07:05分开始操作

  • 停掉主库192.168.1.74:3306

  • New Master: 192.168.1.75:3306

  • Slave2:192.168.1.75:3308



  • 一开始都是正常的,切换IP漂移,到了主从身份切换的时候就出现问题了。

  • Slave recovery on host 192.168.1.75(192.168.1.75:3308) started, pid: 18456. Check tmp log /home/mha/192.168.1.75_3308_20200513070525.log if it takes time.. 

  •  Master failover to 192.168.1.75(192.168.1.75:3306) done, but recovery on slave partially failed. 

  • 主从的复制环境是GTID模式,肯定是复制的时候出现错误。登上去从机看此时的主从情况





  • 原因是Master上已经清除了Slave所需要的binary logs 。有点不知其然,明明都是实时同步的,不知道怎么的就突然缺失了。

  • 一时之间解决不了,想到把停掉的旧主74:3306重新启动起来change to New master ,看看会不会报同样的错误

早上 07:52分重新执行change

  • 由于旧主74:3306​之前是主机,并没有开启read_only ,所以在配置文件里面把read_only=on开启 (这点很重要!)

  • 重新change



  • 结果还是一样。

  • 失败之后还发生了有异样的事情





  • 此时我重新启动的旧主机有进程进来。此时不应该有的, 因为在研发那边,业务层代码应该把IP改为了高可用IP ​174 于是询问下了研发,那边说已经全部修改完毕。我觉得可能是由于缓存之类的,涉及到查询select之类的,并不会对数据进行修改,于是便继续排查主从复制失败的原因。由于这一次大意导致了我接下来跟研发惨无人道的数据修复之路

早上 10:20分发现权限不对

  • ​研发那边反馈查的数据好像不一致,我隐隐约约觉得不太对劲,他们说还有写的业务是连接 ​74 的,我说我在74这边有开 ​read_only 你们的写入操作都进不来的。但是由于职业性的要求,比较敏感。去排查了一下进来的业务用户的权限。发现了一个权限







早上 10:34分关站,切IP

  • ​此时数据完全都不一致了,有两台机子同时写入。紧急关站

把用户权限 ​super remove 同时把74停掉,叫研发把业务暂时全部切过去高可用IP ​174 

中午11:15分用户投诉订单丢失

  • 说十点多的刚下的订单 涉及金额一千多块钱,刚付款,订单就消失了。

  • 这个数据应该在 ​74 上,目前74都已经停了, 所以读写基本都是在 ​174 上

  • 事态紧急,连忙把 ​74 起来,同时把 10:34分-11:15分这个期间在 ​174 上的Binlog在74上进行重灌,想把74恢复成一台数据完整的机子,然后再切回去。

  • 由于太急,处理突发事故的经验也不足,并没有考虑到Binlog里面有 ​update 语句, 认为都是 ​insert 

  • BInlog导入之后。认为数据一致,重新把业务切回去 ​74 上

下午15:12分四笔订单离奇失踪

  • 开发反馈,有四笔订单,在 ​74 上找不到 在 ​174 上也找不到,业务逻辑上并没有删除 ​delete 的逻辑

  • 此时发现重灌的Binlog里面有 ​update ,已经把之前存在 ​74 的数据给update掉了。数据丢失

流程梳理

  • PS:ID是主键而且是自增的

  • 假如74上在AB段已经insert/update的数据

  • ID=100 values=A

  • ID=101 values=B

  • ID=102 values=C

  • 后来在174在BC段已经insert/update的数据

  • ID=100 values=D

  • ID=101 values=E

  • ID=102 values=F

  • 在重灌的时候把数据A、B、C改为D、E、F (因为ID一致

修复数据

  • 在查找binlog的过程当中,筛选出07:52-10:34中在 74中数据(根据10:34-11:15中在174筛选出被update的ID)查找insert的语句,过滤出来重新插入

  • 接下来就是重复无止境的重复修复操作了。

····



发布于: 2020 年 05 月 16 日阅读数: 77
用户头像

现在是你们的,未来是我们的 2020.01.11 加入

爱生活,爱DB

评论

发布
暂无评论
记一次MHA切换故障踩的坑