TiProxy 负载均衡策略
在 TiProxy v1.0.0 中,TiProxy 仅支持基于 TiDB server 状态和连接数的负载均衡策略。从 v1.1.0 开始,TiProxy 新增了 5 种负载均衡策略:基于标签、健康度、内存、CPU 和地理位置。
默认配置下,这些策略的优先级从高到低依次为:
- 基于状态的负载均衡:当某个 TiDB server 正在关闭时,TiProxy 将连接从该 TiDB server 迁移到在线的 TiDB server。
- 基于标签的负载均衡:优先将请求路由到与 TiProxy 实例自身具有相同标签的 TiDB server,以实现计算层的资源隔离。
- 基于健康度的负载均衡:当某个 TiDB server 的健康度异常时,TiProxy 将连接从该 TiDB server 迁移到健康度正常的 TiDB server。
- 基于内存的负载均衡:当某个 TiDB server 存在 Out of Memory (OOM) 风险时,TiProxy 将连接从该 TiDB server 迁移到内存使用量较低的 TiDB server。
- 基于 CPU 的负载均衡:当某个 TiDB server 的 CPU 使用率远高于其他 TiDB server 时,TiProxy 将连接从该 TiDB server 迁移到 CPU 使用率较低的 TiDB server。
- 基于地理位置的负载均衡:优先将请求路由到地理位置上距离 TiProxy 较近的 TiDB server。
- 基于连接数的负载均衡:当某个 TiDB server 的连接数远高于其他 TiDB server 时,TiProxy 将连接从该 TiDB server 迁移到连接数较少的 TiDB server。
基于状态的负载均衡
TiProxy 定时通过 SQL 端口和状态端口检查 TiDB 是否已下线或正在关闭。
基于标签的负载均衡
基于标签的负载均衡优先将连接路由到与 TiProxy 自身具有相同标签的 TiDB server 上,从而实现计算层的资源隔离。该策略默认关闭,仅当你的业务需要隔离计算层的资源时才需要启用。
要启用基于标签的负载均衡,你需要:
- 通过
balance.label-name
指定用于匹配的标签名 - 配置 TiProxy 配置项
labels
- 配置 TiDB server 配置项
labels
配置完成后,TiProxy 会根据 balance.label-name
指定的标签名查找相应的配置,并将连接路由到标签值相同的 TiDB server。
例如,若应用包含交易和 BI 两类业务,为了避免相互影响,可以按照如下方式配置集群:
- 在 TiProxy 上配置
balance.label-name
为"app"
,表示将按照标签名"app"
匹配 TiDB server,并将连接路由到相同标签值的 TiDB server 上。 - 配置 2 台 TiProxy 实例,分别为配置项
labels
加上"app"="Order"
和"app"="BI"
。 - 将 TiDB 实例分为 2 组,分别为配置项
labels
加上"app"="Order"
和"app"="BI"
。 - 如果需要同时隔离存储层的资源,可配置 Placement Rules 或资源管控。
- 交易和 BI 业务的客户端分别连接到 2 台 TiProxy 的地址。
上述拓扑图的配置示例如下:
component_versions:
tiproxy: "v1.1.0"
server_configs:
tiproxy:
balance.label-name: "app"
tidb:
graceful-wait-before-shutdown: 15
tiproxy_servers:
- host: tiproxy-host-1
config:
labels: {app: "Order"}
- host: tiproxy-host-2
config:
labels: {app: "BI"}
tidb_servers:
- host: tidb-host-1
config:
labels: {app: "Order"}
- host: tidb-host-2
config:
labels: {app: "Order"}
- host: tidb-host-3
config:
labels: {app: "BI"}
- host: tidb-host-4
config:
labels: {app: "BI"}
tikv_servers:
- host: tikv-host-1
- host: tikv-host-2
- host: tikv-host-3
pd_servers:
- host: pd-host-1
- host: pd-host-2
- host: pd-host-3
基于健康度的负载均衡
TiProxy 通过从 Prometheus 查询 TiDB server 的错误数来判断 TiDB server 的健康度,当某个 TiDB server 的健康度异常而其他 TiDB server 正常时,TiProxy 将该 TiDB server 的连接迁移到其他 TiDB server 上,实现自动故障转移。
该策略适用于以下场景:
- TiDB server 向 TiKV 发送请求频繁失败,导致执行 SQL 频繁失败。
- TiDB server 向 PD 发送请求频繁失败,导致执行 SQL 频繁失败。
基于内存的负载均衡
TiProxy 通过从 Prometheus 查询 TiDB server 的内存使用率,当某个 TiDB server 内存快速上升或使用率很高时,TiProxy 将该 TiDB server 的连接迁移到其他 TiDB server 上,避免 OOM 导致不必要的连接断开。TiProxy 并不保证各个 TiDB server 的内存使用率接近,该策略仅在 TiDB server 存在 OOM 风险时生效。
当 TiDB server 出现 OOM 风险时,TiProxy 会尽量迁移该 TiDB server 的所有连接。通常情况下,如果 OOM 是由 Runaway Query 引起的,由于连接需等到事务结束才能迁移,因此正在执行中的 Runaway Query 不会迁移到其他 TiDB server 上重新执行。
该策略有以下限制:
- 当 TiDB server 的内存使用增长过快,在 30 秒内出现 OOM 时,TiProxy 可能无法及时判断 TiDB server 的 OOM 风险,因此仍可能断开连接。
- TiProxy 的目的是保持客户端连接不断开,而不是降低 TiDB server 的内存使用率以避免 OOM,因此 TiDB server 仍可能出现 OOM。
- 仅支持 v8.0.0 及以上版本的 TiDB server,当使用较低版本的 TiDB server 时该策略不生效。
基于 CPU 的负载均衡
TiProxy 通过从 Prometheus 查询 TiDB server 的 CPU 使用率,将连接从 CPU 使用率较高的 TiDB server 迁移到使用率较低的 TiDB server 上,降低整体的查询延迟。TiProxy 并不会保证各个 TiDB server 的 CPU 使用率完全一致,仅确保 CPU 使用率的差异不会过大。
该策略适用于以下场景:
- 当有后台任务(例如 Analyze)占用较多 CPU 资源时,执行后台任务的 TiDB server 的 CPU 使用率更高。
- 当不同连接上的工作负载差异较大时,即使各个 TiDB server 上的连接数接近,但 CPU 使用率差异较大。
- 当集群内 TiDB server 的 CPU 资源配置不同时,即使连接数均衡,实际的 CPU 使用率也不均衡。
基于地理位置的负载均衡
TiProxy 根据自身与 TiDB server 的地理位置,将连接优先路由到距离 TiProxy 较近的 TiDB server。
该策略适用于以下场景:
- 当 TiDB 集群在云上跨可用区部署时,为了降低 TiProxy 与 TiDB server 之间的跨可用区流量费用,TiProxy 优先将请求路由到同一可用区的 TiDB server 上。
- 当 TiDB 集群跨数据中心部署时,为了降低 TiProxy 与 TiDB server 之间的网络延迟,TiProxy 优先将请求路由到同一数据中心的 TiDB server 上。
该策略的优先级默认低于基于健康度、内存和 CPU 的负载均衡策略,你可以通过设置 policy
为 location
来提升该策略优先级,但建议确保同一地理位置的 TiDB server 至少有三台,以保证可用性和性能。
TiProxy 根据自身和 TiDB server 的 zone
标签确定各自的地理位置。你需要同时设置以下配置项:
- 在 TiDB server 的
labels
配置项中将zone
设置为当前可用区。配置方式请参阅设置 TiDB 的labels
。 - 在 TiProxy 的
labels
配置项中将zone
设置为当前可用区。
如果是使用 TiDB Operator 部署的集群,请参考数据的高可用进行配置。
以下是一个集群配置的示例:
component_versions:
tiproxy: "v1.1.0"
server_configs:
tidb:
graceful-wait-before-shutdown: 15
tiproxy_servers:
- host: tiproxy-host-1
config:
labels:
zone: east
- host: tiproxy-host-2
config:
labels:
zone: west
tidb_servers:
- host: tidb-host-1
config:
labels:
zone: east
- host: tidb-host-2
config:
labels:
zone: west
tikv_servers:
- host: tikv-host-1
- host: tikv-host-2
- host: tikv-host-3
pd_servers:
- host: pd-host-1
- host: pd-host-2
- host: pd-host-3
在以上配置中,tiproxy-host-1
与 tidb-host-1
的 zone
配置相同,因此 tiproxy-host-1
上的 TiProxy 会优先将请求路由到 tidb-host-1
上的 TiDB server。同理,tiproxy-host-2
上的 TiProxy 会优先将请求路由到 tidb-host-2
上的 TiDB server。
基于连接数的负载均衡
TiProxy 将连接从连接数较多的 TiDB server 迁移到连接数较少的 TiDB server。该策略不可配置且优先级最低。
TiProxy 通常根据 CPU 使用率来识别 TiDB server 的负载。该策略通常在以下场景下生效:
- TiDB 集群刚启动,所有 TiDB server 的 CPU 使用率接近 0,此时该策略防止启动时负载不均。
- 未启用基于 CPU 的负载均衡时,使用该策略确保负载均衡。
负载均衡策略配置
TiProxy 支持通过配置项 policy
配置上述负载均衡策略的组合和优先级。
resource
:资源优先策略,优先级顺序依次为基于状态、标签、健康度、内存、CPU、地理位置、连接数的负载均衡。location
:地理优先策略,优先级顺序依次为基于状态、标签、地理位置、健康度、内存、CPU、连接数的负载均衡。connection
:最小连接数策略,优先级顺序依次为基于状态、标签、连接数的负载均衡。
资源
关于 TiProxy 负载均衡策略更详细的信息,请参阅设计文档。