TiDB
简介
TiDB 是一款分布式的 NewSQL 数据库,能够支持横向扩展,高可用,水平分片,可线性扩展,同时支持 SQL 和事务。TiDB 基于 Raft 算法实现分布式一致性,通过分布式事务来保证多节点的数据一致性。TiDB 同时兼容 MySQL 5.7 协议,可以无缝迁移 MySQL 应用。TiDB 使用了分布式存储引擎 TiKV 作为存储层,支持横向扩展,提供高可靠的分布式存储服务,同时也保证了强一致性。
以下是 TiDB 的一些特点:
1.分布式架构:TiDB 支持水平扩展,可以无缝地进行容量和性能的扩展,同时提供高可用和故障恢复能力。
2.高性能:TiDB 采用了 MPP 架构,通过将数据水平切分,支持并行查询,实现了高并发、低延迟的查询。
3.兼容 MySQL 协议:TiDB 与 MySQL 5.7 兼容,可以无缝迁移 MySQL 应用,并提供了大多数 MySQL 特性,如 ACID、事务等。
4.分布式事务:TiDB 使用分布式事务来保证数据一致性,支持两阶段提交和分布式快照隔离。
5.智能优化:TiDB 使用了智能优化器和统计信息来优化查询计划,提高查询性能。
6.开放性:TiDB 是开源的,社区活跃,提供了完善的文档和学习资源。
总的来说,TiDB 是一个高可用、高性能、分布式的数据库,能够支持大规模的数据存储和查询,是目前分布式数据库领域的热门选择之一。
原理
存储模型
数据的存储模型是数据库系统需要首先进行的技术选型,存储模型决定了数据以什么样的形式保存。TiKV 选择了 Key-Value 模型,并且提供有序遍历方法。
TiKV 数据存储的关键特性如下:
- 使用 Map 结构进行数据存储,保存的是数据的键值对。
- Map 中的 Key 是按照二进制有序存储的,可以快速的定位某个 Key 的位置,也可以方便的进行区间查询。
TiDB没有自研数据存储的持久化框架,而是直接选择了RocksDB进行数据持久化。
MVCC
为了解决并发写操作引发的数据上锁问题,在分布式场景下,加锁可能会带来性能以及死锁问题。TiKV 使用了 MVCC 思想。TiKV 的 MVCC 实现是通过在 Key 后面添加版本号来实现。
同一个 Key 的多个版本,会按照版本号的大小顺序将数据从前到后进行存储,当用户通过 Key + Version 来获取 Value 的时候,可以通过 Key 和 Version 构造出 MVCC 的 Key,也就是 Key_Version。然后可以直接通过 RocksDB 的 SeekPrefix(Key_Version) API,定位到第一个大于等于这个 Key_Version 的位置。
分布式架构
TiDB采用了分布式架构,可以通过水平扩展来满足更高的负载需求。它将数据划分为多个Region,每个Region都有一组副本,可以自动实现故障转移和数据迁移。TiDB还通过PD(Placement Driver)来管理Region的分布和调度,确保数据的均衡和高可用性。
分布式事务
为了支持分布式事务,TiDB采用了Google的Percolator算法,该算法将事务拆分成多个小的操作单元,通过协调器来保证事务的一致性和隔离性。同时,TiDB还支持分布式快照隔离级别(SI)和可重复读隔离级别(RC),可以满足不同应用场景的需求。
一致性哈希
为了支持数据的动态扩容和缩容,TiDB采用了一致性哈希算法来分配数据副本。一致性哈希算法可以保证当节点数量变化时,只有一小部分数据需要迁移。同时,TiDB还采用了Raft协议来保证数据的强一致性和高可用性。
分布式执行引擎
TiDB的执行引擎使用TiKV作为存储引擎,采用了分布式执行的方式来提高查询性能和可扩展性。TiDB支持对复杂查询的分布式优化和执行,可以将查询计划分解为多个子任务,在不同的节点上并行执行,最终将结果合并返回给客户端。
自动化运维
为了简化运维工作,TiDB提供了TiUP工具来进行集群部署和升级。同时,TiDB还提供了监控和告警功能,可以监控集群的状态和性能指标,并在出现异常情况时及时通知管理员。TiDB还提供了自动化故障转移和数据迁移功能,可以最大程度地降低管理员的工作量。