TiDB 架构及设计实现

一. TiDB的核心特性

高度兼容 MySQL

     大多数情况下,无需修改代码即可从 MySQL 轻松迁移至 TiDB,分库分表后的 MySQL 集群亦可通过 TiDB 工具进行实时迁移。

水平弹性扩展

     通过简单地增加新节点即可实现 TiDB 的水平扩展,按需扩展吞吐或存储,轻松应对高并发、海量数据场景。

分布式事务

     TiDB 100% 支持标准的 ACID 事务。

高可用

     相比于传统主从 (M-S) 复制方案,基于 Raft 的多数派选举协议可以提供金融级的 100% 数据强一致性保证,且在不丢失大多数副本的前提下,可以实现故障的自动恢复 (auto-failover),无需人工介入。

一站式 HTAP 解决方案

    TiDB 作为典型的 OLTP 行存数据库,同时兼具强大的 OLAP 性能,配合 TiSpark,可提供一站式 HTAP 解决方案,一份存储同时处理 OLTP & OLAP,无需传统繁琐的 ETL 过程。

云原生 SQL 数据库

           TiDB 是为云而设计的数据库,同 Kubernetes 深度耦合,支持公有云、私有云和混合云,使部署、配置和维护变得十分简单。

二.TiDB 整体架构

TiDB Server

     TiDB Server 负责接收SQL请求,处理SQL相关的逻辑,并通过PD找到存储计算所需数据的TiKV地址,与TiKV交互获取数据,最终返回结果。TiDB Server 是无状态的,其本身并不存储数据,只负责计算,可以无限水平扩展,可以通过负载均衡组件(LVS、HAProxy或F5)对外提供统一的接入地址。

PD Server

     Placement Driver(简称PD)是整个集群的管理模块,其主要工作有三个:一是存储集群的元信息(某个Key存储在那个TiKV节点);二是对TiKV集群进行调度和负载均衡(如数据的迁移、Raft group leader的迁移等);三是分配全局唯一且递增的事务ID。

PD 是一个集群,需要部署奇数个节点,一般线上推荐至少部署3个节点。PD在选举的过程中无法对外提供服务,这个时间大约是3

TiKV Server

     TiKV Server 负责存储数据,从外部看TiKV是一个分布式的提供事务的Key-Value存储引擎。存储数据的基本单位是Region,每个Region负责存储一个Key Range(从StartKey到EndKey的左闭右开区间)的数据,每个TiKV节点会负责多个Region。TiKV使用Raft协议做复制,保持数据的一致性和容灾。副本以Region为单位进行管理,不同节点上的多个Region构成一个Raft Group,互为副本。数据在多个TiKV之间的负载均衡由PD调度,这里也就是以Region为单位进行调度

 

三. 存储结构

一个 Region 的多个 Replica 会保存在不同的节点上,构成一个 Raft Group。其中一个 Replica 会作为这个 Group 的 Leader,其他的 Replica 作为 Follower。所有的读和写都是通过 Leader 进行,再由 Leader 复制给 Follower。

Key-Value 模型

TiDB对每个表分配一个TableID,每一个索引都会分配一个IndexID,每一行分配一个RowID(如果表有整形的Primary Key,那么会用Primary Key的值当做RowID),其中TableID在整个集群内唯一,IndexID/RowID 在表内唯一,这些ID都是int64类型。每行数据按照如下规则进行编码成Key-Value pair:

Key: tablePrefix_rowPrefix_tableID_rowID

Value: [col1, col2, col3, col4]

其中Key的tablePrefix/rowPrefix都是特定的字符串常量,用于在KV空间内区分其他数据。对于Index数据,会按照如下规则编码成Key-Value pair

Key: tablePrefix_idxPrefix_tableID_indexID_indexColumnsValue

Value: rowID

Index 数据还需要考虑Unique Index 和 非 Unique Index两种情况,对于Unique Index,可以按照上述编码规则。但是对于非Unique Index,通常这种编码并不能构造出唯一的Key,因为同一个Index的tablePrefix_idxPrefix_tableID_indexID_都一样,可能有多行数据的ColumnsValue都是一样的,所以对于非Unique Index的编码做了一点调整:

Key: tablePrefix_idxPrefix_tableID_indexID_ColumnsValue_rowID

Value:null

这样能够对索引中的每行数据构造出唯一的Key。注意上述编码规则中的Key里面的各种xxPrefix都是字符串常量,作用都是用来区分命名空间,以免不同类型的数据之间互相冲突,定义如下:

