从零开始学TiDB(2)深入了解TiDB Server模块

TiDB Server 架构

 TiDB Server 的主要功能:

一条SQL的执行流程:

1.将整个SQL语句解析成一个个的token,生成一个树形结构。

 2.编译模块

1.首先需要做一个合法性验证,比如表存不存在等。

2.做逻辑优化:依据关系型代数等等价变换的规则做一些逻辑变换,比如:列裁剪,最大最小消除,谓词下推,子查询,谓词下推,把外连接变为内连接等等。

3.做物理优化:根据数据的分布,数据的大小,决定用哪个算子。比如:用全表扫描还是用索引扫描,用哪个索引等。

4.最终生成执行计划,拿着执行计划就到TiKV节点中取相应的数据,此外我们还需要统计信息(数据分布与行数)和元数据(表名,列名,索引名是什么等属性)。

关系型数据 进行KV转化操作流程

假设现在有一张聚簇表 编号为主键PK。

聚簇表其实就是把相同聚簇键放在相同或相邻的数据块中,这样从而提高了聚簇因子的效率,从而提高了查询速度。

首先主键就是天然的Key,把主键和其它数据分开。 

但在数据库中 编号为1的key肯定不止一个,也就是说它再数据库层面全局不是唯一的。所以我们需要再加一个表的编号

 这时候Value的每一行都有了一个唯一的Key。这样就转换成了KV的形式

 把所有的KEY VALUE存储在一块,就形成了region(每个region在96M-144M之间)。

 当region 达到144M的时候,会有一个region分裂的过程。把一个region分成两个region

 

 读写相关模块协作:

Onlie DDL相关模块协作:

 

 如图,TiDB Server可以有很多个 ,可能向多个TiDB Server 上执行DDL,在对于整个TiDB 数据库来讲,同一时刻只能由一个TiDB Server 做DDL操作,也就是workers。 也就是同一时刻,只有一个TiDB Server 中的workers可以做操作。

TiDB  DDL流程:

首先一个DDL过来,首先由TiDB Server 中的start job模块接收。接收之后,start job模块会把这个DDL 以job的形式放到TiKV中的job队列中。(感觉这里有点疑问,之前说TiDB Server的操作都要由TiKV client 发给TiKV,所以这里应该由start job模块发给TiKV client ,TiKV client 再以job的形式发给TiKV)

这个队列是所有TiDB Server接收的DDL job一个总的队列。在同一时间只有一个TiDB Server的角色为owner,owner中的worker模块负责从job队列中去取第一个job去执行(这个job可以不是owner发出的DDL,但也是由owner去执行),执行完再把该job放到history job。每个TiDB Server是轮换当owner的,谁成为owner,谁就激活workers去执行job队列。

job放到TiKV中是为了持久化 

GC机制与相关模块:

GC负责定期清理MVCC历史版本的数据。有一个GC会当选为GC leader,由它来执行GC操作。比如,现在是下午两点,计算出上午十点钟是一个safe point。 那么从上午十点到下午两点的数据都会保留,之前的数据将会由GCleader 清除。 

TiDB 会定期进行 GC。每次 GC 时,TiDB 首先会计算一个时间戳,称为“安全点”。然后,TiDB 会在确保安全点之后的所有快照都保留数据完整性的前提下,清除过时的数据。具体来说,每次 GC 过程涉及三个步骤:

  1. 解决锁。在此步骤中,TiDB 会扫描所有 Region 上安全点之前的锁,并清除这些锁。
  2. DROP TABLE删除范围。在此步骤中, /操作生成的整个范围的过时数据DROP INDEX将被快速清除。
  3. 执行 GC。在此步骤中,每个 TiKV 节点都会扫描其上的数据并删除每个键的不需要的旧版本。

默认配置下,每10分钟触发一次GC,每次GC会保留最近10分钟的数据,也就是说GC生命周期默认为10分钟(安全点=当前时间-GC生命周期)。如果一轮GC运行时间过长,在这一轮GC完成之前,即使到了触发下一次GC的时间,下一轮GC也不会启动。另外,为了让长事务在超过GC生命周期后仍能正常运行,安全点不会超过正在进行的事务的开始时间(start_ts)。

TiDB Server 的缓存

 

 热点小表缓存

当一张表只占一个region,又不能拆散,那么所在TiKV就会繁忙。

解决问题就是不要访问TiKV 了,直接把这张表放在内存的 cache table中。

 热点小表缓存原理:

首先,存到内存中的表大小需要小于64M。

如何保证读写一致?

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dbnet轻型网络文本检测 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” -------------------------------------------------------------…

玩《三角洲行动》遇到游戏运行故障是什么原因?游戏运行故障要怎么解决?预防游戏运行故障问题出现

《三角洲行动》游戏运行故障解析与解决方案:原因、解决与预防 在畅游《三角洲行动》这款充满挑战与激情的游戏时,玩家可能会遭遇各种游戏运行故障,如卡顿、闪退、无法启动等问题。我将结合自己丰富的经验和知识,为大家深入剖析《…

【Axure高保真原型】数值条件分组

