1. 简介
Tidb是一个分布式 NewSQL数据库,它支持水平弹性扩展、ACID事务、标准sql、Mysql语法和Mysql协议,具有数据强一致性的高可用特性,,是一个不仅适合OLTP场景还适合OLAP场景的混合数据库。
OLTP(Online transaction processing):在线/联机事务处理。典型的OLTP类操作都比较简单,主要是对数据库中的数据进行增删改查,操作主体一般是产品的用户。
OLAP(Online analytical processing): 指联机分析处理。通过分析数据库中的数据来得出一些结论性的东西。比如给老总们看的报表,用于进行市场开拓的用户行为统计,不同维度的汇总分析结果等等。操作主体一般是运营、销售和市场等团队人员。
两者的区别:
单次OLTP处理的数据量比较小,所涉及的表非常有限,一般仅一两张表。而OLAP是为了从大量的数据中找出某种规律性的东西,经常用到count()、sum()和avg()等聚合方法,用于了解现状并为将来的计划/决策提供数据支撑,所以对多张表的数据进行连接汇总非常普遍。
TiDB是PingCAP公司自主设计、研发的开源分布式关系型数据,是一款同时支持在线事务处理与在线分析处理(Hybrid Transactional and Analytical Processing, HTAP)的融合行分布式数据库产品,具备水平扩容或缩容、金融级高可用、实时HTAP、云原生的分布式数据库、兼容Mysql5.7协议和Mysql生态等重要特性。
目标是为用户提供一站式OLTP、OLAP、HTAP解决方案。TiDB适合高可用、强一致性要求较高、数据规模较大等各种场景。
1.1 什么是NewSQL
数据库发展至今已经有3大类:
sql: 传统关系型数据库,,例如msyql
noSQL:例如MongoDB,Redis
newSQL
1.2 传统SQL的问题
互联网迅速发展,应用的用户规模、数据量越来越大,并且要求 7x24小时在线,传统关系型数据库在这种环境下成为了瓶颈,通常有两种解决方法:
升级服务硬件
数据分片,使用分布式集群结构
对单点数据库进行数据分片,存放到廉价机器组成的分布式集群里,可扩展性更好了,但也带来了新的麻烦。以前一个库里的数据,现在跨了多个库,应用系统不能自己去多个库中操作,需要使用数据分片中间件。
分片中间件做简单的数据操作还好,但设计到跨库join、跨库事务就头疼了。
1.3 NoSQL的问题
NoSQL的出现,放弃了传统SQL的强事务保证和关系模型,重点放在数据库的高可用性和可扩展性。
优点:
高可用性和可扩展性、自动分区、轻松扩展
不保证强一致性、性能大幅度提升
没有关系模型的限制,极其灵活
缺点:
不保证强一致性,对于普通应用更没有问题,但还是有不少像金融一样的企业级应用有强一致性的需求
不支持sql语句,兼容性是个大问题,不同的NoSQL数据库都有自己的API操作数据,比较复杂
1.4 NewSQL的特性
NewSQL提供了与noSQL相同的可扩展性,而且仍基于关系模型,还保留了极其成熟的SQL作为查询语句,保证了ACID事务的特性。
简单来讲:NewSQL就是在传统关系型数据库上集成了NoSQL强大的可扩展性
传统的SQL架构设计是没有分布式的,而NewSQL生于云时代,天生就是分布式架构。
主要特性有:
SQL支持,支持复杂查询和大数据分析
支持ACID事务,支持隔离级别
弹性伸缩,扩容缩容对业务层完全透明
高可用,自动容灾
1.5 三种SQL的对比
维度 | Old SQL | NoSQL | NewSQL |
---|---|---|---|
关系模型 | Y | N | Y |
SQL语句 | Y | N | Y |
ACID | Y | N | Y |
水平扩展 | N | Y | Y |
大数据 | N | Y | Y |
无结构化 | N | Y | N |
2. TIDB
【 官网地址 】
与传统的单机数据库相比,TiDB 具有以下优势:
纯分布式架构,拥有良好的扩展性,支持弹性的扩缩容
支持 SQL,对外暴露 MySQL 的网络协议,并兼容大多数 MySQL 的语法,在大多数场景下可以直接替换 MySQL
默认支持高可用,在少数副本失效的情况下,数据库本身能够自动进行数据修复和故障转移,对业务透明
支持
ACID
事务,对于一些有强一致需求的场景友好,例如:银行转账具有丰富的工具链生态,覆盖数据迁移、同步、备份等多种场景
2.1 TIDB核心特性
- 水平弹性扩展
通过简单地增加新节点即可实现TIDB的水平扩展,按需扩展吞吐或存储,轻松应对高并发、海量数据场景
- 分布式事务支持
金融级高可用
相比于传统主从(M-S)复制方案,基于Raft的多数派选举协议可以提供金融级的100%数据强一致性保证,且在不丢失大多数副本的前提下,可以实现故障的自动恢复(auto-failover),无需人工介入
数据采用多副本存储,数据副本通过
Multi-Raft
协议同步事务日志,多数派写入成功事务才能,确保数据强一致性且少数副本发生故障是不影响数据的可用性。可按需配置副本地理位置】副本数量扽该策略满足不同容灾级别的要求实时HTAP
TIDB作为典型的OLTP行存数据库,同时艰巨强大的OLAP性能,配置TiSpark,可提供个一站式HTAP解决方案,一份存储同时处理OLAP & OLTP ,无需传统繁琐的ETL过程
提供行存储殷勤 TiKV、列存储引擎TiFlash两款存储引擎,TiFlash通过
Multi-Raft Learner
协议实时从TiKV复制数据,确保行存储引擎和列存储引擎的数据强一致性。TiKV、TiFlash可按需部署在不同的极其,解决HTAP资源隔离的问题。云原生的分布式数据库
TiDB是为云设计的数据库,同Kubernetes深度耦合,支持公有云、私有云和混合云,使部署、配置和维护变得时份简单。Tidb的设计目标是100%的OLTP场景和80%的OLAP场景,更复杂的OLAP恩熙可以通过TiSpark项目来完成,TiDB对业务没有任何侵入性,能优雅的替换传统的数据库中间件、数据库分库分表等Sharding方案。同时它让开发韵味人员不用关注数据库Scale的细节问题,专注于业务开发,极大的提升研发生产力。
高度兼容MySQL
兼容Mysql5.7协议、Mysql常用功能、Mysql生态,应用无需或者修改少量代码即可从mysql迁移到Tidb。
提供丰富的数据前一工具帮助应用编辑完成数据前一,大多数情况下,无修改代码即可迁移至TiDB,分库分表后的Mysql集群也可以通过TiDB工具进行实时迁移
2.2 TiDB组件
TiDB 集群主要包括三个核心组件:TiDB Server
,PD Server
和 TiKV Server
,此外,还有用于解决用户复杂 OLAP 需求的 TiSpark
组件
在内核合集上,TiDB分布式数据库将整体架构拆分成了多个模块,各模块之间互相通信,组成完整的Tidb系统。对饮的架构图如下:
2.2.1 TiDB Server
TiDB Server负责接收SQL请求,处理SQL相关的逻辑,并通过PD找到存储计算所需的数据的TiKV
地址,与TiKV
交互获取数据,最终返回结构。TiDB Server
是无状态的,其本身并不存储数据,只是负责计算,可以无限水平扩展,可以通过负载均衡组件(如LVS、HAProxy、F5)对外提供统一的接入地址。
计算下推:
2.2.2 PD(Placement Driver) Server
Placement Driver(简称PD)是整个集群的管理模块,其主要工作内容有:
存储集群的元信息(某个key存储在那个TiKV节点)
对TiKV集群进行调度和负载均衡(如数据迁移、Raft Group leader的迁移等)
分配全局唯一且递增的事务ID
PD 通过 Raft
协议保证数据的安全性。Raft
的 leader server
负责处理所有操作,其余的 PD server 仅用于保证高可用。建议部署奇数个 PD 节点,一般线上推荐至少部署 3 个节点。
2.2.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为单位进行调度的。
TiKV 是一个分布式且支持事务的 Key-Value 存储引擎
数据存储在 RocksDB 中
节点之间通过 Raft 协议 保持数据一致性
事务模型采用 Google 的 Percolator
存储的数据格式如下:
2.2.4 TiFlash
TiFlash是一类特殊的存储节点,和普通的TiKV节点不一样的是:在TiFlash内部数据是以列式的形式进行存储的,主要的功能是分析性的场景加速
- TiFlash 是 TiDB HTAP 形态的关键组件,它是 TiKV 的列存扩展
列存副本通过 Raft Learner 协议异步复制,但是在读取的时候通过 Raft 校对索引配合 MVCC 的方式获得 Snapshot Isolation 的一致性隔离级别
存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range (从 StartKey 到 EndKey 的左闭右开区间)的数据,每个 TiKV 节点会负责多个 Region 。
- 在提供了良好的隔离性的同时,也兼顾了强一致性,这个架构很好地解决了 HTAP 场景的隔离性以及列存同步的问题。
2.2.5 TiSpark
TiSpark作为TiDB中解决用户负载OLAP需求的主要组件,将Spark SQL直接运行在TiDB存储层上,同时融合TiKV分布式集群的优势,并融入大数据社区生态。至此,TiDB可以通过一套系统同时支持OLAP和OLTP,免除用户数据同步的烦恼
- 通过实现索引支持、区间裁剪、计算下推等独有功能,使 Spark 无缝智能接入 TiDB / TiKV / TiFlash,Spark 整个生态都可以接入 TiDB 集群。
- 无需 ETL 过程,提供实时分析,复杂 OLAP 分析查询能力
2.3 TiKV整体架构
与传统的郑节点备份方式不同的,TiKV是将数据按照Key的范围划分称大致相等的切片(Region),每一个切片会有多个副本(通常是3个),其中一个副本是Leader,提供读写服务。
TiKV通过PD对这些Region以及副本进行调度,以保证数据和读写负载都均匀地分散在各个TiKV上,这样的设计保证了整个集群资源的充分利用并且可以随着机器数量的增加水平扩展。
2.3.1 Region分裂与合并
当某个Region的大小超过一定限制(默认是144MB)后,TiKV会将它分裂为两个或者更多个Region,以保证各个Region的大小是大致接近的,这样更有利于PD进行调度决策/
同样,当某个Region因大量的删除请求导致Region的大小变得更小是,TiKV会将比较小的两个相邻Region合并为一个
2.3.2 Region调度
Region与副本之间通过Raft协议来维持数据一致性,任何写请求都只能在Leader上写入,并且需要写入多数副本后(默认配置为3副本,及所有请求必须至少写入两个副本成功)才会返回客户端写入成功。
当PD需要把某个Region的一个副本从给一个TiKV节点调度到另一个上面时,PD会先为这个Raft Group在目标节点上增加一个Learner副本(复制Leader的数据),当这个Learner副本的进度大致追上Leader副本时,Leader会将它变更为Follower,之后再移除操作节点的Follower。
Leader副本的调度原理也类似,不过需要在目标节点的Learner副本变更为Follower副本后,再执行一次Leader Transfer,让该Follower主动发起一次选举成为新的Leader,之后新的Leader负责删除就Leader这个副本
2.3.3 分布式事务
TiKV支持分布式事务,用户(或者TiDB)可以一次性写入多个Key-Value而不关系这些key-value是否处于统一个数据分片Region上,TiKV通过两阶段提交保证了这些读写请求的ACID约束
2.4 高可用架构
高可用时TiDB的另一大特点,TiDB/TiKV/PD 这三个组件都能容忍部分实例失效,不影响整个集群的可用性。下面分别说明这三个组件的可用性、单个实例失效后的后果以及如何恢复。
2.4.1 TiDB 高可用
TiDB是无状态的,推荐至少部署两个实例,前段通过负载均衡组件对外提供服务。当单个实例失效时,会影响正在这个实例上进行的Session,从应用的角度看,会出现单次请求失败的情况,重新连接后即可继续获得服务
。
单个实例失效后,可以重新这个实例或部署一个新的实例。
2.4.2 PD 高可用
PD是一个集群,通过Raft协议保持数据一致性,单个实例失效时,如果这个实例不是Raft的leader,那么服务完全不受影响;如果是leader,会重新选出新的Raft leader,自动恢复服务。 PD在选举的过程中无法对外提供服务,这个时间大约是3秒钟
。推荐至少部署3个PD实例,单个实例失效后,重启这个实例或者添加新的实例。
2.4.3 TiKV 高可用
TiKV是一个集群,通过Raft协议保持数据的一致性(副本数量可配置,默认保存3副本),并通过PD做负载均衡调度。单个节点失效时,会影响这个节点上存储的所有Region。对于Region中的leader节点,会中断服务,等待重新选举;对于Region中的Follower节点,不会影响服务。
当某个TiKV节点失效,并且在一段时间内(默认30分钟)无法恢复,PD会将其上的数据迁移值其他的TiKV节点上,恢复3副本。
2.4.4 TiFlash高可用
TiFlash
是一个列式存储引擎 ,通过 Raft
协议保持数据的一致性(副本数量可配置,一般在 2 以上),以 Region
为单位,从 leader
上通过 Raft log 同步数据,并通过 PD 做负载均衡调度。
单个节点失效时,会影响这个节点上存储的所有 Region。对于节点中正在执行的任务,会中断服务,TiDB 直接返回 SQL 报错;当某个 TiFlash 节点失效,并且在一段时间内(默认 30 分钟)无法恢复,PD 会将这个节点丢失的数据副本,从 tikv leader 重新拉取,恢复原副本数。
2.5 应用场景
2.5.1 Mysql分片与合并
TiDB 应用的第一类场景是 MySQL 的分片与合并。对于已经在用 MySQL 的业务,分库、分表、分片、中间件是常用手段,随着分片的增多,跨分片查询是一大难题。TiDB 在业务层兼容 MySQL 的访问协议,PingCAP 做了一个数据同步的工具——Syncer,它可以把黄东旭 TiDB 作为一个 MySQL Slave,将 TiDB 作为现有数据库的从库接在主 MySQL 库的后方,在这一层将数据打通,可以直接进行复杂的跨库、跨表、跨业务的实时 SQL 查询。黄东旭提到,“过去的数据库都是一主多从,有了 TiDB 以后,可以反过来做到多主一从。”
2.5.2 直接替换MySQL
在一个 TiDB 的数据库上,所有业务场景不需要做分库分表,所有的分布式工作都由数据库层完成。TiDB 兼容 MySQL 协议,所以可以直接替换 MySQL,而且基本做到了开箱即用,完全不用担心传统分库分表方案带来繁重的工作负担和复杂的维护成本,友好的用户界面让常规的技术人员可以高效地进行维护和管理。另外,TiDB 具有 NoSQL 类似的扩容能力,在数据量和访问流量持续增长的情况下能够通过水平扩容提高系统的业务支撑能力,并且响应延迟稳定。
2.5.3 数据仓库
TiDB 本身是一个分布式系统,第三种使用场景是将 TiDB 当作数据仓库使用。TPC-H 是数据分析领域的一个测试集,TiDB 2.0 在 OLAP 场景下的性能有了大幅提升,原来只能在数据仓库里面跑的一些复杂的 Query,在 TiDB 2.0 里面跑,时间基本都能控制在 10 秒以内。当然,因为 OLAP 的范畴非常大,TiDB 的 SQL 也有搞不定的情况,为此 PingCAP 开源了 TiSpark,TiSpark 是一个 Spark 插件,用户可以直接用 Spark SQL 实时地在 TiKV 上做大数据分析。
2.5.4 作为其他系统的模块
TiDB 是一个传统的存储跟计算分离的项目,其底层的 Key-Value 层,可以单独作为一个 HBase 的 Replacement 来用,它同时支持跨行事务。TiDB 对外提供两个 API 接口,一个是 ACID Transaction 的 API,用于支持跨行事务;另一个是 Raw API,它可以做单行的事务,换来的是整个性能的提升,但不提供跨行事务的 ACID 支持。用户可以根据自身的需求在两个 API 之间自行选择。例如有一些用户直接在 TiKV 之上实现了 Redis 协议,将 TiKV 替换一些大容量,对延迟要求不高的 Redis 场景