The lifecycle of a SQL in TiDB

2021-02-11 18:02:20 浏览数 (1)

**导读**

> 作者:杨漆

> 16年关系型数据库管理,从oracle 9i 、10g、11g、12c到Mysql5.5、5.6、5.7、8.0 到TiDB获得3个OCP、2个OCM;运维路上不平坦,跌过不少坑、熬过许多夜。把工作笔记整理出来分享给大伙儿,希望帮到大家少走弯路、少熬夜。

1. 当Sql进入TiDB时先获取Token,事务开始时获取Start TS (异步方式获取)

2. 由Parse解析为AST树进行预处理(当开启Prepared Statement并命中时会跳过前两步)、逻辑优化(当开启Prepared Plan Cache并命中时会跳过前三步)、物理优化

3. 执行器根据Physical Plan 执行

4. 事务结束获取Commit TS,并进行Commit

5. 整个Sql运行结束

A. 在执行sql之前先获取Token 和Start TS ,Token用于限制sql的并发数,避免TiDB被资源耗尽而挂掉(如果获取Token耗时较高说明达到了Token上限,有sql排队等待)

B. 开始/提交事务都会向PD获取TSO,经历两个阶段:

I.Wait Duration  (延迟大时说明TiDB的负载高)  

II.RPC Duration  (延迟大时说明TiDB和PD之间的传输耗时大,或PD的负载高) 

1. parse的耗时(一般只有bash insert 时耗时高)、Compile的耗时(包括预处理和优化,一般在复杂查询时慢)从DashBoard对应面板可以看到

2. 开启Prepared statements 提高parse和预处理的开销(通过prepare statement count可查看该功能是否生效) 

3. 开启Prepared Plan cache,节省optimizing开销(通过Plan Cache hits可查看该功能是否生效) 

1. Execution duration 查看整体执行阶段耗时

2. Expensive execution查看复杂算子的OPS(可通过调整tidb_{operator}_concurrency来降低延迟)

3. Tikv请求耗时、region error导致延时过高(一般由region cache过期导致)、锁冲突高导致

1. DistSQL是TiDB 向Tikv发送请求、接收数据的接口

2. DiskSQL Duration可以看出DiskSQL请求的延时(tidb_distsql_scan_concurrency控制并发度参数,当延迟大时可调节该参数来降低延迟)

3. Scan Keys体现扫描的数据量,会影响延迟

1. 事务在Tikv的耗时高主要体现在 Local Latch 和 事务重试

2. Local Latch:Tidb在commit前对事务排序用的锁(默认为关闭),当锁冲突较多时可以打开。耗时情况在Dashboard的sql statement & slow queries 和Grafana的Local Latch Wait Time中可以监控到

3. 事务重试只在一部分事务出现错误时进行尝试(如:写冲突),重试次数在Dashboard的sqlstatement & slow queries 和 Grafana的Transaction Retry Num中可以监控到

1. Tikv通过gRPC接收到请求。

2. 写请求通过scheduleràraftstoreàRocksDBraftàRocksDB kv阶段

3. 读请求通过ReadpoolàRocksDB kv

4. 在RocksDB中先会WAL,访问memtable,若没命中访问block cache,还没命中就访问SST

1. gRPC上反映了TiKV请求的延迟,包括上图指标

2. TiDB上的kv request延迟是gRPC 网络延迟的总和(若kv request与gRPC差异大,证明TiDB和Tikv之间的网络延迟大 )

重写和重解析锁在Dashboard中以上两个位置可看到

1. Raft store 发生在写流程中,用来把raft log同步到所有的副本

2. 提raft log( raft propose)

3. 写数据(Raft IO):append log 是写在日志末尾、apply log 是应用到数据库中、commit log 是提交日志

如果Coprocessor等待时间高可以打开coprocessor cache

1. 每个Tikv有两个RocksDB实例,分别用于存储raft日志和KV数据

2. 读数据时先读Memtable,没有命中读block cache,再没命中读SST 

3. 写数据的相关 监控在write duration中查看

4. RocksDB在后台做compaction (operations 代表次数,duration代表耗时)

0 人点赞