4.2 Tidb
TiDB 是 PingCAP 公司设计的开源分布式 HTAP (Hybrid Transactional and Analytical Processing) 数据库,结合了传统的 RDBMS 和 NoSQL 的最佳特性。TiDB 兼容 MySQL,支持无限的水平扩展,具备强一致性和高可用性。TiDB 的目标是为 OLTP (Online Transactional Processing) 和 OLAP (Online Analytical Processing) 场景提供一站式的解决方案。
TiDB 是一款定位于在线事务处理/在线分析处理( HTAP: Hybrid Transactional/Analytical Processing)的融合型数据库产品,实现了一键水平伸缩,强一致性的多副本数据安全,分布式事务,实时 OLAP 等重要特性。同时兼容 MySQL 协议和生态,迁移便捷,运维成本极低。
2016 年 12 月 23 日,分布式关系型数据库 TiDB 正式发布 RC1。
4.2.1 架构
图 20 TiDB 的整体架构
一个 TiDB 集群由不同的模块组成,包括:TiDB 服务器、TiKV 服务器、Placement Driver (PD) 服务器。
节点说明 :
- TiDB Servers:负责接收 SQL 请求,处理 SQL 相关的逻辑,并通过 PD 找到存储计算所需数据的 TiKV 地址,与 TiKV 交互获取数据,最终返回结果。无状态的节点,本身并不存储数据,只负责计算,可以无限水平扩展。可以通过负载均衡组件对外提供统一地址。
- TiKV Cluster:负责存储数据,从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range(从 StartKey 到 EndKey 的左闭右开区间)的数据,每个 TiKV 节点会负责多个 Region。。TiKV 使用 Raft 协议做复制,保持数据的一致性和容灾。副本以 Region 为单位进行管理,不同节点上的多个 Region 构成一个 Raft Group,互为副本。数据在多个 TiKV 之间的负载均衡由 PD 调度,这里也是以 Region 为单位进行调度。
- PD Server:类似 Zookeeper。整个集群的管理模块,其主要工作有三个:一是存储集群的元信息(某个 Key 存储在哪个 TiKV 节点);二是对 TiKV 集群进行调度和负载均衡(如数据的迁移、Raft group leader 的迁移等);三是分配全局唯一且递增的事务 ID。一般部署奇数个节点(推荐 3)。
用户的 SQL 请求会直接或者通过 Load Balancer 发送到 tidb-server,tidb-server 会解析 MySQL Protocol Packet,获取请求内容,然后做语法解析、查询计划制定和优化、执行查询计划获取和处理数据。数据全部存储在 TiKV 集群中,所以在这个过程中 tidb-server 需要和 tikv-server 交互,获取数据。最后 tidb-server 需要将查询结果返回给用户。
4.2.2 查询流程
TiDB 是一款分布式关系型数据库,兼容 MySQL,支持 OLTP 和 OLAP 业务。它采用了分布式架构,具有水平扩展能力,适用于海量数据的存储和处理。查询流程是 TiDB 的核心机制之一,了解它的查询执行过程有助于优化数据库的性能。
TiDB 查询流程 :
客户端发送 SQL 请求 :
- 用户通过 MySQL 客户端或其他兼容工具向 TiDB 集群发送 SQL 查询。TiDB 支持标准的 SQL 语法,因此它的查询接口与 MySQL 非常相似。
SQL 解析与优化 :
SQL 解析 :TiDB 首先会对 SQL 查询进行解析,将 SQL 语句转换为抽象语法树(AST)。这一过程分为词法分析和语法分析两个步骤。
- 词法分析:识别 SQL 中的关键字、标识符等元素。
- 语法分析:根据 SQL 的语法规则检查语句是否合法,并生成 AST。
逻辑优化 :TiDB 对解析后的查询进行逻辑优化。常见的逻辑优化包括谓词下推、子查询优化、JOIN 重排、投影下推等。这些优化步骤旨在提高查询效率,减少不必要的计算。
物理优化 :TiDB 会生成多个执行计划,并根据代价模型选择代价最低的计划。物理优化包括选择最优的执行路径,如选择索引扫描、表扫描等方式。
调度执行 :
- 分片与调度 :TiDB 是一个无共享架构的数据库,数据以 Region 为单位存储在 TiKV 中。TiDB 负责将查询分解为多个子任务,分发给不同的 TiKV 节点执行。
- Region 是 TiDB 的最小数据分片单位,每个 Region 存储一段连续的数据。
- TiKV 作为分布式键值存储,提供底层的存储和读写操作。
- 分片与调度 :TiDB 是一个无共享架构的数据库,数据以 Region 为单位存储在 TiKV 中。TiDB 负责将查询分解为多个子任务,分发给不同的 TiKV 节点执行。
执行引擎 :
- 计算层(TiDB Server) :TiDB Server 负责查询的实际执行,调用 TiKV 存储引擎获取数据。
- 下推计算 :部分计算任务可以被下推到 TiKV 节点执行,从而减少 TiDB 和 TiKV 之间的数据传输量,提高查询效率。
- 存储层(TiKV/TiFlash) :TiKV 负责存储 OLTP 类型的数据,而 TiFlash 是一个列存引擎,专门用于加速 OLAP 查询。
- 计算层(TiDB Server) :TiDB Server 负责查询的实际执行,调用 TiKV 存储引擎获取数据。
结果返回 :
- TiDB 将分布式执行的结果合并、汇总,然后将最终的查询结果返回给客户端。
查询优化的几个关键点 :
索引优化 :
TiDB 支持与 MySQL 相同的 B+ 树索引,同时支持多列复合索引。通过选择合适的索引,查询性能可以大幅提升。下推计算 :
TiDB 支持下推计算到 TiKV 层,例如筛选条件、聚合操作等可以在 TiKV 节点完成,从而减少网络传输的压力。并行执行 :
TiDB 支持多节点并行执行查询任务,充分利用分布式架构的优势,提高查询吞吐量。物理分布与调度 :
TiDB 的数据分片机制允许在多台服务器之间均匀分布数据。Raft 协议用于保证数据的强一致性和高可用性。
TiDB 兼容性与应用场景 :
TiDB 兼容 MySQL 5.7,支持复杂查询和事务,并且提供自动水平扩展的能力,适合海量数据的在线事务处理(OLTP)和分析处理(OLAP)。它广泛应用于金融、电商、物流等对数据一致性和可扩展性要求较高的行业。
如果你对某些具体的查询场景或者查询优化有兴趣,可以进一步探讨!
本章参考
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论