当前位置: 首页 > 科技观察

世界级开源项目:TiDB如何重新定义下一代关系型数据库_1

时间:2023-03-17 12:11:02 科技观察

【.com原稿】著名开源分布式缓存服务Codis作者,PingCAP联合创始人&CTO黄东旭,资深基础架构工程师,擅长分布式开放存储系统的设计与实现,开源狂热者,技术大神级人物。即使在互联网如此繁荣的今天,在数据库这个模糊不确定的领域里,他依然在努力寻找确定性的实践方向。在数据库的平行世界里,黄东旭以不同的方式追随着自己的内心。他认为,当传统关系型数据库无法满足海量数据的处理和分析时,新一轮的窗口期也将开启。但是各种劣质架构、内存架构、NoSQL等方案都不能满足他理想中的方案,这些都不够漂亮,很难实现完美的分布式事务和弹性扩展。绝对的理性和感性在黄东旭的身上似乎是矛盾的。直到2012年底,他看到两篇谷歌发表的论文,像棱镜一样,折射出自己心中的光彩。这两篇论文描述了F1/Spanner,Google内部使用的海量关系型数据库,解决了关系型数据库的弹性扩展、全局分布等问题,在生产中大规模使用。“如果这能够实现,对于数据存储领域来说将是颠覆性的。”完美方案的出现让黄东旭兴奋不已,PingCAP的TiDB就是在这个基础上诞生的。当然,每前进一步都需要付出巨大的努力。在启动TiDB项目之前,黄东旭首先完成了开源的分布式Redis集群解决方案Codis。这个项目完成后,他们觉得虽然缓存的水平扩展有解决方案,但是底层的关系型数据库(主要是MySQL)并没有优雅的伸缩方案。业界除了在业务层分库分表,或者使用中间件等折衷方案外,没有太多其他选择。有些业务可能会迁移到NoSQL,比如HBase、C*等,很多业务无法与之相比。为了顺利迁移,几乎所有的逻辑都需要重写。如果采用分库、分表、中间件的方案,扩容和高可用的方案会带来很多额外的运维成本,比如无法使用跨分片连接、子查询、跨行事务等.然而,作为一名基础软件工程师,黄东旭等人并不想将这些复杂性转移到业务层,于是他们开始重新审视整个数据库,希望从根本上解决MySQL扩容的问题,而不是重新创建一个中间件.“创造一个全新的东西,让它有一天变得富有成效,这将是一种很棒的感觉!”2012年和2013年,黄东旭等人开始研究谷歌发表的新一代分布式数据库Spanner系列文章和F1论文及相关学术进展,到2015年,感觉基本上所有的技术问题和架构都解决了想来想去,于是他们决定全职出来,开始一个新的数据库的全新完整实现,这就是今天的主角——下一代开源NewSQL数据库TiDB。当然,创造并不意味着开始,需要面对无限的投入和无限的游戏来适应互联网的竞争和审视,真正让开发者和企业受益才是真正的开始。TiDB的整体架构基本是基于GoogleSpanner和F1的设计,上层是TiDB和TiKV。TiDB对应GoogleF1,是一个statelessSQLLayer,兼容大部分MySQL语法,对外暴露MySQL网络协议,负责解析用户SQL语句,生成分布式QueryPlans,并翻译成底层KeyValueoperationstosend对于TiKV,TiKV是真正存储数据的地方,对应GoogleSpanner,是一个分布式KeyValue数据库,支持弹性水平扩展、自动容灾和故障转移(高可用)、ACID跨行事务。值得一提的是,TiKV不依赖HBase或BigTable等底层分布式文件系统,具有更好的性能和灵活性,这对于在线业务来说非常重要。▲TiDB整体架构这群人的理想很丰富,也没有被骨感的现实所迷惑。在TiDB开发语言的选择过程中,放弃了Java而采用了Go。整个TiDB项目分为两层。TiDB是SQL层,使用Go语言开发,TiKV是底层分布式存储引擎,使用Rust语言开发。架构确实和FoundationDB类似,也是基于两层结构。FoundationDB的SQLLayer用的是Java,底层是C++,不过去年被Apple收购了。编程语言的选择没有太大的个人偏好。SQL层选择Go相比Java:首先是他们团队后台使用Go开发效率更高,性能尚可,尤其是高并发程序,可以使用goroutine/channel等工具,用更少的代码写出正确的程序;二是标准库中的很多包对网络程序开发非常友好,这对于分布式系统来说非常重要;三是在存储引擎底层有很高的性能要求。毕竟Go是一门有GC和Runtime的语言。TiKV层可用的解决方案不多。以前基本只有C或者C++。不过随着这两年Rust语言的成熟,经过长时间的思考和大量的实验,他们的团队最终选择了Rust。Rust这种静态语言的定位是取代C++。最大的特点是它使用了很多语法限制来防止开发人员编写内存泄漏和数据竞争程序,并且在编译时解决了很多问题,因此在运行时不需要额外的成本。为保证高性能而做GC之类的事情的成本。因此,编写安全的程序是C++程序的一大痛点。C++11虽然有很多改进,但由于沉重的历史包袱或第三方包库开发者水平参差不齐。但重要的原因不是因为别的,而是因为他们不是一个有着深厚C++背景的团队,所以他们最终放弃了C++11,选择了Rust。Rust不仅具有安全和高性能的特点,而且语法更现代,开发效率更高。此外,它还有非常完备的包管理机制(Cargo),使其能够同时编写出非常高性能和安全的程序,开发效率低于Rust。Go并没有下降太多,是目前非常正确的选择。作为Rust社区全球最大的开源项目之一,也得到了Rust官方语言团队的大力支持。黄东旭表示,包括他们需要的一些第三方库,Rust团队会优先开发或者在社区推进。另外,Rust已经发布了1.0,其语法早已稳定。它是一种非常有前途的系统编程语言。在谷歌轮流获得存在感后,他一直奔跑在一望无际的草原上。黄东旭认为,只有专注、专注,才能摆脱迷惑干扰。经过不断探索,终于找到了一种实现事务模型的方法。TiDB的事务模型参考了Google的Percolator。2010年发表,论文描述了谷歌在BigTable上的ACID跨行事务框架,保证索引更新的一致性。算法的核心思想是两阶段提交,但是传统分布式两阶段提交的问题是单点事务管理器无法扩展,会成为整个系统的瓶颈。Percolator采用二级锁机制,实现了去中心化、标准化的事务管理器,大大提高了整个系统的可扩展性。▲GoolgePercolator内部实现了TiDB。这个模型应用到底层存储引擎上,做了很多工程上的优化。例如,黄东旭表示,通过批处理和流水线的方式,对定时服务的吞吐量进行了很大的提升,而使用Raft+RockDB来代替原来的BigTable性能更好,使用乐观事务机制来追求更高throughput,但是从算法层面来说,是Percolator实现的。TiDBvs.NOSQLTiDB这几款NoSQL,最大的特点就是编程接口是SQL,是开发者操作数据库更灵活的方式,而且对MySQL的兼容性极高——原来业务MySQL转TiDB几乎是单行代码无需修改即可完成。TiDB在支持SQL的同时是否失去了HBase等系统的弹性扩展能力?业务层不再需要关心数据库的容量,不需要考虑分库分表,也不需要像过去那样投入大量的运维精力。扩容只需要简单的增加机器。存储节点故障对业务透明,数据库本身具有自愈能力,保证数据不丢失。MongoDB也是如此。更重要的是,无需改变用户已有的习惯和程序。为了定义未来云上的数据库形态,TiDB的设计目标是单个集群需要能够扩展到超过1000个物理节点的规模。P级容量,超过万亿行的结构化数据存储,在此前提约束下的设计和技术选型与MongoDB有很大不同。在大数据量的情况下,TiDB的性能更稳定,扩展更平滑。TiDB的SQL优化器是黄东旭从零开始设计的针对分布式存储的查询优化器。它采用了很多学术界新的查询优化技术和分布式计算框架思想,并保证了MySQL的兼容性。MySQL在处理复杂查询时表现得更好。解决传统数据库痛点任何企业,如果使用传统的单机关系型数据库,在数据量持续增长或业务要求严格的情况下,都可能面临单点故障和单点容量受限的问题可用性。这个问题近年来在互联网行业尤为突出。目前除了上面提到的分库分表和中间件,没有别的解决方案,简直惨不忍睹。TiDB基于更先进的Raft算法,实现了存储层的水平扩展,增加了分布式事务,构建了完整的SQL查询层。在不丢失ACID事务的前提下,支持JOIN、子查询等复杂查询。此外,MySQL接口对外开放,让用户几乎不受侵入地解决大量结构化数据的存储问题。考虑到传统行业和互联网行业的代沟大概有3年左右,而且这个时间还在不断缩短。最近随着TiDB的稳定,越来越多的互联网用户开始使用TiDB。相信以后会成为扩展数据库的一种方式。新的主流选择。TiDB的应用场景应用场景是典型的OLTP场景,范围很广,涵盖任何企业。TiDB的典型用户在关系型数据库上遇到扩展性问题,同时需要强一致性事务,需要在多个数据中心实现强一致性和高可用。TiDB对MySQL有着完美的支持。对于目前正在使用MySQL并希望找到更优雅的水平扩展方案的用户或企业来说,是一个非常好的选择。事实上,目前线上生产环境使用的用户,基本都是互联网场景,来自于MySQL。TiDB目前不支持存储过程和视图,前提是现有业务中没有此类操作。立项第一天,就确定了TiDB最大兼容MySQL。黄东旭坦言,MySQL是一个单机数据库,查询优化器就是为单机场景设计的。基于这种架构构建分布式数据库是非常困难的。这时,他们决定选择一条更彻底的路径,那就是重写整个SQLParser和查询优化引擎。虽然这似乎几乎不可能完成,但他们实际上觉得在更好的设计和复杂性控制下这是一条更容易的道路。选择完全兼容MySQL的好处不仅限于用户友好性,更重要的是它可以吸收MySQL社区的大量测试。对于一个数据库产品来说,做起来并不难。如何证明自己是对的更重要!黄东旭等人不断从MySQL社区收集了数千万个测试用例,以确保每个模块的正确性和MySQL行为的一致性。TiDB项目开源程度TiDB项目100%开源,致力于成为与国际接轨的顶级开源项目。从Githubrepo本身其实很难看出这是一个背后有华人主导的开源项目。所有提交记录、所有Collaboration、Roadmap、Issuetracking、中英文文档、codereview全部开源。该项目已经迭代到Beta4版本。根据在线用户反馈,主要功能已基本完善和稳定。黄东旭表示,接下来的重要工作将是持续的性能优化和稳定性的持续提升,以及在更大容量、更苛刻、更苛刻的集群环境中持续进行测试。当然,周边工具、部署教程、更多的设计文档也在不断丰富中。TiDB的未来从更长远的角度来看,一切都会跑在云端,数据库也不例外。在海量数据和大规模集群的前提下,关系数据库的设计和理论还有很多值得探索的地方。在这个集群的规模下,所有依赖人工的运维都会失败,因为人类无法规模化。数据库需要具有自愈和自扩展的能力。只有这样才能更好的利用集群的计算资源。这也是TiDB团队将自己定位为Cloud-Native数据库的原因。他们在为以后打下很多基础,也在Kubernetes和分布式数据库的结合上做了大量的探索性工作。黄东旭希望TiDB定义下一代关系型数据库,让未来的开发者能够真正专注于自己的业务,而不需要关心数据库的大小,并发度有多高,什么时候做。需要扩容,选择哪个shardingkey。隐藏在一个非常简单的SQL接口下。TiDB有一个很好的开端,他们已经做到了。在下一代关系数据库中,每个人都能感受到这项技术带来的生产力之美!开源项目地址:https://github.com/pingcap/tidbPS:黄东旭将于11月26日出席WOT2016大数据技术峰会,并在NoSQL实用技术专场分享《NewSQL in action: Patterns and Tools》内容,敬请期待。WOT2016大数据技术峰会官网:http://wot.51cto.com/【原创稿件、合作站点请注明原作者和出处为.com】