背景
DBA同学反馈在给某个数据库代理中间件升级后,后端出现Bad handshake的错误,无法连接后端MySQL导致不能正常启动。而使用旧版本就可以直接连接,不会出现问题。
分析
根据跟踪,这个报错应该是代理向MySQL发送登录请求后返回的,对比正常版本的记录和目前最新的主分支,没有发现特别明显的差异。于是,怀疑可能是某些配置的问题。首先猜测可能是登录协议不支持,比如错误配置了ssl,或者不支持auth41等,这些都与capability有关。
再次经过对代码的对比,看到最新版本的默认capability多了个client_plugin_auth,如下图:
server.go:57
于是怀疑可能是这个差异造成。
为了验证猜想,给旧版也加了Client_plugin_auth,但是启动后没有发现问题。再想到capability可以在配置文件覆盖,找到目前的capablity:1024653,配置这个值后,本地复现了出现的问题:bad handshake,如下:
再把capability设置为当前默认值 500357,报错消失,可以正常启动。
capability表示客户端或者服务端支持或开启的各个功能,在建立连接的时候进行协调,如下图:
结论
原因是新版本代理的capability添加支持了CLIENT_PLUGIN_AUTH,会出现部分的不兼容。如果capability配置不对,会造成到MySQL建立连接失败,返回ERROR 1043 (08S01): Bad handshake的异常。解决方式是在配置文件修改capability的值,或者注释掉这个配置从而使用新版本的默认值500357。