var(

tablePrefix     = []byte{'t'}

recordPrefixSep = []byte("_r")

indexPrefixSep  = []byte("_i")

)

举个简单的例子,假设表中有3行数据:

1,“TiDB”, “SQL Layer”, 10

2,“TiKV”, “KV Engine”, 20

3,“PD”, “Manager”, 30

那么首先每行数据都会映射为一个Key-Value pair,注意,这个表有一个Int类型的Primary Key,所以RowID的值即为这个Primary Key的值。假设这个表的Table ID 为10,其中Row的数据为:

t_r_10_1 --> ["TiDB", "SQL Layer", 10]

t_r_10_2 --> ["TiKV", "KV Engine", 20]

t_r_10_3 --> ["PD", "Manager", 30]

除了Primary Key之外,这个表还有一个Index,假设这个Index的ID为1,其数据为:

t_i_10_1_10_1 --> null

t_i_10_1_20_2 --> null

t_i_10_1_30_3 --> null

Database/Table 都有元信息,也就是其定义以及各项属性,这些信息也需要持久化,我们也将这些信息存储在TiKV中。每个Database/Table都被分配了一个唯一的ID,这个ID作为唯一标识,并且在编码为Key-Value时,这个ID都会编码到Key中,再加上m_前缀。这样可以构造出一个Key,Value中存储的是序列化后的元数据。除此之外,还有一个专门的Key-Value存储当前Schema信息的版本。TiDB使用Google F1的Online Schema变更算法,有一个后台线程在不断的检查TiKV上面存储的Schema版本是否发生变化,并且保证在一定时间内一定能够获取版本的变化(如果确实发生了变化)。

四. SQL 运算

用户的 SQL 请求会直接或者通过 Load Balancer 发送到 tidb-server,tidb-server 会解析 MySQL Protocol Packet,获取请求内容,然后做语法解析、查询计划制定和优化、执行查询计划获取和处理数据。数据全部存储在 TiKV 集群中,所以在这个过程中 tidb-server 需要和 tikv-server 交互,获取数据。最后 tidb-server 需要将查询结果返回给用户。

五. 

调度的流程

PD 不断的通过 Store 或者 Leader 的心跳包收集信息,获得整个集群的详细数据,并且根据这些信息以及调度策略生成调度操作序列,每次收到 Region Leader 发来的心跳包时,PD 都会检查是否有对这个 Region 待进行的操作,通过心跳包的回复消息,将需要进行的操作返回给 Region Leader,并在后面的心跳包中监测执行结果。

注意这里的操作只是给 Region Leader 的建议,并不保证一定能得到执行,具体是否会执行以及什么时候执行,由 Region Leader 自己根据当前自身状态来定。

信息收集

调度依赖于整个集群信息的收集,需要知道每个TiKV节点的状态以及每个Region的状态。TiKV集群会向PD汇报两类信息:

(1)每个TiKV节点会定期向PD汇报节点的整体信息。

      TiKV节点(Store)与PD之间存在心跳包,一方面PD通过心跳包检测每个Store是否存活,以及是否有新加入的Store;另一方面,心跳包中也会携带这个Store的状态信息,主要包括:

a)  总磁盘容量

b)  可用磁盘容量

c)  承载的Region数量

d)  数据写入速度

e) 发送/接受的Snapshot数量(Replica之间可能会通过Snapshot同步数据)

f)   是否过载

g)  标签信息(标签是否具备层级关系的一系列Tag)

(2)每个 Raft Group 的 Leader 会定期向 PD 汇报Region信息

     每个Raft Group 的 Leader 和 PD 之间存在心跳包,用于汇报这个Region的状态,主要包括下面几点信息:

a)   Leader的位置

b)   Followers的位置

c)   掉线Replica的个数

d)   数据写入/读取的速度

    PD 不断的通过这两类心跳消息收集整个集群的信息,再以这些信息作为决策的依据。

     除此之外,PD 还可以通过管理接口接受额外的信息,用来做更准确的决策。比如当某个 Store 的心跳包中断的时候,PD 并不能判断这个节点是临时失效还是永久失效,只能经过一段时间的等待(默认是 30 分钟),如果一直没有心跳包,就认为是 Store 已经下线,再决定需要将这个 Store 上面的 Region 都调度走。但是有的时候,是运维人员主动将某台机器下线,这个时候,可以通过 PD 的管理接口通知 PD 该 Store 不可用,PD 就可以马上判断需要将这个 Store 上面的 Region 都调度走。

调度策略

PD 收集以上信息后,还需要一些策略来制定具体的调度计划。

