作者:张洛丹
原爱可生 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 | 无 | 切换成功 |

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

被折叠的 条评论
为什么被折叠?



