TiProxy 是 PingCAP 的官方代理组件,它放置在客户端和 TiDB server 之间,为 TiDB 提供负载均衡、连接保持、服务发现等功能。TiProxy 是 TiDB V8 版本引入的新特性,目前主要用于替代 HAProxy 等第三方软负载组件。在 TiProxy 实践过程中,目前也遇到过几个问题,并且积累了相关的实践经验。
TiProxy 连接不均衡
场景 1:连接端口指定错误导致
问题背景:
某用户反馈使用 TiProxy 后连接均衡不生效,所有连接打到一台 tidb server。
排查步骤:
- 首先确认 TiProxy 安装正常并且绑定成功
通过 tiup cluster display 查看 tiproxy 安装成功,通过 ip add 确认 vip 绑定成功
- 查看 vip 所在节点的 tiproxy 日志是否有错误
根据日志输出,结果并无异常
- 查看 cpu、内存、健康度等是否有异常
通过 curl <tidb_server_ip>:3080/api/backend/metrics 查看cpu、内存、健康度均为正常
TiProxy 默认的负载均衡策略有一个优先级顺序,因此此步骤是为了排查是否有相关异常导致连接不均,参考 https://docs.pingcap.com/zh/tidb/stable/tiproxy-load-balance/
- 查看 grafana 中 TiProxy 相关图表
首先查看 TiProxy -> Balance 查看连接迁移相关图表,发现没有相关数据,说明没有发生连接均衡
其次查看 TiProxy -> Server,发现均有相关内容,说明 TiProxy 安装正常
通过 grafana 图表可以发现 TiProxy 正常安装但并没任何连接均衡的动作,这可能是因为实际的客户连接并没有真正走到 TiProxy。
- 确认连接来源的地址配置
经最终确认,发现连接数据库 url 中虽然配置的是 vip 地址,但是端口号使用的是 4000,即 tidb server 的端口而并不是 TiProxy 代理的端口。因此所有连接均直接连接到 vip 所在那台 tidb server 上,问题定位。
问题根因:
通过以上分析,发现问题根因是连接应用的 jdbc url 中配置的 port 为 tidb server 的端口号而不是 TiProxy 端口。
场景 2:时钟不同步导致
问题背景:
在一个已经部署好的 tidb 集群中,通过 tiup cluster scale-out 增加 tiproxy 组件。之后再扩容新的 tidb server 节点,发现连接无法均衡到扩容的 tidb server 节点。
排查步骤:
- 查看 tiproxy 日志,报错显示 TiProxy fails to connect to TiDB...Access denied
- 进一步查看 tidb server 日志,提示 cannot migrate the current session: token expired
- 查看时钟偏差,发现时钟偏差较大,有超过一分钟的情况
TiProxy 连接依赖 ssl 认证,当节点时钟偏差较大时(60秒),将因为 token 过期而无法认证用户。增加时钟同步后问题消失。
问题根因:
节点时钟偏差导致 TiProxy 连接认证失败。
场景 3:未 reload tidb server 导致
问题背景:
通过 scale-out 扩容 tiproxy 后,连接无法均衡
排查步骤:
查看 tiproxy 日志,发现 tidb server 认证失败,此时查看相关的证书均已经生成。tiproxy 扩容后,需要 reload tidb server 才生效。
问题根因:
Tiproxy 扩容后,需要 reload tidb server。
TiProxy 连接透传
场景 1:配置 tidb 和 tiproxy 的 proxy-protocol
问题背景:
TiDB server 设置了连接透传,通过 TiProxy 连接时报错 please make sure TiDB proxy-protocol is set correctly.
排查步骤:
查看 TiProxy 是否配置了 proxy-protocol 参数,发现未配置。需要给 TiProxy 也配置相应的 proxy-protocol 并 reload TiProxy 组件(不需要重启,可以指定 --skip-restart)。
问题根因:
如果 tidb server 设置了连接透传,则 tiproxy 也需要设置 proxy.proxy-protocol: v2
场景 2:配置 tidb 的 proxy-protocol.fallbackable 为 true
问题背景:
Pd UI 节点(dashboard 节点)迁移到 TiProxy 所在的节点,导致 dashboard 访问报错,提示 authenticate failed,caused by: commands out of sync
排查步骤:
使用 tiup cluster show-config 查看拓扑文件配置,发现此节点配置了 proxy-protocol.networks。
登录 dashboard 是 PD 本机发的 MySQL 链接,所以并不会走 proxy 转发,需设置 fallback 为 true 并 reload tidb server。TiDB 配置文件描述
问题根因:
PD 本机发送的连接不会走 proxy 转发,需设置 proxy-protocol.fallbackable: true,接受属于 proxy-protocol.networks 客户端使用非 proxy 协议规范或没有发送 proxy 协议头的客户端连接。