一个Region的Replica数量正确

   当PD通过某个Region Leader的心跳包发现这个Region的Replica的数量不满足要求时,需要通过Add/Remove Replica操作调整Replica数量。出现这种情况的可能原因是:

 A.某个节点掉线,上面的数据全部丢失,导致一些Region的Replica数量不足

 B.某个掉线节点又恢复服务,自动接入集群,这样之前已经弥补了Replica的Region的Replica数量过多,需要删除某个Replica

 C.管理员调整了副本策略,修改了max-replicas的配置

访问热点数量在 Store 之间均匀分配

    每个Store以及Region Leader 在上报信息时携带了当前访问负载的信息,比如Key的读取/写入速度。PD会检测出访问热点,且将其在节点之间分散开。

各个 Store 的存储空间占用大致相等

    每个 Store 启动的时候都会指定一个 Capacity 参数,表明这个 Store 的存储空间上限,PD 在做调度的时候,会考虑节点的存储空间剩余量。

控制调度速度,避免影响在线服务

    调度操作需要耗费 CPU、内存、磁盘 IO 以及网络带宽,我们需要避免对线上服务造成太大影响。PD 会对当前正在进行的操作数量进行控制,默认的速度控制是比较保守的,如果希望加快调度(比如已经停服务升级,增加新节点,希望尽快调度),那么可以通过 pd-ctl 手动加快调度速度。

支持手动下线节点

    当通过 pd-ctl 手动下线节点后,PD 会在一定的速率控制下,将节点上的数据调度走。当调度完成后,就会将这个节点置为下线状态。

一个 Raft Group 中的多个 Replica 不在同一个位置

 

以上内容为个人梳理总结于TiDB官网  https://www.pingcap.com/docs-cn/

转载于:https://www.cnblogs.com/xuliuzai/p/10022875.html

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

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

相关文章

南洋理工75页最新「深度学习对话系统」大综述论文,最全面概述深度学习对话技术进展...

来源:专知 摘要对话系统是一个流行的自然语言处理(NLP)任务,因为它在现实生活中应用前景广阔。这也是一个复杂的任务,因为涉及到许多需要研究的自然语言处理任务。因此,关于深度学习的对话系统研究的大量工作开展了。在这个综述中…

第二章 物理层 2,3 数据通信基础知识 [计算机网络笔记]

第二章 物理层 2,3 数据通信基础知识 本笔记参考书目: 计算机网络(第8版)谢希仁2021王道计算机网络视频公开课 本节重点: (了解即可) 通信方式:单工/半双工/全双工传输方式:并行/串行传输同步/异步传输…

《GTA 5》走进现实!AI逼真还原游戏街景,还能“脑补”细节 | 英特尔出品

来源:AI科技评论作者:琰琰编辑:刘冰一在不少玩家眼中,GTA 5(GTA V)称得上是一款旷世神作!GTA 也叫“侠盗猎车手”,是R星旗下一款超高人气动作冒险类游戏,目前已经发售至第…

对公平席位分配问题的探讨:最大余数法、Q值法和D’Hondt方法及其特例|公平分配原则等

公平席位分配问题 本文研究公平的席位分配问题。对席位分配问题中经典的最大余数法、Q值法和D’Hondt方法进行研究和比较,在提出公平性判断原则的基础上,分析其优缺点。本文使用Matlab搭建三种席位分配模型,并对结果展开讨论。给出最大余数法…

电动车产业深度报告:对比苹果,剖析特斯拉产业链投资机会 | 附完整报告下载...

报告出品方:兴业证券作者:戴畅 董晓彬 赵季新本篇报告对苹果产业链和特斯拉产业链进行了深度对比分析,前者引领消费电子黄金十年,后者将开启相关产业链赤金十年。1智能手机 vs 电动汽车:电动车方兴未艾,市场…

七牛云注册创建oss并配置自定义域名

1.登陆官网注册账号 有个人和企业两种,根据自己的情况进行注册 https://portal.qiniu.com/signup/choice 2.注册后要进行认证,不认证是没有免费空间给你使用的 3.创建对象存储,这个当然是选择离自己距离近的咯,更快的响应嘛 4.创建成功后,如果不想绑定到自己的域名的话,七牛云也…

状态转移法求解夫妻过河问题

状态转移法求解夫妻过河问题 摘 要 本文研究夫妻问题。主要运用“状态转移法”解决夫妻过河问题,并用Python编程实现,输出求解过程和结果。分析夫妻对数n和船载人数m和是否有解的关系,给出了该问题的一般提法和解法。 目 录 3.1 约束条件 1…

