目录
TiDB Server架构
Online DDL
GC
缓存管理
热点小表缓存
例题
TiDB Server架构
Protocol Layer:负责处理客户端的连接
Parse,Compile:负责SQL语句的解析与编译,并生成执行计划
Executor,DistSQL,KV:负责执行计划的执行
DistSQL:负责有关索引,扫描的处理(将复杂的SQL转化成对单表的查询)
KV:负责点查(点查则直接跳过逻辑优化和物理优化,直接下推至TiKV Coprocessor)
进行点查的条件:使用简单的SQL语句(select/update/delete)影响单表的1行或0行数据
Transaction,KV:负责事务的执行
PD Client:负责与PD的交互
TiKV Client:负责与TiKV的交互
schema load,worker,start job:负责Online DDL(DDL不阻塞线上业务)
memBuffer:缓存查询结果及元数据,登入认证信息,统计信息
cache table:热点小表缓存(表大小限制64mb)
热点小表有如下特点:(1)数据量不大,(2)只读或不经常被修改,(3)访问很频繁
Parse
词法分析lex
SQL语句的抽象,将其解析成token
语法分析yacc
生成AST语法树,供Compile优化
Complie
验证
合法性校验,如表是否存在等
逻辑优化
SQL语句层面的优化,如将外连接变为内连接等,生成逻辑执行计划
物理优化
结合统计信息和元数据,根据代价的大小,选择索引或扫描,生成物理执行计划
元数据包括如表名,列名,索引名等
Executor,DistSQL,Transaction,KV
DistSQL
负责将复杂的SQL语句转化为对单表查询
KV
负责简单SQL语句的执行,即点查,提交row KV request
Transaction
负责事务和锁的管理
运作过程:
以该表为例
转化为键值对
添加表ID
形成region
超出region大小限制(96MB-114MB),进行分裂(split)
分布存储至TiKV中
行数据的映射规则
Key:T{tableID}_r{rowID}
Value: [col1, col2, col3, col4,...]
ps:对于有主键的表,rowID可以为主键;对于没有主键的表,rowID由PD分配行
聚簇表与非聚簇表
聚簇表:key使用原有的主键,表编号+主键形成唯一的Key
非聚簇表:key不使用原有的主键 (但是可以有也可以没有主键),表编号+自动分配行id
Online DDL
进行DDL操作,不阻塞读写
1.对于整个TIDB数据库,同一时刻只能有一个Tidb server进行DDL操作
2.且同一时刻只能有一个Onwer,只有Onwer的workers处理DDL操作
(即只能有一个workers工作)
Onwer
同一时刻只能有一个TiDB Server成为Onwer;
Onwer不是固定的,而是有任期限制的,当任期结束后重新发起选取新的TiDB Server成为Onwer
当某个Tidb server成为owner后schema load将最新的表(schema)同步至缓存
ps:
Onwer的选举由ETCD提出
DDL语句是可并行执行:虽然只有一个Onwer,不可以并行job queue中的job,但可以并行执行add index queue和job queue中的job
GC
safe point:
safe point之前的历史数据均会被清理
GC_life_time参数设置,保留多长时间的历史版本
如GC_life_time=10min(10min内保留历史版本),safe point=10min
GC leader:控制整个集群的GC
缓存管理
tidb_mem_quta_query:决定每条SQL所占用的空间
com-action:当超过设置值的操作,如中断操作,生成日志等
热点小表缓存
表大小限制64MB
租约
设置租约的目的:解决对热点小表的修改,带来读写一致性问题(缓存内的表和TiKV内的表不一致)
使用tidb_table_cache_lease参数设置租约期
如tidb_table_cache_lease=5(租约期5s)
租约期内用户可以从内存中读,但不能写
租约到期后,缓存的表过期,用户即可读也可写(是对TiKV内的表进行修改,性能下降)
重新进入租约后,重新从TiKV中载入缓存,用户再次只能读不能写(refresh过程)
同时得出结论:租约不阻塞读,只阻塞写
例题
1.下列哪些模块直接与TiDB的事务处理有关?(选2项)
A.KV
B.Parse
C.Schema load
D.Transaction
E.GC
F.start job
答案:A,D
解析:Transaction(A),KV(D):负责事务的执行;Parse(B):负责SQL语句的解析;schema load(C):当TiDB Server当选为Owner时,将最新的表schema同步至缓存(E)GC:负责垃圾回收;start job(F):接收DDL语句
2.关于关系型数据与KV的转化,下列说法不正确的是?
A.如果没有定义主键,key中包含RowID,Index ID和Table ID,都是int64类型
B.Table ID在整个集群内唯一
C.如果定义了主键,那么将使用主键作为RowlD
D.不需要为每张表指定主键
答案:C
解析:A:表table id(全局唯一),索引index id,表中row id(64int类型,不管是否有主键,系统自动成);C:聚簇表需要主键作为Key,非聚簇表不需要主键作为Key,但可以使用主键,也可以不使用