TiDB主要有TiDB Server、PD、TiKV和TiFlash三部分组成。具有水平扩容或者缩容、高可用、HTAP、分布式等特点。目前TiDB6.0兼容MySQL5.7协议。
TiDB Server
主要负责处理客户端的连接、SQL语句的解析和编译、关系型数据与KV的转换、SQL语句的执行、DDL执行、垃圾回收、热点小表缓存等。
- ProtocolLayer、Parse、Compile
这三个模块主要负责客户端连接以及SQL的解析编译。ProtocolLayer负责处理客户端的连接,Parse通过词法分析和语法分析来解析SQL语句,Compile经过合法性验证、逻辑优化、物理优化阶段,编辑SQL,生成执行计划。 - Executor、KV、DistSQL、Transaction
这四个模块主要负责SQL的执行,KV处理点查SQL,点查即根据主键或唯一索引查询单一记录,DistSQL处理复杂SQL查询,将复杂查询简化成单表查询,如果涉及到事务,则由Transaction模块处理,Executor负责总体执行调度。 - schemaLoad、startJob、worker
这三个模块主要负责online DDL的处理,schemaLoad加载最新元数据到TiDB Server中,startJob将DDL语句放入到对应的任务队列中,worker处理DDL任务队列中的任务,队列分为job queue(普通DDL处理队列)、index queue(索引处理队列)和history queue(处理完的队列)。 - memBuffer
负责缓存数据,包括SQL结果、线程缓存、元数据、统计信息等。 - cache table
热点小表缓存,针对特别小(小于64MB)、查询频繁、几乎不更新的表,可以设置为缓存,存在此模块。设置为热点小表后,不支持直接做DDL操作,需要先关闭。 - GC
负责定期清理MVCC机制产生的历史数据。 - PD Client
负责与PD模块通信。 - TiKV Client
负责与TiKV模块通信和region缓存。
PD(Placement Driver)
主要负责整个集群TiKV的元数据存储、分配全局ID和事务ID、生成TSO、收集集群信息进行调度、提供Label、提供TiDB Dashboard服务等。默认三节点,但只有一个Leader节点,是整个TiDB的大脑。
- TSO
TSO分配时,是异步分配,TiDB Server在解析编译SQL语句之前,会申请TSO,但不会阻塞,会继续执行解析编译,待完成后,异步获取分配完成的TSO。同时为解决并发问题,PD在生成TSO时,会通过时间窗口来减少IO次数,即在一定时间范围内(如3秒),批量生成TSO供使用。 - 调度
通过信息收集(TiKV节点周期性的向PD发送心跳数据)、生成调度(TiKV节点读写均衡、集群拓扑、缩容、故障恢复等)、执行调度三步,实现全局调度。 - Label与高可用
可以按照数据中心(zone)、机柜(rack)、主机(host)三个层次,标注Label,从而实现Region多副本均衡分布与高可用。当isolation-level设置为zone时,即实现Region的多副本不能在同一个数据中心,确保高可用。默认isolation-level=host,即Region多副本不在同一台主机上。
TiKV
主要负责数据持久化(行存)、副本强一致性的高可用、MVCC、分布式事务、Coprocessor等。
- 持久化
使用RocksDB作为持久化的DB,具备延迟极小、高性能Key-Value、同时保证性能和安全性、良好支持范围查询、性能随CPU数量线性提升等特点。在TiKV中有两个RocksDB实例,rocksdb-raft和rocksdb-kv,前者负责存储raft日志,后者负责存储kv数据,数据以region(一个region大小为98MB到144MB)的形式存在在不同的TiKV上。数据写入时,会先写入内存和日志,再异步写入到磁盘,并同步到其他副本中。数据查询时,会把查询率高的数据存入缓存(Block Cache)中,如缓存中没有,会依次读取内存和磁盘。 - 分布式事务
TiKV中有default(写入事务的数据)、Lock(写入事务的锁信息)、Write(写入事务的提交信息)三个列簇,通过事务悲观锁实现分布式事务。 - MVCC
Multi-Version Concurrency Control多版本并发控制,数据插入、修改、删除都是以插入的形式写入的库中,每条数据对应一条时间戳来确定版本,确保并发时读取到相应时间点的数据,写入时不阻塞读。 - Raft
Raft复制,实现多副本高可用,通过Propose(客户端将日志数据写入到raft中)、Append(将raft日志写入到Leader节点的rocksdb raft)、Replicate(将Leader的日志复制到副本节点)、Append(副本节点将日志持久化)、Committed(当大部分副本节点完成持久化后,仅代表日志写入完毕,并非是事务的提交)、Apply(将日志内的数据持久化到rocksdb-kv中)等步骤,实现副本复制。 - Coprocessor
协同处理器,做算子下推,将SQL计算放在TiKV上,做一些过滤和聚合,从而降低TiDBServer的CPU负载和网络带宽。
TiFlash
主要负责数据持久化(列存)、异步复制、一致性、高效率查询、业务隔离、智能选择、计算加速等。与TiKV数据完全一致,是TiKV的列存版本。
- 异步复制
通过TiKV日志异步复制,不参与Raft投票,不参与Raft选举,基于主键快速更新。 - 智能选择
通过分析SQL语句,智能选择是从TiVK读取数据,还是从TiFlash读取数据。