TiDB原理解析

article/2025/9/21 3:14:12

TiDBPingCAP公司设计的开源分布式NewSQL数据库。由于它兼容MySQL协议,并支持绝大多数SQL功能(比如joinssubqueriestransaction等)。业务能够直接通过MySQL connector去使用它来替换MySQL
TiDB适合场景:

  • 数据量大,MySQL复杂查询很慢。Online DDL影响业务的使用。
  • MySQL单机容量或者性能达到瓶颈,不想分库分表或者使用数据库中间件等对业务侵入性较大、对业务有约束的Sharding方案。
  • 有高并发实时写入、实时查询、实时统计分析的需求。
  • 有分布式事务、多数据中心的数据100%强一致性、auto-failover的高可用的需求。

TiDBMySQL相比,有什么优势,让它更适合上述场景?接下来将从以下六个方面进行对比。

1.TiDB实现分布式的SQL引擎和存储

MySQL水平扩展一般是主从复制,典型的就是一主多从模式。但这种只适合读多写少的业务。碰到大写入量的业务,这种模式反而会成为瓶颈。那么就必须寻求其他的分布式方案,有以下两种思路:

  • 基于修改MySQL的分布式方案。通过MySQLServerInnoDB变成分布式数据库,但由于MySQL生成的执行计划是单机的,这不是一个分布式的Plan。不了解底层分布式存储,是无法选择一个最高效率的执行计划。
  • 基于中间件方式的分布式方案,比如ProxySQL。做一款中间件需要考虑很多,比如通过解析SQL解析出ShardKey,然后根据ShardKey分发请求,再合并结果。另外在中间件这层还需要维护Session并保存缓存结果。大多数方案并不支持分布式Transaction,不支持跨节点Join,无法处理复杂Plan,也不会处理Subqueries。同时业务需要维护ShardKey,不支持ORM导致业务开发效率降低。

以上MySQL的问题是由传统架构模式本身带来的,而TiDB的模式是不一样的。它在TiDB Server层实现了分布式的SQL引擎,依赖TiKV来提供分布式存储和分布式事务支持,分布式的设计也方便做水平扩展。以上MySQL分布式方案带来的问题,TiDB都能做很好的解决,这是架构本身带来的优势。
image

如上图所示,TiDB集群主要分为以下三个组件:

  • TiDB Server
    TiDB Server负责接收SQL请求,处理SQL相关的逻辑,并通过PD找到存储计算所需数据的TiKV地址,与TiKV交互获取数据,最终返回结果。TiDB Server本身并不存储数据,只负责计算,可以无限水平扩展。通过负载均衡组件(如LVSHAProxyF5)对外提供统一的接入地址。
  • PD Server
    Placement Driver(简称PD)是整个集群的管理模块。其主要工作有三个:一是存储集群的元信息(某个Key存储在哪个 TiKV节点);二是对TiKV集群进行调度和负载均衡(如数据的迁移、Raft group leader成员变更等);三是分配全局唯一且递增的事务ID(支持分布式事务)。
  • TiKV Server
    image

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

2.TiDB金融级的高可用

