Skip to content

Commit 82c3f9d

Browse files
Oreoxmtti-chi-bot
authored andcommitted
This is an automated cherry-pick of pingcap#19952
Signed-off-by: ti-chi-bot <ti-community-prow-bot@tidb.io>
1 parent c31c889 commit 82c3f9d

File tree

4 files changed

+622
-1
lines changed

4 files changed

+622
-1
lines changed

tidb-monitoring-api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ curl http://127.0.0.1:10080/schema_storage/test
8282

8383
- PD API 地址:`http://${host}:${port}/pd/api/v1/${api_name}`
8484
- 默认端口:2379
85-
- 各类 `api_name` 详细信息:参见 [PD API Doc](https://download.pingcap.com/pd-api-doc.html)
85+
- 各类 `api_name` 详细信息:参见 [PD API Doc](https://docs-download.pingcap.com/api/pd-api/pd-api-doc.html)
8686

8787
通过该接口可以获取当前所有 TiKV 节点的状态以及负载均衡信息。下面以一个单节点的 TiKV 集群为例,说明用户需要了解的信息:
8888

tiproxy/tiproxy-load-balance.md

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
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

Comments
 (0)