TiDB 是由 PingCAP 开发的分布式关系型数据库,今天咱们很高兴地推出 TiDB 2.1 正式版,提供更丰富的功能、更好的性能以及更高的可靠性。git
今年 4 月份咱们发布了 TiDB 2.0 版本,提高了稳定性、性能以及可运维性,这个版本在接下来的半年中获得了普遍的关注和使用。github
迄今为止 TiDB 已经在 数百家用户 的生产环境中稳定运行,涉及互联网、游戏、金融、保险、制造业、银行、证券等多个行业,最大集群包含数百个节点及数百 TB 数据,业务场景包含纯 OLTP、纯 OLAP 以及混合负载。另外,既有使用 TiDB 当作关系数据库的场景,也有只用 TiKV 做为分布式 Key Value 存储的场景。sql
这几个月,在这些场景中,咱们亲历了跨机房容灾需求、亲历了几十万级别的高吞吐业务、亲历了双十一的流量激增、亲历了高并发点查、高并发写入与上百行复杂 SQL 的混合负载、见到过屡次的硬件/网络故障、见到过操做系统内核/编译器的 Bug。数据库
简而言之,咱们的世界充满了未知,而分布式关系型数据库这样一种应用普遍、功能丰富且很是关键的基础软件,最大的困难就是这些“未知”。在 2.1 版本中,咱们引入了很多新的特性来抵御这些未知,适配各类复杂的场景,提高性能和稳定性,帮助咱们的用户更好地支撑复杂的业务。安全
在 2.1 版本中,咱们对 TiDB 的 Cost-based Optimizer 作了改进,但愿这个优化器可以处理各类复杂的 Query,尽可能少的须要人工介入去处理慢 SQL。例如对 Index Join 选择索引、外表的优化,对关联子查询的优化,显著地提高了复杂 SQL 的查询效率。性能优化
固然,除了自动的查询优化以外,2.1 也增长了更多的手动干预机制,好比对 Join 算子的 Hint、Update/Delete 语句的 Hint。用户能够在优化器没有指定合适的计划时,手动干预结果或者是用来确保查询计划稳定。网络
在 2.1 版本中,咱们对部分物理算子的执行效率进行了优化,特别是对 Hash Aggregation 和 Projection 这两个算子进行了并行化改造,另外重构了聚合算子的运行框架,支持向量化计算。并发
得益于这些优化,在 TPC-H 这种 OLAP 的测试集上,2.1 比 2.0 版本有了显著的性能提高,让 2.1 版本更好的面对 HTAP 应用场景。负载均衡
在 2.1 版本中,咱们引入了 Raft PreVote、Raft Learner、Raft Region Merge 三个新特性:框架
PreVote 是在 Raft Group Member 发起投票以前,预先检查是否能被其余成员所支持,以免集群中被网络隔离的节点从新接入集群中的时候引起性能抖动,提高集群稳定性。2.1 版本已经支持 PreVote 功能,并默认打开。
Learner 是只同步数据不参与投票的 Raft Group Member。在新加副本的时候,首先增长 Learner 副本,以免添加副本过程当中,部分 TiKV 节点故障引起丢失多数副本的状况发生,以提高集群的安全性。2.1 版本已经支持 Learner 功能,并默认打开。
Region Merge 用于将多个太小的 Region 合并为一个大的 Region,下降集群的管理成本,对于长期运行的集群以及数据规模较大的集群的性能、稳定性有帮助。2.1 版本已经支持 Region Merge 功能,还没有默认打开。
这些新特性的引入,有助于提高存储集群尤为是大规模集群的稳定性和性能。
统计信息的及时性对查询计划的正确性很是重要。在 2.1 版本中,咱们提供了基于 Query Feedback 的动态增量更新机制。
在制定查询计划时,会根据现有的统计信息估算出须要处理的数据量;在执行查询计划时,会统计出真实处理的数据量。TiDB 会根据这两个值之间的差距来更新统计信息,包括直方图和 CM-Sketch。在咱们的测试中,对于一个彻底没有统计信息的表,通过十轮左右的更新,能够达到统计信息基本稳定的状态。这对于维持正确的查询计划很是重要。
除了动态增量更新以外,咱们对自动全量 Analyze 也提供了更多支持,能够经过 系统变量 指定作自动 Analyze 的时间段。
TiDB 全部的 DDL 操做都是 Online 进行,不过在 2.0 以及以前的版本中,全部的 DDL 操做都是串行执行,即便 DDL 所操做的表之间没有关联。好比在对 A 表 Add Index 时候,想建立一个 B 表,须要等待 Add Index 操做结束。这在一些场景下对用户使用形成了困扰。
在 2.1 版本中,咱们对 DDL 流程进行拆分,将 Add Index 操做和其余的 DDL 操做的处理分开。因为在 TiDB 的 DDL 操做中,只有 Add Index 操做须要去回填数据,耗时较长,其余的 DDL 操做正常状况下均可以在秒级别完成,因此通过这个拆分,能够保证大多数 DDL 操做可以不须要等待,直接执行。
Explain 对于理解查询计划相当重要,2.1 以前的版本,TiDB 追随 MySQL 的 Explain 输出格式来展现查询计划。可是当 SQL 比较复杂时,MySQL 的格式并不利于展现算子之间的层级关系,不利于用户定位问题。
2.1 版本中,咱们使用缩进来展现算子之间的层级关系,对每一个算子的详细信息也作了优化,但愿整个查询计划一目了然,帮助用户尽快定位问题。这篇文档 能够帮助用户了解 TiDB 的查询计划。
用户除了经过 Explain 语句查看查询计划以外,在 2.1 版本中还能够经过 Explain Analyze 语句查看语句的运行时信息,包括每一个算子运行时的处理时间以及处理的数据量。这样能够经过实际的运行结果,拿到更加精确的信息。
热点是分布式系统最大的敌人之一,而且用户的业务场景复杂多变,让热点问题捉摸不定,也是最狡猾的敌人。2.1 版本中,咱们一方面加强热点检测能力,尽量详细地统计系统负载,更快的发现热点;另外一方面优化热点调度策略,用尽量小的代价,尽快地打散热点。同时咱们也提供了手动分裂 Region 的接口,让用户在特殊场景下将单点瓶颈手动分裂开,再由 PD 进行负载均衡。
2.1 版本对 GC(垃圾回收) 模块进行优化。一方面减小对线上的写入的影响,另外一方面加快了空间回收速度。在内部测试场景中,删除一个 1TB 的表,新的 GC 机制可以在 10 秒内回收 99% 左右的空间。
咱们针对 OLTP 场景中,点查占多数的特色进行了针对性的优化。当经过 Unique Key 或者 Primary Key 进行数据访问时,在优化器和执行引擎中都作了改进,使得语句的执行效率更高,经过 2.1 和 2.0 版本的 Sysbench 对比 能够看到,点查性能提高 50%。
发布 2.0 的时候,咱们同时发布了在 TPC-H Scale 50 的场景中 2.0 和 1.0 的对比结果。其中大多数 Query 都有数量级的提高,部分 Query 在 1.0 中跑不出结果,在 2.0 中能够顺利运行。不过对于 Query17 和 Query18,运行时间依然很长。
咱们在相同的场景下,对 2.1 和 2.0 进行了 对比测试。从下图能够看到(纵坐标是 Query 的响应时间,越低越好),以前的两个慢 Query 的运行时间大幅缩短,其余的 Query 也有必定程度的提高。这些提高一方面得益于查询优化器以及执行引擎的改进,另外一方面 得益于 TiKV 对连续数据扫描的性能优化。
为了让用户更方便的使用 TiDB,咱们提供了三个工具:
上述三个工具能够将 TiDB 和周边的系统打通,既能将数据同步进 TiDB,又能够将数据同步出来。因此不管是迁移、回退仍是作数据热备,都有完整的解决方案。
咱们相信打败“未知”最好的武器就是社区的力量,基础软件须要坚决地走开源路线。为了让社区更深刻的了解 TiDB 的技术细节而且更好地参与到项目中来,咱们今年已经完成超过 20 篇源码阅读文章,项目的设计文档(TiDB 和 TiKV)已经在 GitHub 上面公开出来,项目的开发过程也尽可能经过 Github Issue/Project 向社区展现。一些 Feature 设计方案的讨论也会经过在线视频会议的方式方便社区参与进来,这里 能够看到会议安排。
从 TiDB 2.0 版发布到如今的半年多时间,TiDB 开源社区新增了 87 位 Contributor,其中 杜川 成为了 TiDB Committer,他已经贡献了 76 次 PR,还有一些活跃的 Contributor 有但愿成为下一批 Committer。
在这里咱们对社区贡献者表示由衷的感谢,但愿更多志同道合的人能加入进来,也但愿你们在 TiDB 这个开源社区可以有所收获!