第二章 数据的表示和运算 2.1.6 循环冗余校验码/CRC码 [计算机组成原理笔记]

第二章 数据的表示和运算 2.1.6 循环冗余校验码/CRC码 本笔记参考书目: 计算机组成原理(第六版.立体化教材)白中英、戴志涛2021王道计算机组成原理视频公开课 本节重点: 循环冗余校验码/CRC码 的生成和检错 转载请注明文章来源…

利用基于GPU的AI模拟一个现实宇宙 仅需36分钟

来源:The Next Web编译:科技行者科学家已经习惯于使用超级计算机处理宇宙学领域的海量数据,最近卡耐基梅隆大学的研究团队找到一种新方法,可以使用常规的机器学习技术(与AI绘画或作曲拥有同样的底层设计),在图形处理单…

第七章:集成学习(利用AdaBoost元算法...)

---恢复内容开始--- 集成学习其实不能算一个算法,应该算是一种框架,集百家之长。集成算法具体有Bagging与Boosting两种大类。两者区别: 1)Bagging是并行的,它就好比找男朋友,美女选择择偶对象的时候,会问几…

GPT-3难以复现,为什么说PyTorch走上了一条“大弯路”?

来源:OneFlow 投稿责编:欧阳姝黎2020 年,最轰动的 AI 新闻莫过于 OpenAI 发布的 GPT-3 了。它的1750亿参数量及其在众多NLP任务上超过人类的出众表现让人们开始坚信:大模型才是未来。但与之带来的问题是,训练超大模型所…

生小兔问题

生小兔问题🐰 本文研究生小兔问题。使用代数模型,在考虑生育情况变化的情况下,求解兔子/白鼠的数目变化。 第1章 问题重述 生小兔问题 兔子出生后能够存活12个月,从第7月开始生小兔,7、8两月每对兔子生1对小兔/月&am…

光刻机龙头ASML回应韩国建厂:无需过度解读

来源: 深城物联近期,韩国在半导体领域的动作不小。先是韩国总统文在寅公开宣布韩国将斥资4500亿美元建设全球最大芯片制造基地,之后韩国又向全球光刻机龙头大厂阿斯麦(ASML)抛出了橄榄枝,请ASML在韩国建立再…

Spring入门之一-------实现一个简单的IoC

一、场景模拟 public interface Human {public void goHome();} Human:人类,下班了该回家啦public interface Car {void start();void stop();void turnLeft();void turnRight();} Car:汽车,可以启动、停止、左转、右转public cla…

常染色体的隐性疾病数学建模(代数模型)

常染色体的隐性疾病数学建模(代数模型) 摘要:本文研究随交配代数的增长,常染色体隐性疾病的基因分布变化问题。使用代数模型,在正常人不与显性患者交配,但隐性患者可与正常人、隐性患者交配的情况下时&…

一文拆解中国火星车着陆全过程

天问一号着陆器降落火星(艺术图)来源: 深城物联 经过惊心动魄的九分钟,中国首个火星车祝融号成功穿越火星大气层,着陆于火星北半球的乌托邦平原南端。自此,继苏联和美国之后,中国成为了第三个成…

第二章 物理层 4 奈氏准则和香农定理 [计算机网络笔记]

第二章 物理层 4 奈氏准则和香农定理 本笔记参考书目: 计算机网络(第8版)谢希仁2021王道计算机网络视频公开课 本节重点: 奈氏准则和香农定理的计算/适用范围 转载请注明文章来源! 失真 失真的影响因素&#xff1…

谈谈数学之现在与未来

文章来源:好玩的数学来源:《数学教学通讯》2005年3月(上半月)(总第220期)作者:王元(中国科学院数学与系统科学研究院)数学科学是什么?我们首先谈谈数学科学是…

SQL Server创建Job, 实现执行相同脚本而产生不同作业计划的探究

1 . 背景描述 本公司的SQL Server 服务器近百台,为了收集服务器运行的状态,需要在各个实例上部署监控Job,将收集到的信息推送到中央管理服务器。 收集的信息主要包括:慢查询、阻塞、资源等待、Connection_Trace log 、Job执行状态…

基于线性常微分方程的我国某省艾滋病传播的数学模型建立和预测分析

基于线性常微分方程的我国某省艾滋病传播的数学模型建立和预测分析 如有错误,欢迎指正!转载需注明出处和作者信息!©️Sylvan Ding 摘要 艾滋病(AIDS)又称获得性免疫缺陷综合征,由人类免疫缺陷病毒&…