【Lesson 02】 TiDB Server

news2024/11/23 10:42:00

目录

 0 章节目标 

一 TiDB Server架构

 二 TiDB Server 作用​

三 TiDB Server 的进程

1 SQL语句的解析和编译

 2 SQL读写相关模块

3 在线DDL相关模块

4 GC机制与相关模块

四 TiDB Server的缓存

 1 TIDB的缓存组成

2 TiDB 缓存管理

3 热点小表缓存

4 热点小表缓存-原理


 0 章节目标 

  1. TiDB Server架构
  2. TiDB Server 作用
  3. TiDB Server 的进程
  4. TiDB Server 的缓存

一 TiDB Server架构

  • TiDB Server:SQL 层,对外暴露 MySQL 协议的连接 endpoint,负责接受客户端的连接,执行 SQL 解析和优化,最终生成分布式执行计划。TiDB 层本身是无状态的,实践中可以启动多个 TiDB 实例,通过负载均衡组件(如 LVS、HAProxy 或 F5)对外提供统一的接入地址,客户端的连接可以均匀地分摊在多个 TiDB 实例上以达到负载均衡的效果。TiDB Server 本身并不存储数据,只是解析 SQL,将实际的数据读取请求转发给底层的存储节点 TiKV(或 TiFlash)。

核心线程:

  • Protocal Layer /Parse/Compile线程  负责SQL语句的解析和编译SQL, 生成执行计划 
  • Execute 和  DistSQL  负责分批的执行SQL 的执行计划 
  • Transaction 和 KV 主要是事务相关
  • PD Client 负责与PD 交互
  • TIKV Client 负责与TIKV交互
  • schema load  worker  start job 负责 onlineDDL DD不会阻塞读写 
  • memBuffer 缓存区 缓存读取的数据 元数据 连接的认证信息,统计信息等

 二 TiDB Server 作用

  •  处理客户端的连接 对应模块Protocal Layer
  • SQL语句的解析和编译 对应 Parse/Compile
  • 关系型数据与KV的转化对应 
  • SQL语句执行 对应 模块 Execute  和   DistSQL(范围查询,全表扫描,走索引的)和  KV (点查,根据主键 唯一索引直接找到数据)
  • online DDL  对应 schema load  worker  start job 
  • 垃圾回收 MVCC的过期版本数据的回收
  • 热点小表缓存v6.0  与模块 cache table 

三 TiDB Server 的进程

1 SQL语句的解析和编译

词法分析 lex 

语法分析 yacc  生成树形结构

 

验证:表名列名是否存在等

逻辑优化 :

物理优化 :结合统计信息 选择全表扫描 或 索引扫描 ,如果选择索引 该使用哪个索引等

执行计划相当于导游图  

关系型数据库 例如Oracle或者MySQL 是以二维表的形式存储,如何转化为key-value的形式?

 编号为主键 想转化为聚簇表 

tableID_rowID 构成唯一key

 

Region是kv的存储单位, 默认是96M 当达到144M的时候会进行split,即region分裂的过程,将一个region分裂成2个region

以region为单位 ,region 里面是kv的键值对 ,可以分布式存储在tikv中 

 

 2 SQL读写相关模块

 SQL执行计划分为两种 :

复杂查询 例如 范围查询 表连接 嵌套查询 为了避免复杂SQL和tikv耦合太高 ,引入了DistSQL模块,把复杂SQL转换为对单表查询的SQL的组合。

点查 :point  根据主键和唯一索引的等值查询 点查 使用到kv 模块

TIKV client 向tikv集群发送交互请求

Transaction 如果语句中有事务 二阶段提交 锁的管理

PD client transaction通过PDclient与 PD交互 获取TSO

3 在线DDL相关模块

 在集群中有多个tidb server  .可能有多个DDL 发送到TiDB server上。但是同一时刻只能有一个TiDB server在做DDL

用户发出DDL语句 由模块 start job 模块接受,然后放到job queue队列中。

在同一时刻 只有一个tidb server的角色为owner ,owner角色的 tidb server中从 job queue队列中取DDL,执行完成之后放到history  queue中。

owner 角色有任期,并不是固定在一个Tidb Server上。

当成为owner后 ,schema load 会收集所有表的元数据。

队列放到TiKV上主要是为了持久化存储,一旦发生宕机断电可以防止数据丢失。

SQL执行流程中会详细介绍。

4 GC机制与相关模块

这里的GC是指数据库的GC ,并不是后端开发语言golang的GC 。

具体是  MVCC特性中的历史版本数据的回收 

数据历史版本的作用:闪回,改错了想改回来可以用到。

历史版本数据可能会很多,对存储空间产生一定压力,所以要定期清理历史版本数据,这个过程就叫做GC。

