Skip to content

Commit 470d8f0

Browse files
Auto-sync: Update Chinese docs from English PR
Synced from: pingcap/docs#22708 Target PR: pingcap#21649 AI Provider: azure Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
1 parent 45f98fc commit 470d8f0

4 files changed

Lines changed: 244 additions & 20 deletions

File tree

br/br-log-architecture.md

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,35 @@ summary: 了解 TiDB 的日志备份与 PITR 的架构设计。
1717

1818
日志备份的流程如下:
1919

20-
![BR log backup process design](/media/br/br-log-backup-ts.png)
20+
```mermaid
21+
sequenceDiagram
22+
actor User
23+
participant BR
24+
participant PD
25+
participant TiKV
26+
participant TiDB
27+
participant Storage
28+
29+
User->>BR: 运行 `br log start`
30+
BR->>PD: 注册日志备份任务
31+
TiKV->>PD: 获取日志备份任务
32+
par TiKV 处理本地日志备份任务
33+
loop
34+
TiKV->>TiKV: 读取 KV 变更数据
35+
TiKV->>PD: 获取全局 checkpoint ts
36+
TiKV->>TiKV: 生成本地元信息
37+
TiKV->>Storage: 上传日志数据和元信息
38+
TiKV->>PD: 配置 GC
39+
end
40+
and
41+
loop
42+
TiDB->>TiKV: 监控备份进度
43+
TiDB->>PD: 上报全局 checkpoint ts
44+
end
45+
end
46+
User->>BR: 运行 `br log status`
47+
BR->>PD: 获取日志备份任务状态
48+
```
2149

2250
系统组件和关键概念:
2351

@@ -53,7 +81,29 @@ summary: 了解 TiDB 的日志备份与 PITR 的架构设计。
5381

5482
PITR 的流程如下:
5583

56-
![Point-in-time recovery process design](/media/br/pitr-ts.png)
84+
```mermaid
85+
sequenceDiagram
86+
actor User
87+
participant BR
88+
participant TiKV
89+
participant PD
90+
participant Storage
91+
92+
User->>BR: 运行 `br restore point`
93+
BR->>TiKV: 恢复全量数据
94+
loop 恢复日志数据
95+
BR->>Storage: 读取备份数据
96+
BR->>PD: 获取 Region 信息
97+
BR->>TiKV: 请求 TiKV 恢复数据
98+
loop TiKV 处理恢复请求
99+
TiKV->>Storage: 下载 KV
100+
TiKV->>TiKV: 重写 KV
101+
TiKV->>TiKV: 应用 KV
102+
end
103+
TiKV->>BR: 上报恢复结果
104+
BR->>BR: 处理所有恢复结果
105+
end
106+
```
57107

58108
完整的 PITR 交互流程描述如下:
59109

br/br-snapshot-architecture.md

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,28 @@ summary: 了解 TiDB 快照备份与恢复功能的架构设计。
1717

1818
集群快照数据备份的流程如下:
1919

20-
![snapshot backup process design](/media/br/br-snapshot-backup-ts.png)
20+
```mermaid
21+
sequenceDiagram
22+
actor User
23+
participant BR
24+
participant PD
25+
participant TiKV
26+
participant Storage
27+
28+
User->>BR: 运行 `br backup full`
29+
BR->>PD: 暂停 GC
30+
BR->>PD: 获取 TiKV 和 Region 信息
31+
BR->>TiKV: 请求 TiKV 备份数据
32+
loop TiKV 处理本地快照备份任务
33+
TiKV->>TiKV: 扫描 KV
34+
TiKV->>TiKV: 生成 SST
35+
TiKV->>Storage: 上传 SST
36+
end
37+
TiKV->>BR: 报告备份结果
38+
BR->>BR: 处理所有备份结果
39+
BR->>TiKV: 备份 schema
40+
BR->>Storage: 上传备份元信息
41+
```
2142

2243
完整的备份交互流程描述如下:
2344

