0
0
0
0
专栏/.../

TiProxy 避坑指南

 数据源的TiDB学习之路  发表于  2025-04-06

TiProxy 是 PingCAP 的官方代理组件,它放置在客户端和 TiDB server 之间,为 TiDB 提供负载均衡、连接保持、服务发现等功能。TiProxy 是 TiDB V8 版本引入的新特性,目前主要用于替代 HAProxy 等第三方软负载组件。在 TiProxy 实践过程中,目前也遇到过几个问题,并且积累了相关的实践经验。

TiProxy 连接不均衡

场景 1:连接端口指定错误导致

问题背景:

某用户反馈使用 TiProxy 后连接均衡不生效,所有连接打到一台 tidb server。

排查步骤:

  1. 首先确认 TiProxy 安装正常并且绑定成功

通过 tiup cluster display 查看 tiproxy 安装成功,通过 ip add 确认 vip 绑定成功

  1. 查看 vip 所在节点的 tiproxy 日志是否有错误

根据日志输出,结果并无异常

  1. 查看 cpu、内存、健康度等是否有异常

通过 curl <tidb_server_ip>:3080/api/backend/metrics 查看cpu、内存、健康度均为正常

TiProxy 默认的负载均衡策略有一个优先级顺序,因此此步骤是为了排查是否有相关异常导致连接不均,参考 https://docs.pingcap.com/zh/tidb/stable/tiproxy-load-balance/

  1. 查看 grafana 中 TiProxy 相关图表

首先查看 TiProxy -> Balance 查看连接迁移相关图表,发现没有相关数据,说明没有发生连接均衡

其次查看 TiProxy -> Server,发现均有相关内容,说明 TiProxy 安装正常

通过 grafana 图表可以发现 TiProxy 正常安装但并没任何连接均衡的动作,这可能是因为实际的客户连接并没有真正走到 TiProxy。

  1. 确认连接来源的地址配置

经最终确认,发现连接数据库 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 协议头的客户端连接。

0
0
0
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论