写点什么

干货帖 | TDSQL-A 核心架构揭秘

发布于: 3 小时前

TDSQL-A 作为领先的分析型数据库,是腾讯首款分布式分析型数据库,采用全并行无共享架构,具有自研列式存储引擎,支持行列混合存储,适应于海量 OLAP 关联分析查询场景。它能够支持 2000 台物理服务器以上的集群规模,存储容量能达到单数据库实例百 P 级。


TDSQL-A 具备强大的海量数据实时分析能力,并全面兼容 PostgreSQL 语法、高度兼容 Oracle 语法,同时具备高安全、高可用、超大规模集群支持和完整事务能力等产品特性,可为企业用户需求提供高效、低成本的数据分析解决方案。


其中,TDSQL-A 完整的分布式事务处理能力,可实时保障系统多平面数据全局读一致性、可靠性;支持多级容灾以及多维度资源隔离,还提供强大的多级安全体系,提供完善的企业级管理能力,为用户提供容灾、备份、恢复、监控、安全、审计等全套解决方案。同时 TDSQL-A 提供弹性扩缩容能力,适用于 GB-PB 级的海量 OLAP 场景,是市场领先的企业级分析型数据库引擎产品。


TDSQL-A 有这么多吸引人的特性,这些特性具体是如何保证完备、优雅地解决以上这些需求问题的呢?以下是腾讯云数据库技术总监李跃森老师对 TDSQL-A 产品核心架构的分享。

一、TDSQL-A 场景定位


TDSQL-A 是腾讯基于 PostgreSQL 自主研发的分布式在线关系型数据仓库,业务场景针对于在线数据分析。


TDSQL-A 是植根于腾讯内部业务发展起来的分布式数据库,最早的时候我们是用 TDSQL-PG 来做一些大数据平台小规模的数据分析。随着业务的发展,我们发现单机的数据库逐渐不能满足业务的需要,我们就萌生了要开发分布式数据库的想法。最早我们服务了微信支付,而随着业务的发展,我们逐步自主研发了列存储,来增进 TDSQL 分析型能力。


同时,随着腾讯云业务的拓展,TDSQL-A 也逐步走向服务外部客户的过程中,积累了大量优秀案例实践。

二、TDSQL-A 核心技术架构


TDSQL-A 整体架构和 PostgreSQL 的整体架构相比,是既紧紧地跟随生态,同时有深度定制改造。


TDSQL-A 数据库的内核,分为几个部分:


第一是上层的 GTM 事务管理器,它主要是负责全局事务的管理,协调机群的事务,同时管理集群的全体对象。右上角是协调节点,它是业务访问入口。协调节点模块是水平对等的,也就是说业务连接到任何一个协调节点上,都能够获得到一致的数据库视图。


第二是下方的数据节点。数据节点也是实际存储数据的节点,每个数据节点只会存储数据的分片,而数据节点之间加在一起会形成一个完整的数据视图。


而数据节点和协调节点之间是集群的数据交互总线。集群数据交互总线在 TDSQL-PG 和 TDSQL-A 之间是存在差异的——两者在系统内名字上来讲都叫集群交互总线,但是在这两个不同的产品形态下,其实现逻辑完全不同——在 TDSQL-A 里面通过基于物理网卡的数据交互汇集器,并通过完整的网络连接的复用来完成这个工作。集群交互总线的目的是把集群内部节点连接在一起,从而完成整个查询交互。


最后,左侧描述的是数据库内核的运维管控系统。数据库在运行的时候需要一个运维管控系统来支撑运营,包括运维管理、实时监控、实时告警、安全审计和数据治理等等。


2.1 TDSQL-A 自研行列混合存储能力


下面介绍 TDSQL-A 全自研的行列混合的存储能力。



数据库的存储有两种方式,一个是按行存储、一个是按列存储:


按行存储表:每行数据存储所有列、一次磁盘 IO 可以访问一行中所有列、适合 OLTP 场景。


按列存储表:每列单独存储,多个列逻辑组成一行;一次磁盘 IO 只包含一列数据;方便做数据压缩;适合 OLAP 场景。


TDSQL-A 支持按列存储和按行存储两种方式来建表,同时在列表和行表之间,用户不用感知到下层的表是通过行表还是列表来建,行表和列表之间可以进行无缝的互操作——包括相互关联、相互交换数据,完全不需要感知到底下的存储逻辑。


除了操作的便利性之外,行表和列表之间混合查询还能保持完整的事务一致性,也就是说在查询运行的同时,整个事务(ACID)的能力也得到完整的保证。


2.2 TDSQL-A 列存储压缩能力


列存模块,我们介绍列存储压缩能力。


TDSQL-A 的列存储压缩分为两种:


第一种是轻量式压缩。轻量式压缩方式首先感知到数据的具体内容,从而针对数据的特点来选用不同的压缩办法提高压缩比,降低业务的成本,当前我们支持 RLE 的压缩方式。


第二种是透明压缩。这种压缩方式是直接使用包括 zstd 和 gzip 直接进行压缩,这种压缩对数据的存储内容没有明确的要求,可以对任何的信息进行压缩。通过数据压缩,可以把数据的体积大幅度减少,一方面减少用户的使用成本,另一方面可以在大量查询分析的时候减少 IO 访问量,提升我们的查询效率。


2.3 TDSQL-A 执行引擎:延迟物化原理



在存储层之上,是数据库的执行引擎。执行引擎模块中,大规模的查询分析场景下的数据交换以及 IO、网络开销是非常大的关注点,因为其对系统性能以及整体扩展性都有很大影响。


TDSQL-A 在调研了业界的技术趋势和技术的发展方向之后,在引擎里引入了延迟物化。相对于延迟物化,就是一般常见的提前物化。提前物化指的就是查询执行器再去执行扫描的时候——这里简单理解这些查询里面包括 Scan、Join、Project 等。


这里举一个例子,一个场景中有两张表——tbl_a 和 tbl_b,两张表上都有 f1 和 f2 两列,分布列都是 f1。按照 tbl_a 的 f1 列与 tbl_b 的非分布列 f2 来进行关联——此时左边是提前物化的计算方法, Project 需要返回 tbl_b 的 f1,进行 Join 关联的时候需要 tbl_b 的 f2,所以在对 tbl_b 进行 Scan 的时候,就会把 tbl_b 的 f1 和 f2 都物化出来。所谓的物化,是把两个列在文件里面读出来,在内存里形成一个虚拟的记录元组,然后往上传输。实际上可以看一下,在最上层往里面投数据的时候,只投影了 tbl_b 的 f1。在这个过程中,如果中间 Join 关联的过滤比例很高,比如说只有 1%是满足要求的,这里面有很多 tbl_b 的 f1 列数据是没有必要传输进来的。


可见,提前物化造成对网络带宽的浪费:


JOIN 的选择率等于 0.01


TBL_B 中有 20 亿条记录


JOIN 有 20 亿 * (1 – 0.01) * sizeof(TBL_B .f1) = 7.4GB 的无效数据传输。


这个现象是在 OLAP 场景下常见的开销,因为 OLAP 做各种复杂查询时很多是宽表,而且查询时大多数时候只会访问宽表里面极少数列,这个时候如果遇到了比较典型的选择率很低、投影率很少的情况,开销就变得不能忽视。


TDSQL-A 延迟物化技术就是针对刚才的问题提出的优化方案。TDSQL-A 延迟物化查询计划会在下层进行 Scan 的时候,针对 Join 中不需要的目标列只往上层传递物理元组的位置信息到上层节点。只有等上层节点完成 Join 关联后,才会去把满足条件的记录的位置信息记录下来,在投影阶段再到下层拉取需要的数据信息,进而透到外面。


通过测试证明,这种方式可以大幅度地节省 CPU 的计算开销和网络 IO、磁盘 IO 的开销。



延迟物化对性能提升的效果:当测试的场景是 20 节点、20 台节点、1TB 的数据,选择率是 10%,投影率是 60%,两表进行 Join。可以明显地发现,时间消耗相比是提前物化的五分之一,网络带宽的占用只有提前物化的一半。假设把表 Join 个数从两个变成三个,消耗的时间则是其 30%,网络占用比接近 40%——也就是说节省了 60%的网络占用。


因此,测试结果证明这对于 IO 和网络开销有非常明显的节省。而通过这两个开销的节省,可以进一步影响到性能的提升。



此外我们专门做了一个复杂 Join 的测试:选择率是 1%、投影率是 100%;两表的 Join,横坐标是 100GB 到 1TB。从上面两表的 Join 可以看出,表越大到 1TB 的时候,相比开源的 GP 有 5.2 倍性能的提升;假设把两张表变成三张表,则有 18 倍性能提升。可见,随着查询变得复杂、表变得越大,在延迟物化的场景下对性能的提升越明显。


2.4TDSQL-A 全新设计的异步执行器解耦控制和数据交互


最初我们目标是让 TDSQL—A 支持数千台服务器集群规模。支撑数千台服务器的规模,存在一些必须要去跨越的障碍,其中一个障碍就是网络连接数过多。



为了解决上连接数过高的问题,TDSQL-A 全新设计了异步执行器。TDSQL-A 的执行器是全新自研设计的执行器,主要有两个特点:第一个是异步执行;第二个是控制逻辑和数据传输逻辑分离。