MySQL的复制方式是半同步或者是异步,半同步也可以降级成异步。也就是说任何时候数据出了问题是不敢切换的,因为有可能是异步复制,有一部分数据还没有同步过来,这时候切换数据就不一致了。多数据中心的复制和数据中心的容灾,MySQL在这上面是做不好的。
TiDB/TiKV/PD的三个组件都能容忍部分实例失效,并且不影响整个集群的可用性,支持跨中心部署。
下面分别说明这三个组件的单个实例失效后的服务状态,以及如何进行恢复。

  • TiDB Server
    TiDB Server是无状态的,推荐至少部署两个实例。当单个实例失效时,会影响正在这个实例上进行的服务,从应用的角度看,会出现单次请求失败的情况,重新连接成功后即可继续获得服务。单个实例失效后,可以重启这个实例或者部署一个新的实例。
  • PD Server
    PD是一个集群,通过Raft协议保持数据的一致性,单个实例失效时,如果这个实例不是Raftleader,那么服务完全不受影响;如果这个实例是Raftleader,会重新选出新的Raft leader,自动恢复服务。PD在选举的过程中无法对外提供服务,这个时间大约是3秒钟。推荐至少部署三个PD实例,单个实例失效后,重启这个实例或者添加新的实例。
  • TiKV Server
    TiKV是一个集群,通过Raft协议保持数据的一致性(副本数量可配置,默认保存三副本),并通过PD做负载均衡调度。单个节点失效时,会影响这个节点上存储的所有Region。对于Region中的Leader结点,会中断服务,等待重新选举;对于 Region中的Follower节点,不会影响服务。当某个TiKV节点失效,并且在一段时间内(默认10分钟)无法恢复,PD会将其上的数据迁移到其他的TiKV节点上。

3.TiDB存储引擎RocksDB

MySQL默认存储引擎从2010年起就一直是InnoDBInnoDB使用B+树数据结构,这与传统的商业数据库相似。TiDB使用RocksDB作为TiKV的存储引擎。
读写性能的测试对比:

  • RocksDB读性能只有InnoDB-Compress性能的70%。但在高并发下,RocksDB平均响应时间表现要比InnoDB-Compress好。但与未压缩的InnoDB还是差不少。
  • RocksDB写性能表现优异,QPS大概是InnoDB-Compress10倍。

RocksDB优势是在于处理大型数据集,因为它可以更有效地压缩数据并且插入数据性能优秀。
6亿4千万数据导入MySQLInnoDB未经压缩大小为160GBInnoDB-Compress86GBRocksDB62GB
TiDB更加适合大规模数据场景。数据条数少于5000w的场景下通常用不到TiDB,单机MySQL能满足的场景也不需要用到TiDB
image

4.TiDB更好的解决了Online DDL问题

业务发展迅速,应用模式频繁更改是常态。相应地,数据库访问模式和Schema也随之变化。DDLSQL的一类,主要作用是创建和更改数据的Schema信息,最常见的操作包括:加减列、更改列类型、加减索引等。5.6版本以后,MySQL内部开始支持Online DDL。但MySQLOnline DDL方案始终没有解决下面问题:MySQL主备副本之间通过Binlog同步,主的Schema变更成功后,才会写BinLog同步给备库,然后备库才开始做DDL。假设一个DDL变更需要一个小时,那么备库最多可能会延迟两倍的变更时间。若变更期间,主库发生故障,备库数据还未追平,则无法提供服务的。
TiDB使用Google F1论文介绍的协议实现在线DDL。Tikv基本不感知DDL操作。对于Tikv来说,所有的操作都是PUT/GET/DELETE,所以副本间的变更也与普通DML没有差异。任何时候,只要底层raft协议能正常work,三副本高可用和强一致就能得到保证。这个方案虽然Schema变更比较麻烦,但对于Tikv存储层特别友好,不用感知DDL,共用一套机制保证高可用和强一致。不会出现类似MySQL主备延迟和主备Schema不一致问题。DDL更改也被分解成更小的转换阶段,这样它们可以防止数据损坏场景,并且系统允许单个节点一次最多支持一个DDL版本。

5.TiDB提供一站式HTAP解决方案

MySQL团队把注意力放在优化联机事务处理(OLTP)查询的性能上。也就是说,MySQL团队花费更多的时间使简单查询执行得更好,而不是使所有或复杂查询执行得更好。这种方法没有错,因为许多应用程序只使用简单的查询。
TiDB设计目标在处理混合事务/分析处理(HTAP)的性能上。对于那些希望对数据进行实时分析的应用来说,这是一个主要的卖点,因为它消除了在MySQL数据库和分析数据库之间进行的批量加载。一份存储同时处理OLTP & OLAP,无需传统繁琐的ETL 过程。