会有一个 TiDB  server 被选举为 GC leader ,TiDB  server 会计算出一个时间点 ,比如现在是下午14点钟,计算出一个时间戳 叫做 safe point ,是上午10点钟。这4个小时的历史数据是保留的,但是10点之前的数据不会保留。每10分钟触发一次,找到过期的数据,看上面有没有锁信息,优先处理被drop 的表或索引的历史版本,然后处理delete 等

相关参数 GC_life_time = 10min

四 TiDB Server的缓存

 1 TIDB的缓存组成

Tidb server的缓存实际上使用 全部内存。

1 SQL结果 ,SQL结果不是从TiKV中获取到的吗?但是有一些表连接,子查询等 无法从某一个TikV节点中把所有数据都获取到,可能需要的数据散落在多个TIKV节点,所以我需要一个TiDB server 吧 TiKV的数据汇聚起来,这些操作都是在 TiDB server缓存中完成的。几张大表做join ,对缓存的占用是很大的

另外还有事务修改,如果事务很大 ,改的数据也要放到缓存中 

2 线程缓存

3 元数据 统计信息 用户的用户密码 

2 TiDB 缓存管理

tidb_mem_quota_query :控制每个SQL语句可以使用的缓存量

oom-action  :当SQL使用的缓存超过tidb_mem_quota_query参数设置后 ,是中断返回error 还是记录日志。

在后面的故障分析中还会详细讲解 

3 热点小表缓存

我有一张表很小,不经常修改但 读取特别频繁,这就是热点表。由于这个热点表很小,所以存在一个region上,这个region所在的TiKV负载就会很高。这就是典型的热点问题。

把这个表都读出来 直接缓存到 TiDB的缓存中,这是非常有效的一个解决热点表的方法。

如果这个表需要修改,这个表在内存中也有 在磁盘上也有,需要先修改哪个地方的数据。

热点小表听起来很简单 ,但是要解决缓存与磁盘不一致的问题。

4 热点小表缓存-原理

如何把表放到缓存中 使用 alter  table table_name cache;

限制:这张表要小于 64M。

放进去后如何保证数据一致 tidb_table_cache_lease = 5 缓存的租约。这个参数模式5秒,这个小表到了缓存中有5秒的租约,在这5秒内可以读 ,但是不能写,阻塞了,要等待租约到期。

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/748666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

node基于express+mongodb项目的整体结构搭建和逻辑抽离

一、为什么需要逻辑抽离 这是我用express实现的一个缩减版的注册功能,如下: app.js const express require("express"); const app express();// 连接数据库 const mongoose require("mongoose"); // 连接数据库myTest mongoose.connect(…

python接口自动化(三十六)-封装与调用--流程类接口关联续集(详解)

简介 上一篇已经给大家都介绍过了流程类接口关联,但是由于博客的登录机制改变,所以没有办法给小伙伴们实战演练一下,那么这篇就按照上一篇计划的用jenkins来给小伙伴们演示一下流程类接口的封装和调用,其实很简单,就是…

RestTemplate和Sentinel整合

