TIDB——TIDB Server

一、TIDB核心组成部分以及功能

核心组成部分:

  • PD:负责调度
  • TIDB Server:负责计算
  • TIKV:负责存储

功能:

  • MySQL 无缝兼容
  • 无限水平扩展:计算、存储可独立扩容,数据自动分片,不用手动分库分表
  • 强一致高可用:数据多副本备份,节点故障自动恢复,不丢数据、不中断业务
  • OLTP+OLAP 一体化:既能跑高并发,又能直接做数据分析
  • 简单易运维:自动负载均衡、故障自愈,配套工具支持快速备份恢复、数据同步

二、具体介绍

TIDB Server

作用

解析SQL语句,将实际数据读取,转换为底层的TIKV的执行计划

架构


任务描述:三者负责sql解析和编译(优化),生成执行计划

protocol layer :处理客户端的连接

parse

compile

具体实现描述:

  • 通过协议层读取数据在parse 模块内解析通过词法分析 (lex)【讲sql语句解析成为一个个单位(token),保留关键字】与语法分析(yacc)【生成树形结构(ast)将单位进一步解析】

compile根据树形结构进行优化

具体实现过程

  • 通过合法性验证(表是否存在等)进行逻辑优化(sql语句层面优化,多余列去掉等)后进行物理优化(根据统计信息与元数据选择索引 还是全表扫描等

任务描述:执行执行计划

执行计划交给executor、distsql(扫描表后进行分类)、kv 分批执行执行计划

transaction 与kv负责事务的执行(写操作哇)

PD CLIENT 与tikv client负责关于PD (时间戳的获取)和tikv与TIDB Server之间的交互


任务描述:负责语句执行

shema work startjob


额外模块

membuffer缓存:存储读出来的数据、统计信息与元数据等信息

cache table-热点小表:缓存表不大,访问频繁,不常修改,64MB

访问频繁,tikv形成性能瓶颈:

办法:

  • 可以从tikv读入到TIDB Server的cache table中缓存

实现语句:alter table user cache

作用:增加吞吐量

难题:修改,这张表在内存也在tikv中如何修改?先写入cache table会出现数据不一致 ,先写入tikv会使用户读到过期数据。

解决办法(即原理):

  • 有一个缓存租约:tidb_table_cache_lease(/s),在租约内,用户无法进行写操作(数据来去自如)
  • 租约过期:缓存失效,用户的写操作在tikv中(可以读操作)-性能下降
  • 操作完毕-租约开启:tikv节点表中更新的数据刷新(refresh)到cache table中,读的用户在cache内读

重点功能

1.关系型数据与kv的转化

聚簇表:用表中原来的主键

key自动变成表名_ 表内的key ------即表名_key+value

  • 当数据构成(存入)一个region-96MB(TiDB v8.5 之前)当达到144MB就一分为二,可分布式存储在tikv节点中

随:TiDB v8.5 及之后 region-split-size默认值为256MB

非聚簇表:可有主键,可没有主键

2.垃圾回收

gc机制-------实现mvcc控制

修改时保存不同的数据版本(历史版本),当数据修改错误时,可改

问题:历史数据有点多怎么办,存储空间有压力?

解决:定期清理

实现:在集群中会有一个TIDB Server选为gc leader控制gc,参数safe point要是设置8点,八点以前的数据回收了当然还有个参数gc_life_time默认10min,10min以内,保留历史版本

清理:看是否有锁信息,删除数据,然后清理delete掉的数据等

小声bb:TIDB Server内的gc不是说go语言喔;每个TIDB Server都有一个gc模块


协作关系


1、读写相关模块

按照compile生成的AST解析,执行计划给到executor

executor后面具体走法

  • 一些比较复杂的sql查询(eg:表连接,子查询嵌套查询,范围扫描)交给distsql(提供一个简单的select方法(变成单表,但是会涉及多个region)接口给tikv
  • 点查(一行零行,例如主键(唯一)索引查询)走KV模块

tikv client负责向tikv发送读写请求

两种请求:

kv模块过来的request

distsql模块过来的request

若是涉及事务还会启动transaction模块(此模块负责二阶段提交以及锁) 事务提交时间:通过pd client拿到一个时间戳


2、在线ddl模块(不阻塞读写)

一个集群有多个TIDB Server

实现操作:同 间在集群中只能有一个TIDB Server在做ddl操作(worker内)

正在ddl的TIDB Server角色是owner,owner内的workers去取job 队列的第一个执行,完成后将次job放入history queue中

JOB流程------多个TIDB Server可同时放入的操作:用户发出一个ddl语句,由start job接收,作为一个任务(job)放在tikv(持久化)任务队列中

schema load 是成为owner角色 ,将最新的shema 表信息同步到内部shema中,根据这些信息执行job队列

要注意的是owner会变:因为tidb server有任期,会发起选举-激活另外的owner


缓存

具体缓存:

  • sql结果(表连接,事务很大)
  • 线程存储(活跃的线程)
  • 元数据,统计信息(解析,编译,身份认证信息等)

缓存管理参数

tidb_mem_quota_query:控制每条sql的限用缓存大小默认存储量

oom-action:决定当超过限用默认存储量,中断返回error,还是基于日志返回行为,有更近一步的了解


扩展知识:

  • 技术栈:指的是完成某项工作或开发某个项目所需的一系列技术、工具和框架 的组合;它通常包括 前端、后端、数据库、操作系统等多个层面的技术集合;核心思想:将多种技术有机地组合在一起,实现特定的功能或目标
  • TIDB属于分层架构

更于2025-12-10-0:27:30

相关推荐
李广坤3 小时前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
初次攀爬者1 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
爱可生开源社区1 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1771 天前
《从零搭建NestJS项目》
数据库·typescript
加号32 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏2 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐2 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再2 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest2 天前
数据库SQL学习
数据库·sql
jnrjian2 天前
ORA-01017 查找机器名 用户名 以及library cache lock 参数含义
数据库·oracle