使用 polardb 时, 遇到 erlang 的 driver 无法连上 polardb 的集群地址(是个 proxy)的问题,
不得不走上了读 mysql protocol 的不归路..
问题解决过程
我们使用的是 mysql-otp 这个 driver, 在试了 myxql 之后发同 myxql 是可以连上 polardb 的 proxy 的
于是详细对比了一下两个 driver 发出的 handshake 的内容到底哪里不同
mysql-otp:
1 | << |
myxql:
1 | << |
可以看到除了 capabilities_flags 和 max_packet_size 之外, 就只在末尾多了一个字段, 也就是 auth_plugin_name,
值为 "mysql_native_password"
于是我把这个字段在 mysql-otp 也加上, 问题就解决了~
PR: https://github.com/mysql-otp/mysql-otp/pull/178
HandshakeV10
从 mysql server 收到的 initial handshake packet
1 | << |
参考: https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::Handshake
capabilities flags
mysql-otp:
CLIENT_PROTOCOL_41, 16#00000200
CLIENT_TRANSACTIONS, 16#00002000
CLIENT_SECURE_CONNECTION, 16#00008000
CLIENT_CONNECT_WITH_DB, 16#00000008
CLIENT_MULTI_STATEMENTS, 16#00010000
CLIENT_MULTI_RESULTS, 16#00020000
CLIENT_PS_MULTI_RESULTS, 16#00040000
CLIENT_PLUGIN_AUTH, 16#00080000
CLIENT_LONG_PASSWORD, 16#00000001
myxql:
CLIENT_PROTOCOL_41, 16#00000200
CLIENT_TRANSACTIONS, 16#00002000
CLIENT_SECURE_CONNECTION, 16#00008000
CLIENT_CONNECT_WITH_DB, 16#00000008
CLIENT_MULTI_RESULTS, 16#00020000
CLIENT_PLUGIN_AUTH, 16#00080000
CLIENT_FOUND_ROWS, 16#00000002
主要相差 CLIENT_MULTI_STATEMENTS , 话说这个东西不怎么好, 还不如去掉呢
To Be Continued