引入restTemplate EnableDiscoveryClient EnableFeignClients SpringBootApplication public class OrderApplication {BeanLoadBalanced//添加注解SentinelRestTemplateSentinelRestTemplatepublic RestTemplate getRestTemplate() {return new RestTemplate();}public stati…

【已解决】html元素如何使字体占据相同的元素显得整齐

本博文源于自身的亲身实践,让html的文本元素对齐,如果不让其对齐就会变得很丑陋,如下图,那么如何设置才能让元素占据相同呢? 文章目录 1、问题来源2、问题解决思路3、问题解决方案4、问题完整源码及效果 1、问题来源 …

animation.css无法显示动画效果问题解决

在使用【微信开发者工具】开发微信小程序时发现无法在开发者工具中展示出动画效果来 但是真机调试中可以正常的显示动画效果 【关于微信小程序中如何使用animation.css,参考微信小程序使用animation.css_THE WHY的博客-CSDN博客 】 同时发现在官网上点击各个动画并…

Django_POST请求的CSRF验证

目录 正常验证CSRF form表单 ajax的POST请求 关闭CSRF验证 源码等资料获取方法 django的POST接口发起请求默认清空下需要进行CSRF验证 正常验证CSRF form表单 如果form表单直接在标签之间添加{{ csrf_token }}就可以完成验证 ajax的POST请求 ajax的post需要在请求的he…

【Vue2.0源码学习】模板编译篇-模板解析阶段(整体运行流程)

文章目录 1. 前言2. 什么是模板编译3. 整体渲染流程4. 模板编译内部流程4.1 抽象语法树AST4.2 具体流程 5. 小总结6. 整体流程7. 回到源码8. 总结 1. 前言 在前几篇文章中,我们介绍了Vue中的虚拟DOM以及虚拟DOM的patch(DOM-Diff)过程,而虚拟DOM存在的必…

阿里云AliYun物联网平台使用-设备添加以及模拟设备端上云

一、前言 上一篇文章提到,我们已经申请了免费的阿里云平台,下面需要将我们的设备在阿里云上进行注册和申请,以便于我们的数据上云。 二、步骤 注册产品(设备模型) 在产品页面,点击 "创建产品" 。…

DevExpress WinForms TreeList控件,让业务数据展示更清晰!(一)

DevExpress WinForms的TreeList控件是一个功能齐全、数据感知的TreeView-ListView的混合体,它可以以树形、网格或两者结合的形式显示数据信息。无论是数据绑定模式还是非绑定模式,都具有完整的数据编辑支持。 PS:DevExpress WinForm拥有180组…

【测试开发】Junit 框架

目录 一. 认识 Junit 二. Junit 的常用注解 1. Test 2. Disabled 3. BeforeAll 4. AfterAll 5. BeforeEach 6. AfterEach 7. 执行测试 三. 参数化 1. 引入依赖 2. 单参数 3. 多参数 3.1 通过CSV实现 3.2 通过方法实现 4. 测试用例的执行顺序 四. 断言 五…

设计模式【结构型】-- 装饰者模式

装饰模式(Decorator Pattern) 定义 装饰者模式是一种结构型设计模式,它允许你动态地将新功能添加到对象中,通过将对象放入包含这些功能的特殊包装器对象中。这样一来,你可以在运行时通过组合不同的对象来扩展功能&…

用手机号注册亚马逊买家号需要注意什么问题

亚马逊平台的买家号可以用手机号注册也可以用邮箱进行注册,注册方法都是打开官网后点击注册,根据提示输入账号信息。当使用手机号注册亚马逊买家号时,有一些问题需要注意: 1、确保手机号的准确性:正确的手机号码非常重…

Android 系统的分区介绍

由于Android系统采用Linux架构,所以Android的系统分区可以类比同样采用Linux架构的操作系统(如Windows)。 Android系统分区分类 现在一般常见的Android分区方式共有三种,在不同的Android系统版本上会采用不同的分区方式。 1、传…

CentOS 7.8 Oracle 19C安装部署

CentOS 7.8 Oracle 19C安装部署 一、环境检查1、操作系统检查2、内存检查3、SWAP检查4、共享内存检查5、磁盘空间检查 二、YUM配置及RPM依赖包安装1、YUM源搭建2、 RPM依赖包安装 三、创建组、用户、目录1、创建组、用户2、创建目录 四、系统参数配置1、关闭防火墙2、配置域名解…

跟我一起从零开始学python(七)机器学习

前言 回顾之前讲了python语法编程 ,必修入门基础和网络编程,多线程/多进程/协程等方面的内容,昨天和今天讲到了数据库编程篇MySQL,Redis今天第三篇MongoDB篇,前面没看的也不用往前翻,系列文已经整理好了&a…

【Axure高保真原型】美化滚动条模板

今天和大家分享美化滚动条的原型模板,包括美化动态面板滚动条、页面滚动条、内联框架滚动条,其中内联框架滚动条是通过美化对应调用的页面的滚动条而美化,并不是直接美化内联框架的滚动条。具体效果可以观看下方视频或者打开预览地址体验&…

个人微信开发API,微信机器人。

微信个人号二次开发,基于API开发可以有很多功能模块 各种知名SCRM系统、客服平台都是根据此API二次开发的。 在这里插入图片描述 好友管理: 添加好友、 删除好友、 修改备注、 创建标签、 获取好友列表、 检测僵尸粉 设置个人头像 同意添加好友 获取好…

【面试题38】linux下面chmod和chown使用详解

文章目录 一、前言二、什么是 chmod 命令?2.1 使用方法:2.2 数值表示法:2.3 符号表示法: 三、什么是 chown 命令?3.1 使用方法:3.2 更改所有者和用户组: 四、使用示例4.1 使用 chmod 命令修改权…

想要逼疯项目经理,真的太简单了

早上好,我是老原。 最近有个小友来找我吐槽,说太崩溃了,带个项目太不容易了…… 此情此景,我已经脑补了各种抱头痛哭流涕的画面,油然升起一股同情。 其实,项目经理,听起来是个经理&#xff0…

echarts条形图动态显示2

1、实现效果,条形图自动滚动,鼠标移入停止滚动,移出继续滚动 2、代码 声明的变量:图表,图表数据与定时器 myChartArea: , dataArea: {categoryData: [],valueData: [],fullData: [], }, timeOut: null,设…