|
| 1 | +--- |
| 2 | +title: TiProxy 负载均衡策略 |
| 3 | +summary: 介绍 TiProxy 的负载均衡策略及其适用场景。 |
| 4 | +--- |
| 5 | + |
| 6 | +# TiProxy 负载均衡策略 |
| 7 | + |
| 8 | +在 TiProxy v1.0.0 中,TiProxy 仅支持基于 TiDB server 状态和连接数的负载均衡策略。从 v1.1.0 开始,TiProxy 新增了 5 种负载均衡策略:基于标签、健康度、内存、CPU 和地理位置。 |
| 9 | + |
| 10 | +默认配置下,这些策略的优先级从高到低依次为: |
| 11 | + |
| 12 | +1. 基于状态的负载均衡:当某个 TiDB server 正在关闭时,TiProxy 将连接从该 TiDB server 迁移到在线的 TiDB server。 |
| 13 | +2. 基于标签的负载均衡:优先将请求路由到与 TiProxy 实例自身具有相同标签的 TiDB server,以实现计算层的资源隔离。 |
| 14 | +3. 基于健康度的负载均衡:当某个 TiDB server 的健康度异常时,TiProxy 将连接从该 TiDB server 迁移到健康度正常的 TiDB server。 |
| 15 | +4. 基于内存的负载均衡:当某个 TiDB server 存在 Out of Memory (OOM) 风险时,TiProxy 将连接从该 TiDB server 迁移到内存使用量较低的 TiDB server。 |
| 16 | +5. 基于 CPU 的负载均衡:当某个 TiDB server 的 CPU 使用率远高于其他 TiDB server 时,TiProxy 将连接从该 TiDB server 迁移到 CPU 使用率较低的 TiDB server。 |
| 17 | +6. 基于地理位置的负载均衡:优先将请求路由到地理位置上距离 TiProxy 较近的 TiDB server。 |
| 18 | +7. 基于连接数的负载均衡:当某个 TiDB server 的连接数远高于其他 TiDB server 时,TiProxy 将连接从该 TiDB server 迁移到连接数较少的 TiDB server。 |
| 19 | + |
| 20 | +如需调整负载均衡策略的优先级,请参考[负载均衡策略配置](#负载均衡策略配置)。 |
| 21 | + |
| 22 | +## 基于状态的负载均衡 |
| 23 | + |
| 24 | +TiProxy 定时通过 SQL 端口和状态端口检查 TiDB 是否已下线或正在关闭。 |
| 25 | + |
| 26 | +## 基于标签的负载均衡 |
| 27 | + |
| 28 | +基于标签的负载均衡优先将连接路由到与 TiProxy 自身具有相同标签的 TiDB server 上,从而实现计算层的资源隔离。该策略默认关闭,仅当你的业务需要隔离计算层的资源时才需要启用。 |
| 29 | + |
| 30 | +要启用基于标签的负载均衡,你需要: |
| 31 | + |
| 32 | +- 通过 [`balance.label-name`](/tiproxy/tiproxy-configuration.md#label-name) 指定用于匹配的标签名 |
| 33 | +- 配置 TiProxy 配置项 [`labels`](/tiproxy/tiproxy-configuration.md#labels) |
| 34 | +- 配置 TiDB server 配置项 [`labels`](/tidb-configuration-file.md#labels) |
| 35 | + |
| 36 | +配置完成后,TiProxy 会根据 `balance.label-name` 指定的标签名查找相应的配置,并将连接路由到标签值相同的 TiDB server。 |
| 37 | + |
| 38 | +例如,若应用包含交易和 BI 两类业务,为了避免相互影响,可以按照如下方式配置集群: |
| 39 | + |
| 40 | +1. 在 TiProxy 上配置 [`balance.label-name`](/tiproxy/tiproxy-configuration.md#label-name) 为 `"app"`,表示将按照标签名 `"app"` 匹配 TiDB server,并将连接路由到相同标签值的 TiDB server 上。 |
| 41 | +2. 配置 2 台 TiProxy 实例,分别为配置项 [`labels`](/tiproxy/tiproxy-configuration.md#labels) 加上 `"app"="Order"` 和 `"app"="BI"`。 |
| 42 | +3. 将 TiDB 实例分为 2 组,分别为配置项 [`labels`](/tidb-configuration-file.md#labels) 加上 `"app"="Order"` 和 `"app"="BI"`。 |
| 43 | +4. 如果需要同时隔离存储层的资源,可配置 [Placement Rules](/configure-placement-rules.md) 或[资源管控 (Resource Control)](/tidb-resource-control-ru-groups.md)。 |
| 44 | +5. 交易和 BI 业务的客户端分别连接到 2 台 TiProxy 的地址。 |
| 45 | + |
| 46 | +<img src="https://docs-download.pingcap.com/media/images/docs-cn/tiproxy/tiproxy-balance-label.png" alt="基于标签的负载均衡" width="600" /> |
| 47 | + |
| 48 | +上述拓扑图的配置示例如下: |
| 49 | + |
| 50 | +```yaml |
| 51 | +component_versions: |
| 52 | + tiproxy: "v1.1.0" |
| 53 | +server_configs: |
| 54 | + tiproxy: |
| 55 | + balance.label-name: "app" |
| 56 | + tidb: |
| 57 | + graceful-wait-before-shutdown: 15 |
| 58 | +tiproxy_servers: |
| 59 | + - host: tiproxy-host-1 |
| 60 | + config: |
| 61 | + labels: {app: "Order"} |
| 62 | + - host: tiproxy-host-2 |
| 63 | + config: |
| 64 | + labels: {app: "BI"} |
| 65 | +tidb_servers: |
| 66 | + - host: tidb-host-1 |
| 67 | + config: |
| 68 | + labels: {app: "Order"} |
| 69 | + - host: tidb-host-2 |
| 70 | + config: |
| 71 | + labels: {app: "Order"} |
| 72 | + - host: tidb-host-3 |
| 73 | + config: |
| 74 | + labels: {app: "BI"} |
| 75 | + - host: tidb-host-4 |
| 76 | + config: |
| 77 | + labels: {app: "BI"} |
| 78 | +tikv_servers: |
| 79 | + - host: tikv-host-1 |
| 80 | + - host: tikv-host-2 |
| 81 | + - host: tikv-host-3 |
| 82 | +pd_servers: |
| 83 | + - host: pd-host-1 |
| 84 | + - host: pd-host-2 |
| 85 | + - host: pd-host-3 |
| 86 | +``` |
| 87 | +
|
| 88 | +## 基于健康度的负载均衡 |
| 89 | +
|
| 90 | +TiProxy 查询 TiDB server 的错误数来判断 TiDB server 的健康度,当某个 TiDB server 的健康度异常而其他 TiDB server 正常时,TiProxy 将该 TiDB server 的连接迁移到其他 TiDB server 上,实现自动故障转移。 |
| 91 | +
|
| 92 | +该策略适用于以下场景: |
| 93 | +
|
| 94 | +- TiDB server 向 TiKV 发送请求频繁失败,导致执行 SQL 频繁失败。 |
| 95 | +- TiDB server 向 PD 发送请求频繁失败,导致执行 SQL 频繁失败。 |
| 96 | +
|
| 97 | +## 基于内存的负载均衡 |
| 98 | +
|
| 99 | +TiProxy 查询 TiDB server 的内存使用率,当某个 TiDB server 内存快速上升或使用率很高时,TiProxy 将该 TiDB server 的连接迁移到其他 TiDB server 上,避免 OOM 导致不必要的连接断开。TiProxy 并不保证各个 TiDB server 的内存使用率接近,该策略仅在 TiDB server 存在 OOM 风险时生效。 |
| 100 | +
|
| 101 | +当 TiDB server 出现 OOM 风险时,TiProxy 会尽量迁移该 TiDB server 的所有连接。通常情况下,如果 OOM 是由 Runaway Query 引起的,由于连接需等到事务结束才能迁移,因此正在执行中的 Runaway Query 不会迁移到其他 TiDB server 上重新执行。 |
| 102 | +
|
| 103 | +该策略有以下限制: |
| 104 | +
|
| 105 | +- 当 TiDB server 的内存使用增长过快,在 30 秒内出现 OOM 时,TiProxy 可能无法及时判断 TiDB server 的 OOM 风险,因此仍可能断开连接。 |
| 106 | +- TiProxy 的目的是保持客户端连接不断开,而不是降低 TiDB server 的内存使用率以避免 OOM,因此 TiDB server 仍可能出现 OOM。 |
| 107 | +- 仅支持 v8.0.0 及以上版本的 TiDB server,当使用较低版本的 TiDB server 时该策略不生效。 |
| 108 | +
|
| 109 | +## 基于 CPU 的负载均衡 |
| 110 | +
|
| 111 | +TiProxy 查询 TiDB server 的 CPU 使用率,将连接从 CPU 使用率较高的 TiDB server 迁移到使用率较低的 TiDB server 上,降低整体的查询延迟。TiProxy 并不会保证各个 TiDB server 的 CPU 使用率完全一致,仅确保 CPU 使用率的差异不会过大。 |
| 112 | +
|
| 113 | +该策略适用于以下场景: |
| 114 | +
|
| 115 | +- 当有后台任务(例如 Analyze)占用较多 CPU 资源时,执行后台任务的 TiDB server 的 CPU 使用率更高。 |
| 116 | +- 当不同连接上的工作负载差异较大时,即使各个 TiDB server 上的连接数接近,但 CPU 使用率差异较大。 |
| 117 | +- 当集群内 TiDB server 的 CPU 资源配置不同时,即使连接数均衡,实际的 CPU 使用率也不均衡。 |
| 118 | +
|
| 119 | +## 基于地理位置的负载均衡 |
| 120 | +
|
| 121 | +TiProxy 根据自身与 TiDB server 的地理位置,将连接优先路由到距离 TiProxy 较近的 TiDB server。 |
| 122 | +
|
| 123 | +该策略适用于以下场景: |
| 124 | +
|
| 125 | +- 当 TiDB 集群在云上跨可用区部署时,为了降低 TiProxy 与 TiDB server 之间的跨可用区流量费用,TiProxy 优先将请求路由到同一可用区的 TiDB server 上。 |
| 126 | +- 当 TiDB 集群跨数据中心部署时,为了降低 TiProxy 与 TiDB server 之间的网络延迟,TiProxy 优先将请求路由到同一数据中心的 TiDB server 上。 |
| 127 | +
|
| 128 | +该策略的优先级默认低于基于健康度、内存和 CPU 的负载均衡策略,你可以通过设置 [`policy`](/tiproxy/tiproxy-configuration.md#policy) 为 `location` 来提升该策略优先级,但建议确保同一地理位置的 TiDB server 至少有三台,以保证可用性和性能。 |
| 129 | + |
| 130 | +TiProxy 根据自身和 TiDB server 的 `zone` 标签确定各自的地理位置。你需要同时设置以下配置项: |
| 131 | + |
| 132 | +- 在 TiDB server 的 [`labels`](/tidb-configuration-file.md#labels) 配置项中将 `zone` 设置为当前可用区。配置方式请参阅[设置 TiDB 的 `labels`](/schedule-replicas-by-topology-labels.md#设置-tidb-的-labels可选)。 |
| 133 | +- 在 TiProxy 的 [`labels`](/tiproxy/tiproxy-configuration.md#labels) 配置项中将 `zone` 设置为当前可用区。 |
| 134 | + |
| 135 | +如果是使用 TiDB Operator 部署的集群,请参考[数据的高可用](https://docs.pingcap.com/zh/tidb-in-kubernetes/stable/configure-a-tidb-cluster#数据的高可用)进行配置。 |
| 136 | + |
| 137 | +以下是一个集群配置的示例: |
| 138 | + |
| 139 | +```yaml |
| 140 | +component_versions: |
| 141 | + tiproxy: "v1.1.0" |
| 142 | +server_configs: |
| 143 | + tidb: |
| 144 | + graceful-wait-before-shutdown: 15 |
| 145 | +tiproxy_servers: |
| 146 | + - host: tiproxy-host-1 |
| 147 | + config: |
| 148 | + labels: |
| 149 | + zone: east |
| 150 | + - host: tiproxy-host-2 |
| 151 | + config: |
| 152 | + labels: |
| 153 | + zone: west |
| 154 | +tidb_servers: |
| 155 | + - host: tidb-host-1 |
| 156 | + config: |
| 157 | + labels: |
| 158 | + zone: east |
| 159 | + - host: tidb-host-2 |
| 160 | + config: |
| 161 | + labels: |
| 162 | + zone: west |
| 163 | +tikv_servers: |
| 164 | + - host: tikv-host-1 |
| 165 | + - host: tikv-host-2 |
| 166 | + - host: tikv-host-3 |
| 167 | +pd_servers: |
| 168 | + - host: pd-host-1 |
| 169 | + - host: pd-host-2 |
| 170 | + - host: pd-host-3 |
| 171 | +``` |
| 172 | + |
| 173 | +在以上配置中,`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。 |
| 174 | + |
| 175 | +## 基于连接数的负载均衡 |
| 176 | + |
| 177 | +TiProxy 将连接从连接数较多的 TiDB server 迁移到连接数较少的 TiDB server。该策略不可配置且优先级最低。 |
| 178 | + |
| 179 | +TiProxy 通常根据 CPU 使用率来识别 TiDB server 的负载。该策略通常在以下场景下生效: |
| 180 | + |
| 181 | +- TiDB 集群刚启动,所有 TiDB server 的 CPU 使用率接近 0,此时该策略防止启动时负载不均。 |
| 182 | +- 未启用[基于 CPU 的负载均衡](#基于-cpu-的负载均衡)时,使用该策略确保负载均衡。 |
| 183 | + |
| 184 | +## 负载均衡策略配置 |
| 185 | + |
| 186 | +TiProxy 支持通过配置项 [`policy`](/tiproxy/tiproxy-configuration.md#policy) 配置上述负载均衡策略的组合和优先级。 |
| 187 | + |
| 188 | +- `resource`:资源优先策略,优先级顺序依次为基于状态、标签、健康度、内存、CPU、地理位置、连接数的负载均衡。 |
| 189 | +- `location`:地理优先策略,优先级顺序依次为基于状态、标签、地理位置、健康度、内存、CPU、连接数的负载均衡。 |
| 190 | +- `connection`:最小连接数策略,优先级顺序依次为基于状态、标签、连接数的负载均衡。 |
| 191 | + |
| 192 | +## 资源 |
| 193 | + |
| 194 | +关于 TiProxy 负载均衡策略更详细的信息,请参阅[设计文档](https://github.com/pingcap/tiproxy/blob/main/docs/design/2024-02-01-multi-factor-based-balance.md)。 |
0 commit comments