TiProxy 尝鲜

TiProxy 的日志格式支持 TiDB 原生格式、json 格式和 console 格式。 下面启动 TiProxy 服务,日志采用 json 格式和 DEBUG 级别。

./bin/tiproxy --config ./conf/proxy.toml --log_encoder console --log_level debug

tiproxy 启动后尝试连接:

mysql --comments --host 127.0.0.1 --port 6000 -u root

值得注意的是,TiDB 服务端与客户端之间默认采用非加密连接 [1],TiDB 启动时默认也不会生成 TLS 证书 [2],但是 tiproxy 启动时默认启用 tls 认证,这里为了简化测试,选择修改默认配置项,不要求配置 tls。

vi conf/proxy.toml

[proxy]
require-backend-tls = false

否则会连接失败,遇到报错:

$ mysql --comments --host 127.0.0.1 --port 6000 -u root
ERROR 1105 (HY000): Unknown error%!(EXTRA string=TiProxy fails to connect to TiDB, please check network)

以及控制台打印日志:

2023/08/23 12:00:27.645 +09:00  INFO    main.proxy      proxy/proxy.go:159      new connection  {"connID": 0, "client_addr": "127.0.0.1:42944"}
2023/08/23 12:00:27.645 +09:00  DEBUG   main.proxy.conn.be.authenticator        backend/authenticator.go:135    frontend send capabilities unsupported by proxy {"connID": 0, "client_addr": "127.0.0.1:42944", "common": "CLIENT_LONG_PASSWORD|CLIENT_LONG_FLAG|CLIENT_LOCAL_FILES|CLIENT_PROTOCOL_41|CLIENT_INTERACTIVE|CLIENT_TRANSACTIONS|CLIENT_SECURE_CONNECTION|CLIENT_MULTI_STATEMENTS|CLIENT_MULTI_RESULTS|CLIENT_PLUGIN_AUTH|CLIENT_CONNECT_ATTS|CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA|CLIENT_DEPRECATE_EOF", "frontend": "CLIENT_PS_MULTI_RESULTS|CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS|CLIENT_SESSION_TRACK|CLIENT_QUERY_ATTRIBUTES|MULTI_FACTOR_AUTHENTICATION", "proxy": "CLIENT_FOUND_ROWS|CLIENT_CONNECT_WITH_DB|CLIENT_ODBC|CLIENT_RESERVED"}
2023/08/23 12:00:27.646 +09:00  INFO    main.proxy.conn.be      backend/backend_conn_mgr.go:218 connected to backend    {"connID": 0, "client_addr": "127.0.0.1:42944", "ns": "default", "backend_addr": "127.0.0.1:4000"}
2023/08/23 12:00:27.646 +09:00  DEBUG   main.proxy.conn.be.authenticator        backend/authenticator.go:200    backend does not support capabilities from proxy        {"connID": 0, "client_addr": "127.0.0.1:42944", "common": "CLIENT_LONG_PASSWORD|CLIENT_FOUND_ROWS|CLIENT_LONG_FLAG|CLIENT_CONNECT_WITH_DB|CLIENT_LOCAL_FILES|CLIENT_PROTOCOL_41|CLIENT_INTERACTIVE|CLIENT_TRANSACTIONS|CLIENT_SECURE_CONNECTION|CLIENT_MULTI_STATEMENTS|CLIENT_MULTI_RESULTS|CLIENT_PLUGIN_AUTH|CLIENT_CONNECT_ATTS|CLIENT_DEPRECATE_EOF", "proxy": "CLIENT_ODBC|CLIENT_RESERVED|CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA", "backend": "CLIENT_SSL"}
2023/08/23 12:00:27.646 +09:00  INFO    main.proxy.conn client/client_conn.go:61        new connection failed   {"connID": 0, "client_addr": "127.0.0.1:42944", "proxy-protocol": false, "backend_addr": "127.0.0.1:4000", "quit source": "proxy error", "error": "require TLS config on TiProxy when require-backend-tls=true"}

使用 TiUP 启动 TiProxy

TiUP 下个版本应该就会包含这个功能,感谢 @xhebox 大佬的贡献,得以让我们使用 tiup 来调用 tiproxy 组件,这里先抢先体验一下如何使用 tiup playground 启动 tidb 和 tiproxy,当然 tiup cluster 也是支持的。

由于含有该功能代码的 tiup 还没发布,所以需要自行编译 tiup,编译步骤可参考 《TiDB 源码编译之 TiUP 篇》

编译后的 tiup 版本信息如下:

$ tiup --version
1.12.5 tiup
Go Version: go1.21.0
Git Ref: master
GitHash: a9580bd

tiproxy 组件尚未发布到官方的镜像库,所以要想使用 tiup 调度 tiproxy 组件,需要先将 tiproxy 包上传至当前使用的 tiup 镜像库,这里使用的是本地镜像库,使用如下命令进行上传:

tiup mirror publish tiproxy v0.1.1 ./tiproxy.tar.gz tiproxy --desc tiproxy
tiup mirror publish tiproxy nightly ./tiproxy.tar.gz tiproxy --desc tiproxy

具体操作步骤可参考 《TiUP:TiDBAer 必备利器》,提示,需要同时提交 nightly 版本,否则会提示错误信息。

Error: Playground bootstrapping failed: component tiproxy doesn't have nightly version on platform linux/amd64

上述步骤完成后,可以看到 tiup-playground 已经增加了 tiproxy 相关选项。

$ ./tiup-playground --version
tiup version 1.12.5 tiup
Go Version: go1.21.0
Git Ref: master
GitHash: a9580bd

$ ./tiup-playground --help | grep tiproxy
--tiproxy int                      TiProxy instance number
--tiproxy.binpath string           TiProxy instance binary path
--tiproxy.config string            TiProxy instance configuration file
--tiproxy.host host                Playground TiProxy host. If not provided, TiProxy will still use host flag as its host
--tiproxy.port int                 Playground TiProxy port. If not provided, TiProxy will use 6000 as its port
--tiproxy.timeout int              TiProxy max wait time in seconds for starting, 0 means no limit (default 60)

启动演示如下:

tiup playground 7.0 --tag 7.0 --without-monitor --tiflash 0 --tiproxy 1

通过端口 6000 连接 tiproxy:

到此,tiproxy 已经启动成功,并成功通过 tiproxy 连接到后端 tidb 集群。由于篇幅有限,tiproxy 的功能演示、测试内容另行成文。