背景
DBA同學(xué)反饋在給某個(gè)數(shù)據(jù)庫(kù)代理中間件升級(jí)后,后端出現(xiàn)Bad handshake的錯(cuò)誤,無(wú)法連接后端MySQL導(dǎo)致不能正常啟動(dòng)玫氢。而使用舊版本就可以直接連接,不會(huì)出現(xiàn)問(wèn)題谜诫。
分析
根據(jù)跟蹤漾峡,這個(gè)報(bào)錯(cuò)應(yīng)該是代理向MySQL發(fā)送登錄請(qǐng)求后返回的,對(duì)比正常版本的記錄和目前最新的主分支喻旷,沒(méi)有發(fā)現(xiàn)特別明顯的差異生逸。于是,懷疑可能是某些配置的問(wèn)題。首先猜測(cè)可能是登錄協(xié)議不支持槽袄,比如錯(cuò)誤配置了ssl烙无,或者不支持auth41等,這些都與capability有關(guān)遍尺。
再次經(jīng)過(guò)對(duì)代碼的對(duì)比截酷,看到最新版本的默認(rèn)capability多了個(gè)client_plugin_auth,如下圖:
server.go:57
于是懷疑可能是這個(gè)差異造成乾戏。
為了驗(yàn)證猜想迂苛,給舊版也加了Client_plugin_auth,但是啟動(dòng)后沒(méi)有發(fā)現(xiàn)問(wèn)題鼓择。再想到capability可以在配置文件覆蓋三幻,找到目前的capablity:1024653,配置這個(gè)值后惯退,本地復(fù)現(xiàn)了出現(xiàn)的問(wèn)題:bad handshake赌髓,如下:
再把capability設(shè)置為當(dāng)前默認(rèn)值 500357从藤,報(bào)錯(cuò)消失催跪,可以正常啟動(dòng)。
capability表示客戶(hù)端或者服務(wù)端支持或開(kāi)啟的各個(gè)功能夷野,在建立連接的時(shí)候進(jìn)行協(xié)調(diào)懊蒸,如下圖:
image.png
結(jié)論
原因是新版本代理的capability添加支持了CLIENT_PLUGIN_AUTH,會(huì)出現(xiàn)部分的不兼容悯搔。如果capability配置不對(duì)骑丸,會(huì)造成到MySQL建立連接失敗,返回ERROR 1043 (08S01): Bad handshake的異常妒貌。解決方式是在配置文件修改capability的值通危,或者注釋掉這個(gè)配置從而使用新版本的默認(rèn)值500357。