6.TiDB可视化监控与告警

这一点对运维非常友好。MySQL将关键监控指标放在内存表中,获取它需要通过SQL查询,可视化与告警部分都需要额外开发。而TiDB提供Metrics接口,使用 Prometheus记录组件中各种操作的详细信息,使用Grafana进行可视化展示。无须其他开发额外,根据需要,即可配置定制化自己的监控图表和报警。

image

总结

在替代MySQL的场景中,TiDBMySQL相比更加适合大数量的场景;同时也补充了MySQL的不足,比如处理Online DDL问题;在MySQL不适合的场景中,比如HTAP场景中也能发挥很好的优势。如果你想更多了解TiDB作者的初衷,参阅How do we build TiDB,Meet TiDB: An open source NewSQL database。


http://chatgpt.dhexx.cn/article/CYTejp1g.shtml

相关文章

TiDB 简介(二)

参考:TiDB 简介_福海鑫森的博客-CSDN博客_tidb开发语言 TiDB 简介 | PingCAP Docs TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的…

TiDB入门+深入

目录 一、概述 1、从MySQL到TiDB 2、简介 1、OLTP和OLAP 3、TiDB整体架构 4、TiDB安装部署 开发及测试环境 生产环境 5、TiDB-读取历史数据 6、数据迁移-TiDB Lightning 一、概述 数据库(DataBase)是按照数据结构来组织、存储和管理数据的仓库…

TIDB简介及TIDB部署、原理和使用介绍

TiDB简介及TiDB部署、原理和使用介绍 从MySQL架构到TiDB 数据库分类 ​ 介绍TiDB数据库之前,先引入使用场景。如今的数据库种类繁多,RDBMS(关系型数据库)、NoSQL(Not Only SQL)、NewSQL,在数…

JAVA注解学习-@Documented注解

这个注解只是用来标注生成javadoc的时候是否会被记录。 用法 在自定义注解的时候可以使用Documented来进行标注,如果使用Documented标注了,在生成javadoc的时候就会把Documented注解给显示出来。 带Documented生成的javadoc 不带Documented生成的java…

DocumentFragment

文章目录 1. 描述2. 使用 1. 描述 DocumentFragments 是DOM节点。通常的用例是创建文档片段,将元素附加到文档片段,然后将文档片段附加到DOM树。在DOM树中,文档片段被其所有的子元素所代替。 因为文档片段存在于内存中,并不在DO…

java 注解示例(@Documented)