今天和大家分享数值条件分组的原型模板,效果包括: 点击添加分组按钮,可以显示添加弹窗,填写分组名称和数值区间后,可以新增该分组信息‘’ 修改分组区间,可以直接在输入框里修改已有的分组区间&#xff0c…

「Mac畅玩鸿蒙与硬件40」UI互动应用篇17 - 照片墙布局

本篇将带你实现一个简单的照片墙布局应用,通过展示多张图片组成照片墙效果,用户可以点击图片查看其状态变化。 关键词 UI互动应用照片墙布局Grid 布局动态图片加载用户交互 一、功能说明 照片墙布局应用的特点: 动态加载多张图片组成网格布…

【Golang】Golang基础语法之面向对象:结构体和方法

面向对象——结构 Go 仅支持封装,不支持继承和多态;继承和多态要做的事情交给接口来完成,即——面向接口编程。Go 只有 struct,没有 class。 定义一个最简单的树节点(treeNode)结构,方法如下&…

AI 建站:Durable

网址:https://app.durable.co 步骤 1) 登录 2)点击创建新业务 3)填写信息后,点击创建 4)进入业务 5)生成网站 6)生成完成后不满意的话可以自己调整 7)点击保存 8)发布 …

UML箭线图的理解和实践

在软件开发的世界里,UML(统一建模语言)作为一种标准化的建模语言,扮演着举足轻重的角色。UML类图更是软件开发设计和架构过程中的核心工具,它不仅能帮助开发者明确系统中的类及其关系,还能为后续的代码实现…

centos7.6安装oracle 11g 保姆级教程

文章目录 一、配置基础环境1. 下载依赖2. 禁用linuxse3. 其他服务禁用4. 修改内核参数5. 修改limit6. 修改pam7. 创建用户组及目录8. 设置密码9. 设置目录10. 配置环境变量 安装jdk1. 获取默认安装信息: rpm -qa | grep java,如果得到如下信息则需要逐一…

使用Dapper创建一个简单的查询

1.先在NuGet上下载Dapper包 2.创建对应的model 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 数据显示 {public class User{public int UserId { get; set; }public…

SQL——DQL分组聚合

分组聚合: 格式: select 聚合函数1(聚合的列),聚合函数2(聚合的列) from 表名 group by 标识列; ###若想方便分辨聚合后数据可在聚合函数前加上标识列(以标识列进行分组) 常见的聚合函数: sum(列名):求和函数 avg(列名)…

第77期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…

nginx漏洞修复

漏洞名称:web服务器http信息头公开 解决,在以下各个监听端口加上一行,然后重启****nginx server_tokens off; 漏洞名称:默认的nginx http服务器设置 解决:请求头加上以下参数 add_header Content-Security-Policy “…

远程修改ESXi 6.7管理IP地址

1.启用安全Shell(也就是EXSi可以被SSH访问的功能) 2.使用SecureCRT SSH2连接ESXi主机,现在使用dcui并没有任何反应,在Session标签栏右键点击Disconnect。 The time and date of this login have been sent to the system logs.WA…

结构型-组合模式(Composite Pattern)

什么是组合模式 又名部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 结构 抽象根节点(Co…

【求助】Tinymce组件异常

版本号 { "tinymce/tinymce-vue": "^3.0.1", "tinymce": "^5.10.9", "vue": "^2.6.10", }问题: 就是红框处点击后没有菜单出现,下面是正常的

LabVIEW气缸摩擦力测试系统

基于LabVIEW的气缸摩擦力测试系统实现了气缸在不同工作状态下摩擦力的快速、准确测试。系统由硬件平台和软件两大部分组成,具有高自动化、精确测量和用户友好等特点,可广泛应用于精密机械和自动化领域。 ​ 项目背景: 气缸作为舵机关键部件…

在.NET 6中使用Serilog收集日志

此示例的完整详细信息:https://download.csdn.net/download/hefeng_aspnet/89998498 Serilog 是一个日志库,它提供对文件、控制台和其他几个地方的记录。它易于配置,并且具有干净且易于使用的界面。 Serilog具有无与伦比的输出目的地选择&…

使用Goland对6.5840项目进行go build出现异常

使用Goland对6.5840项目进行go build出现异常 Lab地址: https://pdos.csail.mit.edu/6.824/labs/lab-mr.html项目地址: git://g.csail.mit.edu/6.5840-golabs-2024 6.5840运行环境: mac系统 goland git clone git://g.csail.mit.edu/6.5840-golabs-2024 6.5840 cd 6.5840/src…

【Spring Cloud】实现微服务调用的负载均衡

文章目录 什么是负载均衡自定义实现负载均衡启动shop-product微服务通过nacos查看微服务的启动情况自定义实现负载均衡 基于Ribbon实现负载均衡添加注解修改服务调用的方法Ribbon支持的负载均衡策略通过修改配置来调整 Ribbon 的负载均衡策略通过注入Bean来调整 Ribbon 的负载均…

AUTOSAR AP和CP的安全要求规范(Safety Req)详细解读

一、规范的编制的背景原因 编制该规范的原因 确保系统安全性和可靠性 随着汽车电子系统日益复杂,功能不断增加,对安全性和可靠性的要求也越来越高。该规范为AUTOSAR平台在安全执行、配置、更新、信息交换、数据处理等多方面制定了明确要求,…