tikv两阶段提交

 

在 TiDB Dashboard 中,**事务的监控既需要关注 `start_ts`,也需要关注 `commit_ts`**,两者在不同场景下提供关键信息:

---

### **1. `start_ts` 的作用**
- **定义**:事务开始的逻辑时间戳,由 PD(Placement Driver)分配,唯一标识事务的起始点。
- **监控意义**- **事务启动时间**:通过 `start_ts` 可追踪事务何时开始执行。
  - **事务持续时间**:结合 `commit_ts`,计算 `commit_ts - start_ts` 可得到事务执行耗时,用于识别长事务。
  - **锁冲突诊断**:若事务长时间未提交(`commit_ts` 未生成),需检查 `start_ts` 对应的锁状态(是否被阻塞或超时)。

---

### **2. `commit_ts` 的作用**
- **定义**:事务提交的逻辑时间戳,表示事务的完成时间。
- **监控意义**- **事务提交时间**:确认事务何时被成功提交。
  - **数据可见性**:读操作基于 `commit_ts` 判断数据版本是否可见。
  - **延迟分析**:通过 `commit_ts` 可计算事务提交延迟,优化系统性能。

---

### **3. 实际监控场景示例**
#### **场景 1:长事务检测**
- **现象**:事务 A 的 `start_ts=100`,但长时间未生成 `commit_ts`。
- **分析**- 查看 TiDB Dashboard 的 **Slow Queries** 或 **Transaction Details**,确认事务是否卡在 Prewrite 或 Commit 阶段。
  - 检查 Lock 列中是否存在未释放的锁(可能因次级键冲突或节点故障导致)。
- **工具使用**:
  ```sql
  -- 通过 SQL 查询未提交的事务
  SELECT * FROM information_schema.cluster_tidb_trx WHERE start_ts = 100;
  ```

#### **场景 2:提交延迟优化**
- **现象**:事务的 `start_ts` 和 `commit_ts` 差值较大(例如 `commit_ts - start_ts = 500ms`)。
- **分析**- 检查网络延迟或 TiKV 节点的负载(通过 **TiDB Dashboard → Metrics → KV Duration**)。
  - 确认是否有热点 Region 或锁竞争(通过 **Key Visualizer** 或 **Locks** 面板)。

---

### **4. TiDB Dashboard 中的查看方法**
1. **事务详情页**- 路径:**TiDB Dashboard → SQL Statements → Transaction Details**- 显示字段:`start_ts`、`commit_ts`、事务状态(提交中/已提交)、涉及 Region 和耗时。
2. **慢查询分析**- 路径:**TiDB Dashboard → Slow Queries**- 筛选条件:按 `start_ts` 或 `commit_ts` 过滤长事务。
3. **锁冲突监控**- 路径:**TiDB Dashboard → Key Visualizer** 或 **Locks**- 观察锁持有时间,结合 `start_ts` 判断事务是否因锁冲突未提交。

---

### **5. 总结**
- **`start_ts`**:用于追踪事务的启动时间、执行时长和锁状态,是诊断未提交事务的核心依据。
- **`commit_ts`**:用于确认事务完成时间、计算提交延迟,并保障数据可见性。
- **二者结合**:在 TiDB Dashboard 中,需同时关注这两个时间戳:  
  - 若 `start_ts` 存在但无 `commit_ts` → 事务未提交,需检查锁或节点状态。  
  - 若 `commit_ts - start_ts` 过大 → 需优化事务逻辑或排查系统瓶颈。

 

在 TiDB 的监控体系中,**TiKV-Details** 页面确实包含事务相关的监控指标,但这些指标分散在多个子模块中,而非集中在一个名为“事务监控”的独立面板。以下是详细说明和操作指南:

---

### **1. TiKV-Details 中与事务相关的监控模块**
#### **1.1 Grpc 模块**
- **路径**:`TiKV-Details` → `Grpc`  
- **关键指标**- **Prewrite/Commit 请求的延迟和 QPS**  
    - `grpc_msg_duration_seconds{type="kv_prewrite"}`  
    - `grpc_msg_duration_seconds{type="kv_commit"}`  
  - **请求失败率**- `grpc_msg_fail{type="kv_prewrite"}`  
    - `grpc_msg_fail{type="kv_commit"}`  