java 注解示例(Documented) 作用:生成文档信息的时候保留注解,对类作辅助说明 *************************** 示例 Documented interface B{String value() default "这是一个自定义类"; }B public class MyTest2 {publ…

document.documentElement与document.body

写前端时遇到这两种方法&#xff0c;转载待以后查看。 两种特殊的文档属性可用来访问根节点&#xff1a; document.documentElementdocument.body 第一个属性可返回存在于 XML 以及 HTML 文档中的文档根节点。 第二个属性是对 HTML 页面的特殊扩展&#xff0c;提供了对 <…

@Documented注解作用

Documented注解作用 验证步骤1. 编写 注解 类2. 执行Javadoc命令生成文档3. 查看IService类文档信息4. 取消// Documented 注解 生成文档并查看 总结 验证步骤 1. 编写 注解 类 // 第一个文件 package com.example.zhaohuiweb;import java.lang.annotation.Documented; imp…

document.documentElement 属性

document.documentElement 属性返回文档中的 html 元素。 语法格式&#xff1a; document.documentElement; 示例&#xff1a; var html document.documentElement;console.log(html); 控制台输出&#xff1a; 如果 html 元素缺失&#xff0c;则返回 null。

Usage of API documented as @since 1.9+

Usage of API documented as since 1.9 idea爆红提醒: Usage of API documented as since 1.9 提醒需要1.9版本以上的API文档才能使用 解决办法: 1.配置高版本的JDK 1.9 以上 2.配置模块的语言等级 language level 为 9 最终结果如下:

javascript document

Document 获取元素节点&#xff1a; 1. document.getElementById(id属性值) 2. document.getElementsByTagName(tag标签名); 该方式获得一个"集合列表"(数组)对象(无视对象个数), 具体对象获取方式&#xff1a; 集合[下标] 或 集合.item(下标) 3. document.getE…

@Documented 的作用

1. Documented 的含义 Document 是 java 在生成文档&#xff0c;是否显示注解的开关。 2. 加和不加有什么区别&#xff1f; 测试注解 Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Documented public interface RestMapping {String[] value() default {}…

@Documented注解的作用

目录 在哪里用到了Documented注解&#xff1f;那么Documented的作用是什么&#xff1f; 在哪里用到了Documented注解&#xff1f; Documented是元注解&#xff0c;可以修饰其他注解。许多注解头部都有Documented注解&#xff0c;例如jdk中自带的Deprecated注解(路径是&#xf…

python模拟CryptoJS.AES.decrypt解密

python模拟CryptoJS.AES.decrypt 思路&#xff1a;准备工作:需求 思路&#xff1a; 从CryptoJS源码中抠出python模拟报错的代码 准备工作: 1.安装execjs库 pip install execjs2.安装nodejs 百度一下一大堆 3.使用npm安装crypto-js库 4.讲crypto-js库放入安装的node_modul…

攻防世界_Crypto_Decrypt-the-Message

攻防世界刷题记录Crypto篇 文章目录 攻防世界刷题记录Crypto篇前言一、原题内容二、解题步骤1.了解poem code加密原理2.借助Python解密脚本解密 三、自己的一点解题方法和疑惑 前言 这应该是我在攻防世界网站遇到的第一道三分题&#xff0c;可以看到原题是出自2014年的一个比赛…

Encrypt/Decrypt Strings(加密/解密字符串)

2019独角兽企业重金招聘Python工程师标准>>> /*** Usage:* <pre>* String crypto SimpleCrypto.encrypt(masterpassword, cleartext)* ...* String cleartext SimpleCrypto.decrypt(masterpassword, crypto)* </pre>* author ferenc.hechler*/ public…

SECCON-CTF-2014-Decrypt-It-easy

题目 给了三个文件ecrypt1.bin,readme.txt,rnd 其中readme.txt: $ ./rnd crypt1.png ecrypt1.bin Solve 看到前面有一个$,猜测可能和linux系统有关&#xff0c;这一条信息有点像使用./目录下的rnd对crypt1.png进行某种操作&#xff0c;输出为ecrypt1.bin. file一下 file /…

JAVA使用mysql加密解密函数(AES_ENCRYPT/AES_DECRYPT)

前言 最近大学做JavaWeb课设时发现&#xff0c;很多同学的有关于账号密码都是明文储存在mysql数据库中&#xff0c;其实这样做在实际应用中是非常不安全的&#xff0c;其实mysql最近本身就提供了非常好的两个函数来供我们去加密解密我们要存入的数据&#xff0c;下面我们就来介…

Encrypt 和 Decrypt 加密--解密

[例句]In order to encrypt and decrypt, you need an encryption algorithm and a key. 为了进行加密和解密&#xff0c;您需要加密算法和密钥。 数据加密 数据加密利用密码技术对信息进行加密&#xff0c;实现信息的隐蔽&#xff0c;从而起到保护信息安全的作用。它通过加密…

CSS选择器分类大全

选择器(选择符)就是根据不同需求把不同的标签选出来这就是选择器的作用。 简单来说&#xff0c;就是选择标签用的。 分类&#xff1a;基础选择器、复合选择器 目录 一、基础选择器 二、复合选择器 三、CSS3选择器补充&#xff1a; &#xff08;一&#xff09;层级选择器&am…