在美团,基于 MySQL 构建的传统关系型数据库服务已经难于支撑公司业务的爆发式增加,促使咱们去探索更合理的数据存储方案和实践新的运维方式。随着近一两年来分布式数据库大放异彩,美团 DBA 团队联合架构存储团队,于 2018 年初启动了分布式数据库项目。git
图 1 美团点评产品展现图github
立项之初,咱们进行了大量解决方案的对比,深刻了解了业界多种 scale-out、scale-up 方案,考虑到技术架构的前瞻性、发展潜力、社区活跃度、以及服务自己与 MySQL 的兼容性,最终敲定了基于 TiDB 数据库进行二次开发的总体方案,并与 PingCAP 官方和开源社区进行深刻合做的开发模式。算法
美团业务线众多,咱们根据业务特色及重要程度逐步推动上线,到截稿为止,已经上线 10 个集群,近 200 个物理节点,大部分是 OLTP 类型的应用,除了上线初期遇到了一些小问题,目前均已稳定运行。初期上线的集群,已经分别服务于配送、出行、闪付、酒旅等业务。数据库
TiDB 架构分层清晰,服务平稳流畅,但在美团当前的数据量规模和已有稳定的存储体系的基础上,推广新的存储服务体系,须要对周边工具和系统进行一系列改造和适配,从初期探索到整合落地须要走很远的路。下面从几个方面分别介绍:安全
咱们对于 TiDB 的定位,前期在于重点解决 MySQL 的单机性能和容量没法线性和灵活扩展的问题,与 MySQL 造成互补。业界分布式方案不少,咱们为什么选择了 TiDB 呢?考虑到公司业务规模的快速增加,以及公司内关系数据库以 MySQL 为主的现状,所以咱们在调研阶段,对如下技术特性进行了重点考虑:多线程
业界的一些传统方案虽然支持分片,但没法自动分裂、迁移,不支持分布式事务,还有一些在传统 MySQL 上开发一致性协议的方案,但它没法实现线性扩展,最终咱们选择了与咱们的需求最为接近的 TiDB。与 MySQL 语法和特性高度兼容,具备灵活的在线扩容缩容特性,支持 ACID 的强一致性事务,能够跨机房部署实现跨机房容灾,支持多节点写入,对业务又能像单机 MySQL 同样使用。架构
针对官方声称的以上优势,咱们进行了大量的研究、测试和验证。并发
首先,咱们须要知道扩容、Region 分裂转移的细节、Schema 到 kv 的映射、分布式事务的实现原理。而 TiDB 的方案,参考了较多的 Google 论文,咱们进行了阅读,这有助于咱们理解 TiDB 的存储结构、事务算法、安全性等,包括:负载均衡
咱们也进行了常规的性能和功能测试,用来与 MySQL 的指标进行对比,其中一个比较特别的测试,是证实 3 副本跨机房部署,确实能保证每一个机房分布一个副本,从而保证任何一个机房宕机不会致使丢失超过半数副本。从如下几个点进行测试:运维
从测试结果来看,一切都符合预期。
美团的产品线丰富,业务体量大,业务对在线存储的服务质量要求也很是高。所以,从早期作好服务体系的规划很是重要。下面从业务接入层、监控报警、服务部署,来分别介绍一下咱们所作的工做。
当前 MySQL 的业务接入方式主要有两种,DNS 接入和 Zebra 客户端接入。在前期调研阶段,咱们选择了 DNS + 负载均衡组件的接入方式,TiDB-Server 节点宕机,15s 能够被负载均衡识别到,简单有效。业务架构如图 2。
图 2 业务架构图
后面咱们会逐渐过渡到当前大量使用的 Zebra 接入方式来访问 TiDB,从而保持与访问 MySQL 的方式一致,一方面减小业务改造的成本,另外一方面尽可能实现从 MySQL 到 TiDB 的透明迁移。
美团目前使用 Mt-Falcon 平台负责监控报警,经过在 Mt-Falcon 上配置不一样的插件,能够实现对多种组件的自定义监控。另外也会结合 Puppet 识别不一样用户的权限、文件的下发。这样,只要咱们编写好插件脚本、须要的文件,装机和权限控制就能够完成了。监控架构如图 3。
图 3 监控架构图
而 TiDB 有丰富的监控指标,使用流行的 Prometheus + Grafana,一套集群有 700+ 的 Metric。从官方的架构图能够看出,每一个组件会推送本身的 Metric 给 PushGateWay,Prometheus 会直接到 PushGateWay 去抓数据。
因为咱们须要组件收敛,原生的 TiDB 每一个集群一套 Prometheus 的方式不利于监控的汇总、分析、配置,而报警已经在 Mt-Falcon 上实现的比较好了,在 AlertManager 上再造一个也没有必要。所以咱们须要想办法把监控和报警汇总到 Mt-Falcon 上面,有以下几种方式:
咱们最终选择了方案三。该方案的难点是须要把 Prometheus 的数据格式转化为 Mt-Falcon 可识别的格式,由于 Prometheus 支持 Counter、Gauge、Histogram、Summary 四种数据类型,而 Mt-Falcon 只支持基本的 Counter 和 Gauge,同时 Mt-Falcon 的计算表达式比较少,所以须要在监控脚本中进行转换和计算。
TiDB 使用 Ansible 实现自动化部署。迭代快,是 TiDB 的一个特色,有问题快速解决,但也形成 Ansible 工程、TiDB 版本更新过快,咱们对 Ansible 的改动,也只会增长新的代码,不会改动已有的代码。所以线上可能同时须要部署、维护多个版本的集群。若是每一个集群一个 Ansible 目录,形成空间的浪费。咱们采用的维护方式是,在中控机中,每一个版本一个 Ansible 目录,每一个版本中经过不一样 inventory 文件来维护。这里须要跟 PingCAP 提出的是,Ansible 只考虑了单集群部署,大量部署会有些麻烦,像一些依赖的配置文件,都不能根据集群单独配置(咨询官方得知,PingCAP 目前正在基于 Cloud TiDB 打造一站式 HTAP 平台,会提供批量部署、多租户等功能,能比较好的解决这个问题)。
随着线上集群数量的增长,打造运维平台提上了日程,而美团对 TiDB 和 MySQL 的使用方式基本相同,所以 MySQL 平台上具备的大部分组件,TiDB 平台也须要建设。典型的底层组件和方案:SQL 审核模块、DTS、数据备份方案等。自动化运维平台展现如图 4。
TiDB 是在线存储体系中的一环,它同时也须要融入到公司现有的数据流中,所以须要一些工具来作衔接。PingCAP 官方标配了相关的组件。
公司目前 MySQL 和 Hive 结合的比较重,而 TiDB 要代替 MySQL 的部分功能,须要解决 2 个问题:
MySQL to TiDB
Hive to TiDB & TiDB to Hive
图 5 TiDB to Hive 方案图
对于初期上线的业务,咱们比较谨慎,基本的原则是:离线业务 -> 非核心业务 -> 核心业务。TiDB 已经发布两年多,且前期经历了大量的测试,咱们也深刻了解了其它公司的测试和使用状况,能够预期的是 TiDB 上线会比较稳定,但依然遇到了一些小问题。整体来看,在安全性、数据一致性等关键点上没有出现问题。其余一些性能抖动问题,参数调优的问题,也都获得了快速妥善的解决。这里给 PingCAP 的同窗点个大大的赞,问题响应速度很是快,与咱们内部研发的合做也很是融洽。
咱们上线的最大的一个业务,天天有数百 G 的写入量,前期遇到了较多的问题,咱们重点说说。
业务场景:
以前使用 MySQL 做为存储,但 MySQL 到达了容量和性能瓶颈,而业务的容量将来会 10 倍的增加。初期调研测试了 ClickHouse,知足了容量的需求,测试发现运行低频 SQL 没有问题,但高频 SQL 的大并发查询没法知足需求,只在 ClickHouse 跑全量的低频 SQL 又会 overkill,最终选择使用 TiDB。
测试期间模拟写入了一天的真实数据,很是稳定,高频低频两种查询也都知足需求,定向优化后 OLAP 的 SQL 比 MySQL 性能提升四倍。但上线后,陆续发现了一些问题,典型的以下:
TiKV 底层有 2 个 RocksDB 做为存储。新写的数据写入 L0 层,当 RocksDB 的 L0 层数量达到必定数量,就会发生减速,更高则发生 Stall,用来自我保护。TiKV 的默认配置:
遇到过的,发生 L0 文件过多可能的缘由有 2 个:
图 6 TiKV 发生 Write Stall 监控展现图
咱们经过如下措施,解决了 Write Stall 的问题:
如今 TiDB 的 GC 对于每一个 kv-instance 是单线程的,当业务删除数据的量很是大时,会致使 GC 速度较慢,极可能 GC 的速度跟不上写入。
目前能够经过增多 TiKV 个数来解决,长期须要靠 GC 改成多线程执行,官方对此已经实现,即将发布。
业务上线初期,insert 的响应时间 80 线(Duration 80 By Instance)在 20ms 左右,随着运行时间增长,发现响应时间逐步增长到 200ms+。期间排查了多种可能缘由,定位在因为 Region 数量快速上涨,Raftstore 里面要作的事情变多了,而它又是单线程工做,每一个 Region 按期都要 heartbeat,带来了性能消耗。tikv-raft propose wait duration 指标持续增加。
解决问题的办法:
临时解决
图 7 insert 响应时间优化先后对比图
完全解决
DBA Truncate 一张大表后,发现 2 个现象,一是空间回收较慢,二是最终也没有彻底回收。
因为 Truncate 使用 delete_files_in_range 接口,发给 TiKV 去删 SST 文件,这里只删除不相交的部分,而以前判断是否相交的粒度是 Region,所以致使了大量 SST 没法及时删除掉。
为了解决 region 过多的问题,咱们在升级 2.1 版本后,开启了 region merge 功能,可是 TiDB 的响应时间 80 线(Duration 80 By Instance)依然没有恢复到当初,保持在 50ms 左右,排查发现 KV 层返回的响应时间还很快,和最初接近,那么就定位了问题出如今 TiDB 层。研发人员和 PingCAP 定位在产生执行计划时行为和 2.0 版本不一致了,目前已经优化。
除了分析查询量大的离线业务场景,美团还有不少分库分表的场景,虽然业界有不少分库分表的方案,解决了单机性能、存储瓶颈,可是对于业务仍是有些不友好的地方:
所以不少分库分表的业务,以及即将没法在单机承载而正在设计分库分表方案的业务,主动找到了咱们,这和咱们对于 TiDB 的定位是相符的。这些业务的特色是 SQL 语句小而频繁,对一致性要求高,一般部分数据有时间属性。在测试及上线后也遇到了一些问题,不过目前基本都有了解决办法。
业务偶尔报出 privilege check fail。
是因为业务在 JDBC 设置了 QueryTimeout,SQL 运行超过这个时间,会发行一个 “kill query” 命令,而 TiDB 执行这个命令须要 Super 权限,业务是没有权限的。
其实 kill 本身的查询,并不须要额外的权限,目前已经解决了这个问题,再也不须要 Super 权限,已在 2.0.5 上线。
TiDB 的物理优化阶段须要依靠统计信息。在 2.0 版本统计信息的收集从手动执行,优化为在达到必定条件时能够自动触发:
可是在没有达到这些条件以前统计信息是不许的,这样就会致使物理优化出现误差,在测试阶段(2.0 版本)就出现了这样一个案例:业务数据是有时间属性的,业务的查询有 2 个条件,好比:时间+商家 ID,但天天上午统计信息可能不许,当天的数据已经有了,但统计信息认为没有。这时优化器就会建议使用时间列的索引,但实际上商家 ID 列的索引更优化。这个问题能够经过增长 Hint 解决。
在 2.1 版本对统计信息和执行计划的计算作了大量的优化,也稳定了基于 Query Feedback 更新统计信息,也用于更新直方图和 Count-Min Sketch,很是期待 2.1 的 GA。
通过前期的测试、各方的沟通协调,以及近半年对 TiDB 的使用,咱们看好 TiDB 的发展,也对将来基于 TiDB 的合做充满信心。
接下来,咱们会加速推动 TiDB 在更多业务系统中的使用,同时也将 TiDB 归入了美团新一代数据库的战略选型中。当前,咱们已经全职投入了 3 位 DBA 同窗和多位存储计算专家,从底层的存储,中间层的计算,业务层的接入,到存储方案的选型和布道,进行全方位和更深刻的合做。
长期来看,结合美团不断增加的业务规模,咱们将与 PingCAP 官方合做打造更强大的生态体系:
图 8 TiDB HTAP Platform 总体架构图
后续的物理备份方案,跨机房多写等也是咱们接下来逐步推动的场景,总之咱们坚信将来 TiDB 在美团的使用场景会愈来愈多,发展也会愈来愈好。
TiDB 在业务层面、技术合做层面都已经在美团扬帆起航,美团点评将携手 PingCAP 开启新一代数据库深度实践、探索之旅。后续,还有美团点评架构存储团队针对 TiDB 源码研究和改进的系列文章,敬请期待!
做者介绍赵应钢,美团点评研究员
李坤,美团点评数据库专家
朴昌俊,美团点评数据库专家