赞
踩
今天分享分为四章,分别是:TDSQL简介、SQL引擎简介、SQL引擎查询处理和最佳实践。
PartⅠ TDSQL分库分表策略
前面的课程中,我们已经对TDSQL的架构做了比较详细的介绍,这里我们简单回顾一下TDSQL。TDSQL是腾讯针对金融行业推出的一款自主可控、高一致、分布式、HTAP数据库产品,目前已为超过500+金融政企提供数据库服务,行业涵盖了银行、保险、证券信托、互联网金融等等行业。
TDSQL是Shared-Nothing架构的分布式数据库,这张图是TDSQL的核心架构图,在这个架构图中包含了三个重要组件,分别是SQL引擎、MetaCluster和后端SET。其中每个SET是由一主多备构成的高可用复制单元,在一个TDSQL中往往包含多个这样的SET。每一个SET负责存储分布式表的部分分片信息。SQL引擎负责处理业务发过来的SQL请求,然后对SQL进行拆分,发送给各个SET进行处理,并对每个SET返回的结果进行聚合,得到最终的结果。
在TDSQL中,每个SET都会负责一段连续的哈希;在TDSQL中建立的每一个分布式表,SQL引擎都要求用户指定其中的一个列为分区键,SQL引擎通过计算这个分区键的哈希值,将这个表的每一行数据都映射到这个哈希空间,由对应的SET进行存储。哈希空间与SET之间的对应关系,我们叫做路由表。这个路由信息会存储在MetaCluster里。当对整个集群进行缩容或扩容时,每个SET对应的哈希空间也会发生变化,对应的数据也会进行搬迁。SQL引擎通过监听MC来感知集群的变化。
在建表的时候,SQL引擎通过关键字让用户在建表的时候指定其中的一个列为分区键。在这个例子中,用户建立一张表,其中指定ID为shardkey,也就是说SQL引擎通过计算分区键ID的哈希值,将这个表的数据进行打散,均匀的分布在各个SET上。
PartⅡ TDSQL-SQL引擎如何优雅处理海量SQL逻辑
前面我们回顾了一下TDSQL的整体架构,以及Sharding策略。这里我们再介绍一下SQL引擎。
目前TDSQL-SQL引擎已经能够支持绝大多数的MySQL语法,分布式查询、事务和死锁检测。应用程序端可以像使用单机数据库一样,通过SQL引擎来使用整个TDSQL。除了这些比较基本的功能,SQL引擎还支持一些比较高级的功能,例如SQL防火墙、读写分离等等。
我们这里通过一条SQL的大体执行路径来看一下这些功能之间的关系:
应用程序通过MySQL客户端向SQL引擎发送了一条SQL,SQL引擎通过协议解析,从数据包中得到这条SQL,并对这条SQL进行语法解析,语法解析以后我们就得到一棵抽象的语法树,如果应用配置了SQL防火墙,我们还会匹配防火墙的规则,判断这条SQL能否执行。如果能够执行的话,接着我们会构建这条SQL的分布式执行计划——在这个计划里面,我们描述了由哪些SET参与查询的执行,每个SET应该执行什么样的逻辑,SQL引擎又进行怎样的聚合,两者之间怎么进行协调。得到分布式执行计划以后,我们将这个计划再转换成SQL的形式发送给对应的SET执行。接着我们执行读写分离算法,从每个SET中挑选出最适合访问的实例,然后就可以向这个实例发送SQL了。我们收到每个SET反馈的响应以后,对返回的结果进行聚合。这里的聚合逻辑主要是执行分布式执行计划分配给SQL引擎的一些任务。如果是一条简单的查询,我们通过流式聚合就可以得出最终的结果。并将结果反馈给应用;如果是一条比较复杂的查询,往往需要拆分成多个阶段来执行。这个时候就需要构建下一个阶段的分布式执行计划,然后再执行这个计划。经过多次执行,所有的阶段全部执行完毕之后,最终在本地的执行器中进行最终的计算和聚合,从而得到一个最终的结果。
PartⅢ 如何实现高性能SQL引擎查询
我们这里已经介绍了SQL引擎的一个大体的功能,这里我们再具体介绍SQL引擎是怎么处理各类查询的。我们将查询分成两类,一类是Select查询,一类是更新操作,例如Delete、Update、Insert等等。对Select查询的话,我们有两种处理方式:一种是流式处理模型,一种是通用处理模型。流式处理模型主要是处理单表上的查询,而通用处理模型是对流式处理模型的弥补,负责处理分布式的跨节点查询。
3.1 流式处理模型原理及典型案例详解
我们先介绍一下流式处理模型。这里有一个简单的例子
在这个例子里面用户访问的是一个日志表,这个日志表里面有三个列:其中ID是日志的ID,name是用户名,score是用户的历史游戏得分。一个用户会有多个游戏得分,并且他的游戏得分的记录会分散在各个SET上。业务想要获取每个用户的平均分,SQL引擎不能直接把SQL发送给各个SET,所以他需要计算出每个用户的总得分和这个用户在这张表上的一个总记录数,然后用两者的商来求得每个用户的平均分——具体来说SQL引擎要求每个SET返回,每个用户在每个SET上的一个局部的总得分和总记录数。接着SQL引擎将每个SET上返回的结果再进行聚合,得到每个用户的总得分和总记录数,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。