@@ -49,7 +70,27 @@ summary: 了解 TiDB 快照备份与恢复功能的架构设计。
4970

5071
恢复集群快照备份数据的流程如下:
5172

52-
![snapshot restore process design](/media/br/br-snapshot-restore-ts.png)
73+
```mermaid
74+
sequenceDiagram
75+
actor User
76+
participant BR
77+
participant PD
78+
participant TiKV
79+
participant Storage
80+
81+
User->>BR: 运行 `br restore`
82+
BR->>PD: 暂停 Region 调度
83+
BR->>TiKV: 恢复 schema
84+
BR->>PD: 切分并打散 Region
85+
BR->>TiKV: 请求 TiKV 恢复数据
86+
loop TiKV 处理恢复请求
87+
TiKV->>Storage: 下载 SST
88+
TiKV->>TiKV: 重写 KV
89+
TiKV->>TiKV: 导入 SST
90+
end
91+
TiKV->>BR: 报告恢复结果
92+
BR->>BR: 处理所有恢复结果
93+
```
5394

5495
完整的恢复交互流程描述如下:
5596

dm/feature-shard-merge-pessimistic.md

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,35 @@ DM 在悲观模式下进行分表 DDL 的迁移有以下几点使用限制:
7979

8080
基于上述例子,本部分介绍了 DM 在默认的悲观模式下合库合表过程中进行 DDL 迁移的实现原理。
8181

82-
![shard-ddl-flow](/media/dm/shard-ddl-flow.png)
82+
```mermaid
83+
---
84+
config:
85+
themeCSS: |
86+
/* hide the ugly borders */
87+
rect.rect {
88+
stroke: none;
89+
}
90+
---
91+
sequenceDiagram
92+
autonumber
93+
box rgba(0,255,0,0.08)
94+
participant Worker1 as DM-worker 1
95+
end
96+
box rgba(255,255,0,0.08)
97+
participant Master as DM-master
98+
end
99+
box rgba(0,255,0,0.08)
100+
participant Worker2 as DM-worker 2
101+
end
102+
103+
Worker1->>Master: 1. DDL info
104+
Master->>Worker1: 2. DDL lock info
105+
Worker2->>Master: 3. DDL info
106+
Master->>Worker2: 4. DDL lock info
107+
Master->>Worker1: 5. DDL execute request
108+
Worker1->>Master: 6. DDL executed
109+
Master-->>Worker2: 7. DDL ignore request
110+
```
83111

84112
在这个例子中,DM-worker-1 负责迁移来自 MySQL 实例 1 的数据,DM-worker-2 负责迁移来自 MySQL 实例 2 的数据,DM-master 负责协调多个 DM-worker 间的 DDL 迁移。
85113

pessimistic-transaction.md

Lines changed: 120 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -141,31 +141,128 @@ TiDB 在悲观事务模式下支持了 2 种隔离级别:
141141

142142
## 悲观事务提交流程
143143

144-
TiDB 悲观锁复用了乐观锁的两阶段提交逻辑,重点在 DML 执行时做了改造
144+
在事务提交流程中,悲观事务和乐观事务的逻辑相同。两者都采用两阶段提交(2PC)模式。悲观事务的重要适配点在于 DML 执行
145145

146-
![TiDB 悲观事务的提交流程](/media/pessimistic-transaction-commit.png)
147-
148-
在两阶段提交之前增加了 Acquire Pessimistic Lock 阶段,简要步骤如下。
146+
```mermaid
147+
---
148+
config:
149+
themeCSS: |
150+
/* workaround for https://github.com/mermaid-js/mermaid/issues/523 */
151+
/* mark the two "Lock" arrows as red, by restyling the dashed arrows */
152+
line.messageLine1 {
153+
stroke: #d32f2f;
154+
stroke-dasharray: none !important;
155+
}
156+
/* make sure the arrow heads inherit the stroke color (another bug in mermaid) */
157+
#arrowhead path {
158+
fill: context-stroke;
159+
stroke: context-stroke;
160+
}
161+
---
162+
sequenceDiagram
163+
participant Client
164+
participant TiDB
165+
participant TiKV
166+
167+
Client->>TiDB: BEGIN
168+
rect rgba(255, 0, 0, 0.08)
169+
Client->>TiDB: DML
170+
TiDB-->>TiKV: Lock
171+
TiDB-->>TiKV: Lock
172+
end
173+
rect rgba(0, 0, 0, 0.04)
174+
Client->>TiDB: COMMIT
175+
TiDB->>TiKV: Prewrite
176+
TiDB->>TiKV: Commit
177+
end
178+
```
149179

