TIDB的结构
tidb主要由三部分组成:
1、tikv
tikv是tidb中存储数据的地方,以key-value格式存储,每一行对应一个key;
(1)、table的key对应格式如下:tablePrefix{tableID}_recordPrefixSep{rowID},tableID是唯一的、rowID在一个表内时唯一的;
(2)、索引的key分为两种情况:唯一索引和非唯一索引
唯一索引:tablePrefix{tableID}_indexPrefixSep{indexID}、
非唯一索引:tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue_rowID
这样保证每个key都是唯一的;
如: 一个表中有以下几行数据,其中第一列是主键,最后一列是可重复索引:
1, "TiDB", "SQL Layer", 10
2, "TiKV", "KV Engine", 20
3, "PD", "Manager", 30
则主键索引的存储格式是:
t10_r1 --> ["TiDB", "SQL Layer", 10]
t10_r2 --> ["TiKV", "KV Engine", 20]
t10_r3 --> ["PD", "Manager", 30]
可重复索引的存储格式是:
t10_i1_10_1 --> null
t10_i1_20_2 --> null
t10_i1_30_3 --> null
tikv上的数据是按region(区)为单位进行存储,每个区默认64M,每个区存储一段key的范围;
2、pd的功能:
1、PD 保存了 TiKV 集群的整体拓扑结构、每个 TiKV 节点(leader、副本等信息)的状态(通过心跳)、以及数据在各个节点上的分布情况(即 Region 分布,kv节点的redion对应的key范围)等关键元数据,动态调整 Region 分布以实现数据均衡;
2、PD 根据预设的策略(如 Region 大小、副本数、地域分布等)定期进行数据均衡操作,通过迁移 Region 的副本来避免数据热点、保证资源利用率,并确保在节点故障时有足够的副本可用。当 TiKV 节点发生故障或网络隔离时,PD 负责检测并触发故障转移流程,重新选举 Leader,确保数据的高可用性。
3、根据数据增长和查询需求,PD 自动触发 Region 的分裂(Split)和合并(Merge)操作,以维持合理的 Region 大小,优化查询性能。
4、PD 提供全局单调递增的时间戳服务,用于协调分布式事务中的时间顺序,确保事务的 ACID 特性。全局唯一 ID 分配:PD 分配全局唯一的 Region ID、Table ID、Index ID 等,确保在整个集群内标识符的唯一性。
5、监控与告警:PD 收集集群的运行状态和性能指标,支持通过 Prometheus 等工具进行监控,并提供告警功能。提供图形化界面(TiDB Dashboard)和命令行工具(pd-ctl)供管理员查看集群状态、执行管理操作。
3、TiDB server
TiDB Server 负责接收 SQL 请求,处理 SQL 相关的逻辑(语法解析、查询计划制定和优化、执行查询计划),并通过 PD 找到存储计算所需数据的 TiKV 地址,与 TiKV 交互获取数据,最终返回结果。TiDB Server 是无状态的,其本身并不存储数据,只负责计算,可以无限水平扩展,可以通过负载均衡组件(如LVS、HAProxy 或 F5)对外提供统一的接入地址。
举例说明一下查询的步骤:
select age from user where name="TiDB";
没有索引的情况:TiDB server接收到请求后根据表名从pd Server中获得表名分布在哪个kv节点的那个region上,对分区做扫描判断 name="TiDB" 的数据,每个kv节点将查询数据返回给ti server,ti server汇总后返回;
存在索引的情况:找到table中的索引列所在的key-value 区域,从区域中获取主键值,然后根据主键回表查询主键索引所在的region,然后获得数据;
MVCC多版本控制机制:
tidb也支持MVCC多版本机制,通过以下方式实现:
Key1-Version3 -> Value
Key1-Version2 -> Value
Key1-Version1 -> Value
详细文档参考:https://pan.baidu.com/s/19bfKzZLn7Ztm2fncN-IBHA?pwd=mrxz