- **作用**:  
  监控 Prewrite 和 Commit 阶段的性能,定位事务延迟或失败问题。

---

#### **1.2 Scheduler 模块**
- **路径**:`TiKV-Details` → `Scheduler`  
- **关键指标**- **锁冲突和重试**- `scheduler_too_busy`(调度器过载)  
    - `scheduler_leader_read_lease_expired`(锁冲突导致调度失败)  
  - **事务提交的排队时间**- `scheduler_command_duration_seconds{type="commit"}`  

- **作用**:  
  分析事务调度中的锁竞争和资源瓶颈。

---

#### **1.3 Lock Manager 模块**
- **路径**:`TiKV-Details` → `Lock Manager`  
- **关键指标**- **锁等待时间**:`lock_wait_time_seconds`  
  - **锁清理操作**:`lock_manager_handle_resolve`  
  - **死锁检测**:`deadlock_detect_duration`  

- **作用**:  
  诊断锁冲突、死锁及锁清理效率。

---

#### **1.4 Storage 模块**
- **路径**:`TiKV-Details` → `Storage`  
- **关键指标**- **异步写入延迟**:`storage_async_write_duration_seconds`  
  - **事务快照读取延迟**:`storage_snapshot_duration_seconds`  

- **作用**:  
  监控存储层的事务处理性能,如写入和读取延迟。

---

### **2. 如何通过监控定位事务问题**
#### **场景 1:事务提交延迟高**
- **操作步骤**1. 检查 `Grpc` → `kv_commit` 的延迟指标。  
  2. 若延迟高,进一步查看 `Scheduler` → `scheduler_command_duration_seconds{type="commit"}`,确认是否因调度排队导致延迟。  
  3. 结合 `Lock Manager` 的锁等待时间,判断是否因锁冲突导致提交阻塞。

---

#### **场景 2:锁冲突频繁**
- **操作步骤**1. 查看 `Lock Manager` → `lock_wait_time_seconds`,确认锁等待时间是否异常。  
  2. 检查 `Scheduler` → `scheduler_too_busy`,判断调度器是否因锁冲突过载。  
  3. 通过 SQL 查询具体锁信息:  
     ```sql
     SELECT * FROM information_schema.data_lock_waits;
     ```

---

#### **场景 3:事务预写失败**
- **操作步骤**1. 查看 `Grpc` → `kv_prewrite` 的失败率。  
  2. 检查 `Storage` → `storage_async_write_duration_seconds`,确认是否因存储层写入超时导致失败。  
  3. 排查热点 Region:通过 `TiKV-Details` → `Hotspot` 模块分析写入负载。

---

### **3. 常见误解与配置问题**
#### **3.1 误解:TiKV-Details 没有事务监控**
- **原因**:事务监控指标分散在多个模块(Grpc、Scheduler、Lock Manager 等),而非独立面板。  
- **解决方法**:按上述路径定位具体指标。

#### **3.2 监控数据缺失**
- **可能原因**- Prometheus 未正确采集 TiKV 指标(检查 `targets` 页面)。  
  - TiKV 版本过旧,不支持某些监控项(建议升级到最新版本)。  

---

### **4. 补充工具:TiDB Dashboard**
若需更高层级的事务分析(如查看具体事务的 `start_ts` 和 `commit_ts`),需使用 **TiDB Dashboard**- **路径**:`TiDB Dashboard` → `SQL Statements` → `Transaction Details`  
- **功能**- 列出所有活跃事务的 `start_ts` 和状态。  
  - 显示事务的 SQL 语句、涉及 Region 和耗时。  

---

### **5. 总结**
- **TiKV-Details 的事务监控指标**:分布在 Grpc、Scheduler、Lock Manager、Storage 等模块,需按场景组合使用。  
- **关键指标**- Prewrite/Commit 延迟(Grpc 模块)  
  - 锁冲突和等待时间(Lock Manager 模块)  
  - 事务调度效率(Scheduler 模块)  
- **高级分析**:结合 TiDB Dashboard 查看事务详情,定位具体 SQL 或锁问题。

 

posted on 2025-04-28 11:46  吃草的青蛙  阅读(65)  评论(0)    收藏  举报

导航