TIDB 简介
什么是 TIDB
TiDB 是一个分布式 NewSQL 数据库。它反对程度弹性扩大、ACID 事务、规范 SQL、MySQL 语法和 MySQL 协定,具备数据强统一的高可用个性,是一个不仅适宜 OLTP 场景还适宜 OLAP 场景的混合数据库。
TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库,是一款同时反对在线事务处理与在线剖析解决 (Hybrid Transactional and Analytical Processing, HTAP)的交融型分布式数据库产品,具备程度扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 协定和 MySQL 生态等重要个性。指标是为用户提供一站式 OLTP (Online Transactional Processing)、OLAP (Online Analytical Processing)、HTAP 解决方案。TiDB 适宜高可用、强统一要求较高、数据规模较大等各种利用场景。
什么是 NewSQL
数据库倒退至今曾经有 3 代了:
- SQL,传统关系型数据库,例如 MySQL
- noSQL,例如 MongoDB,Redis
- newSQL
传统 SQL 的问题
互联网在本世纪初开始迅速倒退,互联网利用的用户规模、数据量都越来越大,并且要求 7X24 小时在线。
传统关系型数据库在这种环境下成为了瓶颈,通常有 2 种解决办法:
降级服务器硬件
尽管晋升了性能,但总有天花板。
数据分片
应用分布式集群构造
对单点数据库进行数据分片,寄存到由便宜机器组成的分布式的集群里,可扩展性更好了,但也带来了新的麻烦。
以前在一个库里的数据,当初跨了多个库,利用零碎不能自己去多个库中操作,须要应用数据库分片中间件。
分片中间件做简略的数据操作时还好,但波及到跨库 join、跨库事务时就很头疼了,很多人罗唆本人在业务层解决,复杂度较高。
NoSQL 的问题
起初 noSQL 呈现了,放弃了传统 SQL 的强事务保障和关系模型,重点放在数据库的高可用性和可扩展性。
长处
- 高可用性和可扩展性,主动分区,轻松扩大
- 不保障强一致性,性能大幅晋升
- 没有关系模型的限度,极其灵便
毛病
- 不保障强一致性,对于一般利用没问题,但还是有不少像金融一样的企业级利用有强一致性的需要。
- 不反对 SQL 语句,兼容性是个大问题,不同的 NoSQL 数据库都有本人的 api 操作数据,比较复杂。
NewSQL 个性
NewSQL 提供了与 noSQL 雷同的可扩展性,而且仍基于关系模型,还保留了极其成熟的 SQL 作为查询语言,保障了 ACID 事务个性。
简略来讲,NewSQL 就是在传统关系型数据库上集成了 NoSQL 弱小的可扩展性。
传统的 SQL 架构设计基因中是没有分布式的,而 NewSQL 生于云时代,天生就是分布式架构。
NewSQL 的次要个性:
- SQL 反对,反对简单查问和大数据分析。
- 反对 ACID 事务,反对隔离级别。
- 弹性伸缩,扩容缩容对于业务层齐全通明。
- 高可用,主动容灾。
三种 SQL 的比照
TiDB 怎么来的
驰名的开源分布式缓存服务 Codis 的作者,PingCAP 联结创始人 & CTO,资深 infrastructure 工程师的黄东旭,善于分布式存储系统的设计与实现,开源狂热分子的技术大神级别人物。即便在互联网如此凋敝的明天,在数据库这片边界含糊且不确定地带,他还在致力寻找确定性的实际方向。
直到 2012 年底,他看到 Google 公布的两篇论文,如同棱镜般,折射出他本人心田微烁的荣耀。这两篇论文形容了 Google 外部应用的一个海量关系型数据库 F1/Spanner,解决了关系型数据库、弹性扩大以及寰球散布的问题,并在生产中大规模应用。“如果这个能实现,对数据存储畛域来说将是颠覆性的”,黄东旭为完满计划的呈现而兴奋,PingCAP 的 TiDB 在此基础上诞生了。
公司历史能够参考下 PingCAP
TiDB 社区版和企业版
TiDB 分为社区版以及企业版,企业版免费提供服务以及安全性的反对
TIDB 外围个性
程度弹性扩大
通过简略地减少新节点即可实现 TiDB 的程度扩大,按需扩大吞吐或存储,轻松应答高并发、海量数据场景
得益于 TiDB 存储计算拆散的架构的设计,可按需对计算、存储别离进行在线扩容或者缩容,扩容或者缩容过程中对利用运维人员通明。
分布式事务反对
TiDB 100% 反对规范的 ACID 事务
金融级高可用
相比于传统主从 (M-S) 复制计划,基于 Raft 的多数派选举协定能够提供金融级的 100% 数据强一致性保障,且在不失落大多数正本的前提下,能够实现故障的主动复原 (auto-failover),无需人工染指
数据采纳多正本存储,数据正本通过 Multi-Raft 协定同步事务日志,多数派写入胜利事务能力提交,确保数据强一致性且多数正本产生故障时不影响数据的可用性。可按需配置正本地理位置、正本数量等策略满足不同容灾级别的要求。
实时 HTAP
TiDB 作为典型的 OLTP 行存数据库,同时兼具弱小的 OLAP 性能,配合 TiSpark,可提供一站式 HTAP 解决方案,一份存储同时解决 OLTP & OLAP 无需传统繁琐的 ETL 过程
提供行存储引擎 TiKV、列存储引擎 TiFlash 两款存储引擎,TiFlash 通过 Multi-Raft Learner 协定实时从 TiKV 复制数据,确保行存储引擎 TiKV 和列存储引擎 TiFlash 之间的数据强统一。TiKV、TiFlash 可按需部署在不同的机器,解决 HTAP 资源隔离的问题。
云原生的分布式数据库
TiDB 是为云而设计的数据库,同 Kubernetes 深度耦合,反对私有云、公有云和混合云,使部署、配置和保护变得非常简略。TiDB 的设计指标是 100% 的 OLTP 场景和 80% 的 OLAP 场景,更简单的 OLAP 剖析能够通过 TiSpark 我的项目来实现。TiDB 对业务没有任何侵入性,能优雅的替换传统的数据库中间件、数据库分库分表等 Sharding 计划。同时它也让开发运维人员不必关注数据库 Scale 的细节问题,专一于业务开发,极大的晋升研发的生产力
高度兼容 MySQL
兼容 MySQL 5.7 协定、MySQL 罕用的性能、MySQL 生态,利用无需或者批改大量代码即可从 MySQL 迁徙到 TiDB。
提供丰盛的数据迁徙工具帮忙利用便捷实现数据迁徙,大多数状况下,无需批改代码即可从 MySQL 轻松迁徙至 TiDB,分库分表后的 MySQL 集群亦可通过 TiDB 工具进行实时迁徙。
OLTP&OLAP(自学)
OLTP(联机事务处理)
OLTP(Online Transactional Processing) 即联机事务处理,OLTP 是传统的关系型数据库的次要利用,次要是根本的、日常的事务处理,记录即时的增、删、改、查,比方在银行存取一笔款,就是一个事务交易
联机事务处理是事务性十分高的零碎,个别都是高可用的在线零碎,以小的事务以及小的查问为主,评估其零碎的时候,个别看其每秒执行的 Transaction 以及 Execute SQL 的数量。在这样的零碎中,单个数据库每秒解决的 Transaction 往往超过几百个,或者是几千个,Select 语句的执行量每秒几千甚至几万个。典型的 OLTP 零碎有电子商务系统、银行、证券等,如美国 eBay 的业务数据库,就是很典型的 OLTP 数据库。
OLAP(联机剖析解决)
OLAP(Online Analytical Processing) 即联机剖析解决,是数据仓库的外围部心,反对简单的剖析操作,偏重决策反对,并且提供直观易懂的查问后果。典型的利用就是简单的动静报表零碎
在这样的零碎中,语句的执行量不是考核规范,因为一条语句的执行工夫可能会十分长,读取的数据也十分多。所以,在这样的零碎中,考核的规范往往是磁盘子系统的吞吐量(带宽),如能达到多少 MB/ s 的流量。
个性比照
OLTP 和 OLAP 的个性比照
— | OLTP | OLAP |
---|---|---|
实时性 | OLTP 实时性要求高,OLTP 数据库旨在使事务应用程序仅写入所需的数据,以便尽快解决单个事务 | OLAP 的实时性要求不是很高,很多利用顶多是每天更新一下数据 |
数据量 | OLTP 数据量不是很大,个别只读 / 写数十条记录,解决简略的事务 | OLAP 数据量大,因为 OLAP 反对的是动静查问,所以用户兴许要通过将很多数据的统计后能力失去想要晓得的信息,例如工夫序列剖析等等,所以解决的数据量很大 |
用户和零碎的面向性 | OLTP 是面向顾客的,用于事务和查询处理 | OLAP 是面向市场的,用于数据分析 |
数据库设计 | OLTP 采纳实体 – 分割 ER 模型和面向利用的数据库设计 | OLAP 采纳星型或雪花模型和面向主题的数据库设计 |
设计角度区别
— | OLTP | OLAP |
---|---|---|
用户 | 操作人员,低层管理人员 | 决策人员,高级管理人员 |
性能 | 日常操作解决 | 剖析决策 |
次要工作 | 增、删、改 | 查问 |
DB 设计 | 面向利用 | 面向主题 |
数据 | 以后的,最新的细节,二维的,分立的 | 历史的,汇集的,多维集成的,对立的 |
存取 | 读 / 写数十条记录 | 读上百万条记录 |
工作单位 | 简略的事务 | 简单的查问 |
用户数 | 上千个 | 上百个 |
DB 大小 | 100MB-GB | 100GB-TB |
TiDB 整体架构
TiDB 的劣势
与传统的单机数据库相比,TiDB 具备以下劣势:
- 纯分布式架构,领有良好的扩展性,反对弹性的扩缩容
- 反对 SQL,对外裸露 MySQL 的网络协议,并兼容大多数 MySQL 的语法,在大多数场景下能够间接替换 MySQL
- 默认反对高可用,在多数正本生效的状况下,数据库自身可能主动进行数据修复和故障转移,对业务通明
- 反对 ACID 事务,对于一些有强统一需要的场景敌对,例如:银行转账
- 具备丰盛的工具链生态,笼罩数据迁徙、同步、备份等多种场景
TiDB 的组件
要深刻理解 TiDB 的程度扩大和高可用特点,首先须要理解 TiDB 的整体架构。TiDB 集群次要包含三个外围组件:TiDB Server,PD Server 和 TiKV Server,此外,还有用于解决用户简单 OLAP 需要的 TiSpark 组件。
在内核设计上,TiDB 分布式数据库将整体架构拆分成了多个模块,各模块之间相互通信,组成残缺的 TiDB 零碎。对应的架构图如下:
TiDB Server
TiDB Server 负责接管 SQL 申请,解决 SQL 相干的逻辑,并通过 PD 找到存储计算所需数据的 TiKV 地址,与 TiKV 交互获取数据,最终返回后果。TiDB Server 是无状态的,其自身并不存储数据,只负责计算,能够有限程度扩大,能够通过负载平衡组件(如 LVS、HAProxy 或 F5)对外提供对立的接入地址。
PD (Placement Driver) Server
Placement Driver (简称 PD) 是整个集群的治理模块,其次要工作有三个:
- 一是存储集群的元信息(某个 Key 存储在哪个 TiKV 节点);
- 二是对 TiKV 集群进行调度和负载平衡(如数据的迁徙、Raft group leader 的迁徙等);
-
三是调配全局惟一且递增的事务 ID。
PD 通过 Raft 协定保证数据的安全性。Raft 的 leader server 负责解决所有操作,其余的 PD server 仅用于保障高可用。倡议部署奇数个 PD 节点
TiKV Server
TiKV Server 负责存储数据,从内部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的根本单位是 Region,每个 Region 负责存储一个 Key Range(从 StartKey 到 EndKey 的左闭右开区间)的数据,每个 TiKV 节点会负责多个 Region。TiKV 应用 Raft 协定做复制,保持数据的一致性和容灾。正本以 Region 为单位进行治理,不同节点上的多个 Region 形成一个 Raft Group,互为正本。数据在多个 TiKV 之间的负载平衡由 PD 调度,这里也是以 Region 为单位进行调度。
TiSpark
TiSpark 作为 TiDB 中解决用户简单 OLAP 需要的次要组件,将 Spark SQL 间接运行在 TiDB 存储层上,同时交融 TiKV 分布式集群的劣势,并融入大数据社区生态。至此,TiDB 能够通过一套零碎,同时反对 OLTP 与 OLAP,罢黜用户数据同步的懊恼。
TiFlash
TiFlash 是一类非凡的存储节点。和一般 TiKV 节点不一样的是,在 TiFlash 外部,数据是以列式的模式进行存储,次要的性能是为剖析型的场景减速。
TiKV 整体架构
与传统的整节点备份形式不同的,TiKV 是将数据依照 key 的范畴划分成大抵相等的切片(下文统称为 Region),每一个切片会有多个正本(通常是 3 个),其中一个正本是 Leader,提供读写服务。TiKV 通过 PD 对这些 Region 以及正本进行调度,以保证数据和读写负载都平均地扩散在各个 TiKV 上,这样的设计保障了整个集群资源的充分利用并且能够随着机器数量的减少程度扩大。
Region 决裂与合并
当某个 Region 的大小超过肯定限度(默认是 144MB)后,TiKV 会将它决裂为两个或者更多个 Region,以保障各个 Region 的大小是大抵靠近的,这样更有利于 PD 进行调度决策。同样,当某个 Region 因为大量的删除申请导致 Region 的大小变得更小时,TiKV 会将比拟小的两个相邻 Region 合并为一个。
Region 调度
Region 与正本之间通过 Raft 协定来维持数据一致性,任何写申请都只能在 Leader 上写入,并且须要写入少数正本后(默认配置为 3 正本,即所有申请必须至多写入两个正本胜利)才会返回客户端写入胜利。
当 PD 须要把某个 Region 的一个正本从一个 TiKV 节点调度到另一个下面时,PD 会先为这个 Raft Group 在指标节点上减少一个 Learner 正本(复制 Leader 的数据)。当这个 Learner 正本的进度大抵追上 Leader 正本时,Leader 会将它变更为 Follower,之后再移除操作节点的 Follower 正本,这样就实现了 Region 正本的一次调度。
Leader 正本的调度原理也相似,不过须要在指标节点的 Learner 正本变为 Follower 正本后,再执行一次 Leader Transfer,让该 Follower 被动发动一次选举成为新 Leader,之后新 Leader 负责删除旧 Leader 这个正本。
分布式事务
TiKV 反对分布式事务,用户(或者 TiDB)能够一次性写入多个 key-value 而不用关怀这些 key-value 是否处于同一个数据切片 (Region) 上,TiKV 通过两阶段提交保障了这些读写申请的 ACID 束缚。
高可用架构
高可用是 TiDB 的另一大特点,TiDB/TiKV/PD 这三个组件都能容忍局部实例生效,不影响整个集群的可用性。上面别离阐明这三个组件的可用性、单个实例生效后的结果以及如何复原。
TiDB 高可用
TiDB 是无状态的,举荐至多部署两个实例,前端通过负载平衡组件对外提供服务。当单个实例生效时,会影响正在这个实例上进行的 Session,从利用的角度看,会呈现单次申请失败的状况,从新连贯后即可持续取得服务。单个实例生效后,能够重启这个实例或者部署一个新的实例。
PD 高可用
PD 是一个集群,通过 Raft 协定保持数据的一致性,单个实例生效时,如果这个实例不是 Raft 的 leader,那么服务齐全不受影响;如果这个实例是 Raft 的 leader,会从新选出新的 Raft leader,主动复原服务。PD 在选举的过程中无奈对外提供服务,这个工夫大概是 3 秒钟。举荐至多部署三个 PD 实例,单个实例生效后,重启这个实例或者增加新的实例。
TiKV 高可用
TiKV 是一个集群,通过 Raft 协定保持数据的一致性(正本数量可配置,默认保留三正本),并通过 PD 做负载平衡调度。单个节点生效时,会影响这个节点上存储的所有 Region。对于 Region 中的 Leader 结点,会中断服务,期待从新选举;对于 Region 中的 Follower 节点,不会影响服务。当某个 TiKV 节点生效,并且在一段时间内(默认 10 分钟)无奈复原,PD 会将其上的数据迁徙到其余的 TiKV 节点上。
利用场景
MySQL 分片与合并
TiDB 利用的第一类场景是 MySQL 的分片与合并。对于曾经在用 MySQL 的业务,分库、分表、分片、中间件是罕用伎俩,随着分片的增多,跨分片查问是一大难题。TiDB 在业务层兼容 MySQL 的拜访协定,PingCAP 做了一个数据同步的工具——Syncer,它能够把黄东旭 TiDB 作为一个 MySQL Slave,将 TiDB 作为现有数据库的从库接在主 MySQL 库的前方,在这一层将数据买通,能够间接进行简单的跨库、跨表、跨业务的实时 SQL 查问。黄东旭提到,“过来的数据库都是一主多从,有了 TiDB 当前,能够反过来做到多主一从。”
间接替换 MySQL
第二类场景是用 TiDB 间接去替换 MySQL。如果你的 IT 架构在搭建之初并未思考分库分表的问题,全副用了 MySQL,随着业务的快速增长,海量高并发的 OLTP 场景越来越多,如何解决架构上的弊病呢?
在一个 TiDB 的数据库上,所有业务场景不须要做分库分表,所有的分布式工作都由数据库层实现。TiDB 兼容 MySQL 协定,所以能够间接替换 MySQL,而且根本做到了开箱即用,齐全不必放心传统分库分表计划带来沉重的工作累赘和简单的保护老本,敌对的用户界面让惯例的技术人员能够高效地进行保护和治理。另外,TiDB 具备 NoSQL 相似的扩容能力,在数据量和拜访流量持续增长的状况下可能通过程度扩容进步零碎的业务撑持能力,并且响应提早稳固。
数据仓库
TiDB 自身是一个分布式系统,第三种应用场景是将 TiDB 当作数据仓库应用。TPC-H 是数据分析畛域的一个测试集,TiDB 2.0 在 OLAP 场景下的性能有了大幅晋升,原来只能在数据仓库外面跑的一些简单的 Query,在 TiDB 2.0 外面跑,工夫根本都能管制在 10 秒以内。当然,因为 OLAP 的领域十分大,TiDB 的 SQL 也有搞不定的状况,为此 PingCAP 开源了 TiSpark,TiSpark 是一个 Spark 插件,用户能够间接用 Spark SQL 实时地在 TiKV 上做大数据分析。
作为其余零碎的模块
TiDB 是一个传统的存储跟计算拆散的我的项目,其底层的 Key-Value 层,能够独自作为一个 HBase 的 Replacement 来用,它同时反对跨行事务。TiDB 对外提供两个 API 接口,一个是 ACID Transaction 的 API,用于反对跨行事务;另一个是 Raw API,它能够做单行的事务,换来的是整个性能的晋升,但不提供跨行事务的 ACID 反对。用户能够依据本身的需要在两个 API 之间自行抉择。例如有一些用户间接在 TiKV 之上实现了 Redis 协定,将 TiKV 替换一些大容量,对提早要求不高的 Redis 场景。
利用案例
TiDB 与 MySQL 兼容性比照
- TiDB反对 MySQL传输协定及其绝大多数的语法。这意味着您现有的 MySQL 连接器和客户端都能够持续应用。大多数状况下您现有的利用都能够迁徙至 TiDB,无需任何代码批改。
- 以后 TiDB 服务器官网反对的版本为MySQL 5.7。大部分 MySQL 运维工具(如 PHPMyAdmin, Navicat, MySQL Workbench 等),以及备份复原工具(如 mysqldump, Mydumper/myloader)等都能够间接应用。
- 不过一些个性因为在分布式环境下没法很好的实现,目前临时不反对或者是体现与 MySQL 有差别
- 一些 MySQL 语法在 TiDB 中能够解析通过,然而不会做任何后续的解决,例如 Create Table 语句中 Engine,是解析并疏忽。
TiDB 不反对的 MySql 个性
- 存储过程与函数
- 触发器
- 事件
- 自定义函数
- 外键束缚
- 长期表
- 全文 / 空间函数与索引
- 非
ascii
/latin1
/binary
/utf8
/utf8mb4
的字符集 - SYS schema
- MySQL 追踪优化器
- XML 函数
- X-Protocol
- Savepoints
- 列级权限
XA
语法(TiDB 外部应用两阶段提交,但并没有通过 SQL 接口公开)CREATE TABLE tblName AS SELECT stmt
语法CHECK TABLE
语法CHECKSUM TABLE
语法GET_LOCK
和RELEASE_LOCK
函数
自增 ID
TiDB 的自增列仅保障惟一,也能保障在单个 TiDB server 中自增,但不保障多个 TiDB server 中自增,不保障主动调配的值的连续性,倡议不要将缺省值和自定义值混用,若混用可能会收 Duplicated Error
的错误信息。
TiDB 可通过 tidb_allow_remove_auto_inc
零碎变量开启或者敞开容许移除列的 AUTO_INCREMENT
属性。删除列属性的语法是:alter table modify
或 alter table change
。
TiDB 不反对增加列的 AUTO_INCREMENT
属性,移除该属性后不可复原。
SELECT 的限度
- 不反对
SELECT ... INTO @变量
语法。 - 不反对
SELECT ... GROUP BY ... WITH ROLLUP
语法。 - TiDB 中的
SELECT .. GROUP BY expr
的返回后果与 MySQL 5.7 并不统一。MySQL 5.7 的后果等价于GROUP BY expr ORDER BY expr
。而 TiDB 中该语法所返回的后果并不承诺任何程序,与 MySQL 8.0 的行为统一。
视图
目前 TiDB不反对 对视图进行 UPDATE、INSERT、DELETE 等 写入操作。
默认设置差别
字符集
- TiDB 默认:
utf8mb4
。 - MySQL 5.7 默认:
latin1
。 - MySQL 8.0 默认:
utf8mb4
。
排序规定
- TiDB 中
utf8mb4
字符集默认:utf8mb4_bin
。 - MySQL 5.7 中
utf8mb4
字符集默认:utf8mb4_general_ci
。 - MySQL 8.0 中
utf8mb4
字符集默认:utf8mb4_0900_ai_ci
。
大小写敏感
对于
lower_case_table_names
的配置
- TiDB 默认:
2
,且仅反对设置该值为2
。 -
MySQL 默认如下:
- Linux 零碎中该值为
0
- Windows 零碎中该值为
1
- macOS 零碎中该值为
2
- Linux 零碎中该值为
参数解释
- lower_case_table_names=0 表名存储为给定的大小和比拟是辨别大小写的
- lower_case_table_names = 1 表名存储在磁盘是小写的,然而比拟的时候是不辨别大小写
- lower_case_table_names=2 表名存储为给定的大小写然而比拟的时候是小写的
timestamp 类型字段更新
默认状况下,timestamp 类型字段所在数据行被更新时,该字段会自动更新为以后工夫,而参数 explicit_defaults_for_timestamp 管制这一种行为。
- TiDB 默认:
ON
,且仅反对设置该值为ON
。 - MySQL 5.7 默认:
OFF
。 - MySQL 8.0 默认:
ON
。
参数解释
- explicit_defaults_for_timestamp=off,数据行更新时,timestamp 类型字段更新为以后工夫
- explicit_defaults_for_timestamp=on,数据行更新时,timestamp 类型字段不更新为以后工夫。
外键反对
- TiDB 默认:
OFF
,且仅反对设置该值为OFF
。 - MySQL 5.7 默认:
ON
。
本文由
传智教育博学谷狂野架构师
教研团队公布。如果本文对您有帮忙,欢送
关注
和点赞
;如果您有任何倡议也可留言评论
或私信
,您的反对是我保持创作的能源。转载请注明出处!