第1章 TiDB的整体架构
近年来,随着移动互联网、云计算、大数据和人工智能等技术的飞速发展,给各行业带来了深刻的影响和变革,使得企业的数据量越来越庞大,应用的规模也越来越复杂。在这个背景下,传统的单机数据库已经在很多场景下表现的力不从心,为了解决海量数据平台的扩展性的问题,TiDB分布式数据库应运而生。TiDB是当今开源NewSQL数据库领域的代表产品之一,相比传统的单机数据库,TiDB有以下的一些优势:
1)纯分布式架构,拥有良好的扩展性,支持弹性的扩缩容
2)支持SQL,对外暴露MySQL的网络协议,并兼容大多数MySQL的语法,在大多数场景下可以直接替换MySQL
3)默认支持高可用,在少数副本失效的情况下,数据库本身能够自动进行数据修复和故障转移,对业务透明
4)支持ACID事务,对于一些有强一致性需求的场景友好,例如:银行转账
5)具有丰富的工具链生态,覆盖数据迁移、同步、备份等多种场景
TiDB分布式数据库最初的设计受到Google内部开发的知名分布式数据库 Spanner和F1 的启发,在内核设计上将整体的架构拆分成多个大的模块,大的模块之间互相通信,组成完整的TiDB系统。大的架构如下:
这三个大模块相互通信,每个模块都是分布式的架构,在TiDB中,对应的这几个模块叫做:
1)TiDB(tidb-server,https://github.com/pingcap/tidb):SQL层,对外暴露MySQL协议的连接endpoint,负责接受客户端的连接,执行SQL解析和优化,最终生成分布式执行计划。TiDB层本身是无状态的,实践中可以启动多个TiDB实例,客户端的连接可以均匀的分布在多个TiDB实例上以达到负载均衡的效果。tidb-server本身并不存储数据,只是解析SQL,将实际的数据请求转发给底层的存储层TiKV。
2)TiKV(tikv-server,https://github.com/pingcap/tikv):分布式KV存储,类似NoSQL数据库,作为TiDB的默认分布式存储引擎,支持完全弹性的扩容和缩容,数据分布在多个TiKV存储节点中,系统会动态且自动进行均衡,绝大多数情况下不需要人工介入。与普通的NoSQL系统不一样的是,TiKV的API能够在KV键值对层面提供分布式事务的原生支持,默认提供了SI(Snapshot Isolation)的隔离级别,这也是TiDB在SQL层面支持分布式事务的核心,上面提到的TiDB SQL层做完SQL解析后,会将SQL的执行计划转换为实际对TiKV API的调用。所以实际上数据都是存储在TiKV中。另外,TiKV中的数据都会自动维护多副本(默认为3),天然支持高可用和自动故障转移。TiFlash是一类特殊的存储节点,和普通TiKV节点不一样的是,在TiFlash内部,数据是以列式的形式进行存储,主要的功能是为分析型的场景加速。后面的章节会详细介绍。
3)Placement Driver(pd-server,简称PD,https://github.com/pingcap/pd):整个TiDB集群的元信息管理模块,负责存储每个TiKV节点实时的数据分布情况和集群的整体拓扑结构,提供dashboard管控界面,并为分布式事务分配事务ID。PD不仅仅是单纯的元信息存储,同时PD会根据TiKV节点实时上报的数据分布状态,下发数据调度命令给具体的TiKV节点,可以说是整个集群的大脑,另外PD本身也是由至少3个对等节点构成,拥有高可用的能力。