150-
1. (同乐观锁)TiDB 收到来自客户端的 begin 请求,获取当前时间戳作为本事务的 StartTS。
151-
2. TiDB 收到来自客户端的更新数据的请求:TiDB 向 TiKV 发起加悲观锁请求,该锁持久化到 TiKV。
152-
3. (同乐观锁)客户端发起 commit,TiDB 开始执行与乐观锁一样的两阶段提交。
180+
悲观事务在 2PC 之前增加了 `Acquire Pessimistic Lock` 阶段。该阶段包括以下步骤:
153181

154-
![TiDB 中的悲观事务](/media/pessimistic-transaction-in-tidb.png)
182+
1. (同乐观事务模式)TiDB 收到来自客户端的 `begin` 请求,当前时间戳即为该事务的 start_ts。
183+
2. 当 TiDB 服务器收到来自客户端的写请求时,TiDB 服务器会向 TiKV 服务器发起悲观锁请求,并将该锁持久化到 TiKV 服务器。
184+
3. (同乐观事务模式)当客户端发送 commit 请求时,TiDB 开始执行与乐观事务模式类似的两阶段提交。
155185

156-
相关细节本节不再赘述,详情可阅读 [TiDB 悲观锁实现原理](https://pingkai.cn/tidbcommunity/blog/7730ed79)。
186+
```mermaid
187+
---
188+
title: Pessimistic Transaction in TiDB
189+
---
190+
sequenceDiagram
191+
participant client
192+
participant TiDB
193+
participant PD
194+
participant TiKV
195+
196+
client->>TiDB: begin
197+
TiDB->>PD: get ts as start_ts
198+
loop execute SQL
199+
rect rgba(0, 0, 0, 0.04)
200+
alt do read
201+
TiDB->>TiKV: get data from TiKV with start_ts
202+
TiDB->>client: return read result
203+
else do write
204+
rect rgba(255, 0, 0, 0.08)
205+
loop if has write conflict
206+
TiDB->>PD: get ts as for_update_ts
207+
TiDB->>TiDB: write in cache
208+
TiDB->>TiKV: acquire pessimistic locks parallelly
209+
end
210+
end
211+
TiDB->>client: return write result
212+
end
213+
end
214+
end
215+
client->>TiDB: commit
216+
opt start 2PC
217+
rect rgba(0, 0, 0, 0.04)
218+
par prewrite
219+
TiDB->>TiKV: prewrite each key in cache with start_ts parallelly
220+
end
221+
end
222+
rect rgba(0, 0, 0, 0.04)
223+
par commit
224+
TiDB->>PD: get ts as commit_ts
225+
TiDB->>TiKV: commit primary_key with commit_ts first
226+
TiDB->>client: success
227+
TiDB->>TiKV: commit each secondary_key with commit_ts parallelly
228+
end
229+
end
230+
end
231+
```
157232

158233
## Pipelined 加锁流程
159234

160-
加悲观锁需要向 TiKV 写入数据,要经过 Raft 提交并 apply 后才能返回,相比于乐观事务,不可避免的会增加部分延迟。为了降低加锁的开销,TiKV 实现了 pipelined 加锁流程:当数据满足加锁要求时,TiKV 立刻通知 TiDB 执行后面的请求,并异步写入悲观锁,从而降低大部分延迟,显著提升悲观事务的性能。但当 TiKV 出现网络隔离或者节点宕机时,悲观锁异步写入有可能失败,从而产生以下影响:
235+
加悲观锁需要向 TiKV 写入数据。只有在经过 Raft 提交并 apply 后,TiKV 才能向 TiDB 返回加锁成功的响应。因此,相比乐观事务,悲观事务模式不可避免地具有更高的延迟。
236+
237+
为了降低加锁的开销,TiKV 实现了 pipelined 加锁流程:当数据满足加锁要求时,TiKV 立刻通知 TiDB 执行后续请求,并异步写入悲观锁。该流程降低了大部分延迟,显著提升了悲观事务的性能。但是,当 TiKV 发生网络隔离或者 TiKV 节点宕机时,悲观锁的异步写入可能失败,并产生以下影响:
161238

162-
* 无法阻塞修改相同数据的其他事务。如果业务逻辑依赖加锁或等锁机制,业务逻辑的正确性将受到影响
239+
* 无法阻塞修改相同数据的其他事务。如果应用逻辑依赖加锁或等锁机制,应用逻辑的正确性将受到影响
163240

164-
* 有较低概率导致事务提交失败,但不会影响事务正确性
241+
* 有较低概率导致事务提交失败,但不会影响事务的正确性
165242

166-
如果业务逻辑依赖加锁或等锁机制,或者即使在集群异常情况下也要尽可能保证事务提交的成功率,应关闭 pipelined 加锁功能。
243+
<CustomContent platform="tidb">
167244

168-
![Pipelined pessimistic lock](/media/pessimistic-transaction-pipelining.png)
245+
如果应用逻辑依赖加锁或等锁机制,或者你希望即使在 TiKV 集群异常的情况下也尽可能保证事务提交的成功率,则应关闭 pipelined 加锁功能。
246+
247+
```mermaid
248+
---
249+
title: pipelined pessimistic lock
250+
---
251+
sequenceDiagram
252+
participant Client
253+
participant TiDB
254+
participant TiKV1
255+
participant TiKV2
256+
participant TiKV3
257+
258+
loop
259+
Client->>TiDB: DML
260+
TiDB->>TiKV1: Acquire pessimistic locks
261+
TiKV1->>TiDB: OK
262+
TiKV1--)TiKV2: Log replication
263+
TiKV1--)TiKV3: Log replication
264+
end
265+
```
169266

170267
该功能默认开启,可修改 TiKV 配置关闭:
171268

@@ -174,14 +271,22 @@ TiDB 悲观锁复用了乐观锁的两阶段提交逻辑,重点在 DML 执行
174271
pipelined = false
175272
```
176273

177-
若集群是 v4.0.9 及以上版本,也可通过[在线修改 TiKV 配置](/dynamic-config.md#在线修改-tikv-配置)功能动态关闭该功能:
274+
若 TiKV 集群为 v4.0.9 及以上版本,也可通过[在线修改 TiKV 配置](/dynamic-config.md#在线修改-tikv-配置)功能动态关闭该功能:
178275

179276
{{< copyable "sql" >}}
180277

181278
```sql
182279
set config tikv pessimistic-txn.pipelined='false';
183280
```
184281

282+
</CustomContent>
283+
284+
<CustomContent platform="tidb-cloud">
285+
286+
如果应用逻辑依赖加锁或等锁机制,或者你希望即使在 TiKV 集群异常的情况下也尽可能保证事务提交的成功率,可以[联系 TiDB Cloud 支持](/tidb-cloud/tidb-cloud-support.md)关闭 pipelined 加锁功能。
287+
288+
</CustomContent>
289+
185290
## 内存悲观锁
186291

187292
TiKV 在 v6.0.0 中引入了内存悲观锁功能。开启内存悲观锁功能后,悲观锁通常只会被存储在 Region leader 的内存中,而不会将锁持久化到磁盘,也不会通过 Raft 协议将锁同步到其他副本,因此可以大大降低悲观事务加锁的开销,提升悲观事务的吞吐并降低延迟。

0 commit comments

Comments
 (0)