故障分析 | MHA 切换的一个“坑”

本文介绍了在使用MHA进行主从切换时遇到的bad new master错误,通过分析MHA的源码揭示了新主被判定为不可用的原因——新主版本必须是最旧的MySQL主版本。文中还提供了不同测试场景下的切换结果,并探讨了MHA设计的可能考虑。

作者:张洛丹

原爱可生 DBA 团队成员,现陆金所 DBA 团队成员,对技术执著有追求!

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


背景

在一次变更中使用 MHA 进行主从切换,命令如下:

masterha_master_switch --master_state=alive --conf=/etc/mha/mha3306.cnf --new_master_host=xx.xx.xx.xx --new_master_port=3306 --interactive=0 --orig_master_is_new_slave

然而却遇到了报错,如下:

[error][/usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln1213] XX.XX.XX.XX is bad as a new master!
[error][/usr/share/perl5/vendor_perl/MHA/MasterRotate.pm, ln232] Failed to get new master!
[error][/usr/share/perl5/vendor_perl/MHA/ManagerUtil.pm, ln177] Got ERROR:  at /bin/masterha_master_switch line 53.

看报错是认为指定的新主是一个bad new master

遇到这个报错内心是懵的,明明切换前检查集群状态、masterha_check_repl都是正常的。嗯……还是对 MHA 的原理了解不够深入。

当时也没时间去研究为什么报错了,于是就手工切换了,接下来就让我们一起去探索为什么会出现这个报错吧!

说明一下,线上主从集群的环境是这样的:

角色 MySQL版本
M MySQL 5.6.40
S1 MySQL 5.6.40
S2 MySQL 5.7.29
S3 MySQL 5.7.29

PS:为什么主从版本会不一致呢?
是因为正在做升级,本次切换就是为了将 S2 切换为主,然后将低版本的两个实例升级上去。

测试场景

线上通过手工切换绕过了 MHA 的报错,后面要进行分析具体原因。因为现场环境新主的版本和老主库版本是不一样的,猜想是否 MHA 不支持跨版本切换,之前也没有留意这个问题。于是在测试环境中进行了一波测试,下面列出测试场景和测试结论,有兴趣的可以自己测试一下:

测试场景 原master版本 新master版本 其他slaves 版本 切换结果
场景1 5.6.40 5.7.29 切换成功
场景2 5.7.29 5.6.40 切换成功
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值