具体来说,系统在查询优化阶段的时候会生成统一的执行计划、统一执行需要的资源,这是 TDSQL-A 的控制逻辑。同时系统把整个网络通信进行了抽象,抽象成下面蓝色的 Router——Router 主要是负责机群内部的数据查收。不同的进程之间,比如两层 Join 或者三层 Join,不同层级的进程之间是完全异步执行的,并通过推送数据的方式来完成数据交互。假设有 N 个节点,有 M 层 join,则一共有 M×N 个进程。


在对执行器进行异步化和控制数据分层的基础上,TDSQL-A 又对数据交互逻辑进行完整实现,这就是数据交互总线(Forward Node)。它主要是负责节点间的数据交互。可以认为它是我们集群的逻辑网卡。



FN 通过共享内存和 CN、DN 进行数据交互——当然也存在本地的逻辑交互,假设数据需要从本地内部进行交互,可以不走网络而直接在内存里面完成交互,进一步提升性能。


启用了 FN 之后,假设有 N 个节点,M×Join 不管有多复杂,连接个数都是只有(N-1)×S——这个“S”是一个正整数,这意味着每台服务器和其他服务器建 N 个连接,一般来说会乘 2,这样就可以把整个集群内部的网络连接完全抽象和简化。服务器与服务器之间建立的连接个数变成近似于和集群规模相关的一个很小的数值:假设我们有 2000 台服务器,这个值也只会在 4000 左右。


现在很多业务场景下业务都会要求读多写少——非常复杂的查询的读多写少,比如最多有五六张 20 亿条的表进行关联,同时有数十个、甚至更多并发发生。这种情况将对数据库的计算资源带来极大的挑战。一般而言,在不具备这个技术之前,一般做法是每当计算资源不足,就多建一个新的数据库集群来保存完整的数据,在新建副本上通过扩容的方式实现冗余数据的重新查询。这种方式存在很大的问题——建一个新的数据库,数据一致性是非常大的挑战。扩容的时候规模变得很大,同时每新建一个数据库集群,就需要容灾、备份等所有的资源都同时扩展,这导致的结果是数据库整体的开销更大、成本更高。


针对这个问题,TDSQL-A 设计推出了多平面方案。


2.5 TDSQL-A 的多平面能力提供一致的读扩展性



所谓的多平面:一个平面对应一个完整的数据副本,完整的数据副本可以提供完整的一致性读扩展服务——读扩展可以是单条的查询,也可以是复杂的 OLAP 的关联查询,通过这种方式 TDSQL-A 可以提供成本低廉的读扩展服务。


在 TDSQL-A 整个架构体系当中,多平面技术可在数据库集群内部保证各个平面之间数据一致性,同时也能保证各个平面在读取时数据事务的一致性。


2.6 TDSQL-A 如何做到高性能计算—全并行能力



对数据库来说最关键的一点的无疑是高性能计算。以下介绍 TDSQL-A 在高速并行计算方面的工作。


在海量数据的实时分析场景下,我们一定要充分去发挥、充分压榨资源才能达到最好的效果。这个方式,在 TDSQL-A 里面叫全并行能力。


TDSQL-A 全并行分为三个层级:


第一层节点级并行。所谓节点级的并行是,系统拿到一个查询之后,会把查询分发给各个不同的 DN,通过 DN 之间分片区的查询来完成节点级并行;


第二是执行器拿到分配后把算子并行化,即尽量使用允许更多 CPU 资源来完成查询工作,通过多 CPU 方式提升查询的效率;


第三层是指令层面,包括对于 CPU 的特殊指令、SMD 指令等,通过简单的算术运算或者求值,以及通过指定值的优化和并行来提升查询效率。


总结而言,全并行计算是系统榨干硬件潜力的必经之路,是做复杂查询、实时在线查询的必经之路。



除了高性能计算,随着行业对 OLAP 技术深入研究,近年来向量化也越来越受到关注。在 TDSQL-A 系统,也实现了向量化能力:数据量越大,列存储场景下向量化结果越明显,最好的结果是列存储向量化运行时间会达到列存储非向量化的二分之一、行存储时间的八分之一左右。向量化也是在列存储引擎里实现实时在线分析的必经之路之一。

三、结语


当前,是 TDSQL-A 的新起点,未来 TDSQL-A 整体规划分两部分:一方面是陆续将目前基于 PG10 的版本,merge 到 PG11、PG12、PG13 等更高版本,持续地跟进社区版本丰富的特性来提升用户的体验,为客户创造更多价值。另一方面,TDSQL-A 希望通过引入新硬件,来提升产品竞争力,为客户提供更好的服务。

用户头像

还未添加个人签名 2018.12.08 加入

还未添加个人简介

评论

发布
暂无评论
干货帖 | TDSQL-A核心架构揭秘