TiDB PCTA认证备考笔记-02-TiDB Server
TiDB Server
1.TiDB Server架构
Protocol Layer:负责处理客户端的连接
Parse和compile:负责解析和编译,生成执行计划
Executor:负责生成执行计划
DistSQL:范围扫描,全表扫描,索引等由他负责
KV:点查,根据主键唯一索引等由他负责
Transaction和KV:负责处理事务
2.TiDB主要功能
- 处理客户端的连接
- SQL语句的解析和编译
- 关系型数据与KV数据的转换
- SQL语句的执行
- Online DDL的执行
- GC(垃圾回收)
- 热点小表缓存(V6.0)
3.SQL语句的解析和编译
4.关系型数据与KV的转化
当设置一列为主键时,可将其主键当成Key来进行标识,其他的列的值则为Value。但是以主键列作为Key时,有可能其他表中也会有相同的Key,此时则需要通过原有主键Key基础上加上一个表编号作为唯一Key。
这每个键值对的集合,就构成了一个Region,当Region的大小达到144MB时,则会分成2个Region,分别存放在多个TiKV中。
5.SQL语句的执行
- SQL读写模块
Execute在收到执行计划后,会将复杂的Select查询,分解成一个一个的单表查询(在DistSQL中),然后再进行组合,最后再交由TiKV进行处理(这里单指复杂SQL)
Execute在收到执行计划后,如果是简单SQL(索引,主键,点查类),会直接由KV模块处理(简单获取单行的请求)
上面这两种最后都会与TiKV Client交互,发给TiKV集群
类似于Transaction事务这种,都会交给Transaction模块,完成两段式的锁提交
在Transaction模块启动时,必定是一个事务,这就必定会需要一个事务开始时间和事务结束时间,这个时间就需要与PD Client与PD进行交互
6.Online DDL的执行
- 在线DDL模块(DDL操作不会阻塞读写)
用户发出DDL语句后,有Start Job模块接收,在接收并发送到TiKV中的JOB队列中,同时,在所有TiDB Server中,有一个Owner可以执行DDL语句,按照Job队列中的顺序依次执行,这个由Workers模块执行(每个TiDB都有,不过只有在Owner时会执行)。在执行完后,会将Job队列中的DDL Job放到TiKV模块中的History Queue中。
关于Owner这个角色,会有一个任期时间,超过这个时间,会重新进行选举,在激活Owner角色后,Schema Load模块会启动,更新最新的Schema信息,存放在其中(放在TiKV中是因为需要持久化,TiDB执行掉线也不会丢失DDL操作)
7.垃圾回收(GC)
在修改数据后,TiKV不会删掉原有数据,而是会将其标识为历史版本,实现了MVCC。但是这样的话会造成多个版本存在其中,造成版本过多,此时就需要对其进行回收。
GC会有一个Safe Point来保障几点之前的数据进行回收(GC life time默认10分钟)
8.热点小表缓存
-
TiDB Server缓存的构成
- SQL结果:复杂查询无法从一个TiKV获取所有结果,所以多个TiKV的数据会先存在缓存中
线程缓存 - 元数据,统计信息(认证信息,用户名密码也存放在其中)
- SQL结果:复杂查询无法从一个TiKV获取所有结果,所以多个TiKV的数据会先存在缓存中
-
TiDB Server缓存管理
- tidb_mem_quota_query:每个查询限制内存
- oom-action:超过上面内存值之后反应
-
应用场景
- 表的数据量不大
- 只读表或者修改不频繁的表
- 表的访问很频繁
开启小表缓存
tidb_table_cache_lease=5(5秒内都可以从内存中读取缓存)
这也是一个租约,租约期间内的修改将发生阻塞
租约到期,数据过期,写操作将不被阻塞,但是读写需要到TiKV中执行,在数据更新完毕后,租约继续开启,同时阻塞写。
- 热点小表总结:
- TiDB对于每张缓存表的大小限制为64MB
- 适用于查询频繁,数据量不大,极少修改的场景
- 在租约(tidb_table_cache_lease)时间内,写操作会被阻塞
- 租约到期后,读性能会下降
- 不支持对缓存表的直接DDL操作,需要先关闭
- 对于表加载慢或者极少修改的表,可以适当延长时间,保持读性能稳定