PolarDB for PostgreSQL 内核解读 :HTAP架构介绍

简介:在 PolarDB 存储计算分离的架构基础上我们研发了基于共享存储的MPP架构步具备了 HTAP 的能力,对一套 TP的数据支持两套执行引擎:单机执行引擎用于处理高并发的 OLTP;MPP跨机分布式执行引擎用于复杂的 OLAP 查询,发挥集群多个 RO 节点的算力和IO吞吐能力。

作者:北侠,阿里云高级技术专家,阿里云PolarDB PostgreSQL云原生数据库HTAP业务和技术负责人。

在 PolarDB 存储计算分离的架构基础上我们研发了基于共享存储的MPP架构步具备了 HTAP 的能力,对一套 TP的数据支持两套执行引擎:

  • 单机执行引擎用于处理高并发的 OLTP
  • MPP跨机分布式执行引擎用于复杂的 OLAP 查询,发挥集群多个 RO 节点的算力和IO吞吐能力

本文整理自《开源学堂:PolarDB for PostgreSQL 内核解读 —— HTAP架构介绍》直播分享。

存储计算分离架构

首先我们先来了解一下 PolarDB 的架构,从上图中可以看到,左侧是计算存储一体化,传统的数据库的存储是存在本地的。右侧是 PolarDB 存储计算分离架构,底层是共享存储,可以挂任意多个计算节点。计算节点是无状态的,可以很好地做一个扩展,另外可以降低成本,比如用户可以扩展到16个节点,但底层存储还是一份存储(3副本)。

分布式存储是比较成熟的存储解决方案,自带存储的高可用,秒级备份,像 Ceph、PolarStorage,都是比较成熟的存储解决方案。把社区单机的 PostgreSQL 数据库,直接跑在一个共享存储设备上,是不是可以认为是PolarDB 呢?答案是不可以直接这么做,根本原因是在这套架构下有一份存储,但是计算节点有N个,计算节点之间需要协调。

存储计算分离的架构需要解决的问题,首先是一致性问题,1份存储+N份计算。第二,读写分离,在这个架构上做低延迟的复制。第三,高可用,解决怎么样去做快速的恢复。第四,IO 模型发生了变化,分布式文件系统是没有实现cache,可以把省下来的内存直接给数据库的 BufferPool 使用。

HTAP 架构 - 存储计算分离处理AP查询的挑战

在这个架构下,如果用户需要跑一些分析型的查询,可以举个实际例子,比如像电信计费系统,白天处理用户的充值、各种积分的结算,像这样的请求,都会带有 UserID,通过索引可以精确地定位到修改的页面。在晚上会跑一些批量的分析,比如做对账,在不同的维度去统计省、市,统计整体的销售情况。存储计算分离的架构在处理大查询上,把 SQL 通过读写分离,将 SQL 动态地负载到负载较低的节点上。

这个节点在处理复杂 SQL 时,PG 数据库具备单机并行的能力,虽然单机并行处理复杂 SQL 比单机的串行有很大的提升,但在单机并行下内存和 CPU 还是有一定局限性,在这种架构下处理复杂 SQL 只能通过 Scale Up 的方式来加速。也就是说如果发现 SQL 处理得比较慢,就只能增加 CPU,增加内存,找一个配置更高的机器来当只读节点。而且单一节点来处理一个复杂SQL,是无法发挥出整个存储池大带宽的优势。

因为分布式存储底层是有多个盘,每个盘都具有读写的能力。如果计算节点成为瓶颈,那么底层共享存储池,每个盘的能力是无法发挥的 。另外一个问题,当只用一个节点来处理复杂 SQL 时,其他节点有可能是空闲的,因为通常AP的并发是很低的,有可能只是几个节点在跑一些固定的报表SQL,而其他的节点是处于空闲的状态,它的CPU,内存还有网络也是没有办法利用起来的。

HTAP 架构 - 基于共享存储的MPP

PolarDB 的解决方案是将多个只读节点连在一起,实现了基于共享存储的分布式的并行执行引擎,用户可以比较灵活地来使用整个系统。比如用某些节点来跑 TP 查询,代码路径就走到了单机查询。单机查询的好处是处理点查点写比较快,因为它不涉及到分布式事务,单机可以很快处理完成。当需要对复杂 SQL 来做计算时,可以利用多个只读节点并行执行一个 SQL,即分布式的并行执行引擎 MPP 方案。
PolarDB 的 MPP 和传统数据库比如 Greenplum 这类基于分片的 MPP 是有本质区别。比如在某个时间点发现分计算能力不足了,PolarDB 可以很快地增加只读节点的个数,而且此时整个底层的共享存储数据不需要去做重分布。用过 Greenplum 传统的 share nothing MPP 会知道,扩容或缩容是非常大的运维动作。

PolarDB 是存储计算分离的,计算节点是无状态的,可以通过迅速增加节点让计算能力变得更强大。另外的好处是TP 和 AP 可以做到物理隔离状态,保证用户在执行 TP 时不影响AP, AP 也不影响 TP。
这套方案实际上是具有一套数据,像传统的一些方案支持两套,比如将TP的数据导出到另外一套 AP 的系统里面,它的数据要拷贝一份,同步出过程数据的延迟也是比较大的。而且对资源是一种浪费,比如白天跑TP,晚上跑AP,实际上两个集群只有一个集群在发挥作用。PolarDB 是提供一体化解决方案——在共享存储上用一套数据支持两套计算引擎,一个是单机引擎,一个是分布式并行的执行引擎。通过共享存储的特性,以及在读写节点之间的延迟可以做到毫秒级。相比于传统的通过 TP 数据导到 AP 的系统里面,数据新鲜度可以做到毫秒级的延迟。

HTAP 架构原理

如何实现一个并行数据库?其核心思想是计划树中引入 Shuffle 算子,通过它可以屏蔽掉底层数据分布特性,实际上也是 MPP 的工作原理。

那么基于 PolarDB 共享存储会有什么变化?因为底层的数据是一个共享的状态,比如计划树实际是通过A join B,并且对结果做 connt(*)。如果直接把 Greenplum 并行的模式,直接在PolarDB 实现一套传统的MPP,两个节点同时去执行 AB 的 join, 由于A和B对于两个节点来说,是共享的,都能看到所有数据,这两个节点分别 join A 和 B 然后做统计记数,最终得到的记数是真实值的两倍。同时 A、B 处理的数据量并没有减少,对整个过程没有起到加速的效果。

因此就要去解决怎么样对任何一个表做动态拆分的问题。需要做出并行算子的并行化,将原来PG数据库里面所有的 Scan 算子以及 index Scan算子都做并行化。并行化是指可以按照一些固定的策略,逻辑上将任何一个表进行切分。切分之后,对于整个计划数的上层算子来说,是无法感知底层是共享存储的。类似通过Shuffle算子来屏蔽数据分布特征,PolarDB通过一系列PXScan并行化扫表算子,来屏蔽底层数据的共享特征。这就是HTAP架构上的原理。

从数据库的模块上来看,基于共享存储实现MPP,需要做什么?

  • 第一,分布式执行器。因为需要对所有的扫描算子做并行化。接着引入网络,因为数据要做交互,要做Shuffle,还要引入计划管理。
  • 第二,事务一致性。因为之前 PG数据库的查询是局限于单机的,单机查询要通过 MVCC 的多版本的快照来做到事务的一致性。而现在则是把 SQL 分散到不同的阶段去执行,不同的节点在回放主库数据的时候,是有快有慢的,需要去做一次性的控制,才能让所有的节点的数据都能集中于统一。
  • 第三,分布式优化器。分布式优化器是基于社区的GPORCA做二次的架构扩展。GPORCA优化器是模块化的设计。因为现在的底层数据没有分片,需要在优化器里面增加一些规则, 以此来告诉优化器,底层的数据是共享的特性。
  • 第四,SQL 全兼容。如果要支持一种全新的执行模式,那么在SQL的标准里面,各个方面都要去做兼容。比如 Left join,在单机和分布式下方法是不一样的。如果直接将原生的PG社区的算子放到分布式,是有问题的,而且有些行为不符合SQL标准。

HTAP - 执行器

HTAP 执行器就是通用 MPP的做法了,整体上分成控制链路和数据链路。其中有两种角色,PX Coordinato和 PX Worker。PX coordinator去执行优化器的部分,然后产生一个分布式的计划数,再将计划进行切片分发出去。有可能分发到了 Polar DB集群中其他 RO 节点,这些节点拥有一个子计划数,通过数据链路,汇总到 PX Coordinator,最终将数据返回给客户。

HTAP - 弹性扩展

基于共享存储来做MPP有什么样的优势?

第一,与传统基于share nothing的MPP相比,PolarDB 具有更好的弹性。在上图右侧部分,把整个MPP的执行路径上所依赖的状态,比如元数据的状态,以及每个 Worker 运行期的状态,都存在了共享存储上。将分布式计算的每个 worker,变成 Stateless。它的状态,一方面从共享存储上的读取,另外一方面来自协调者通过网络发送。这样可以做到无状态化的分布式的执行。就PolarDB 而言,数据存到共享存储上,原数据存到共享存储的表里面。 运行时的信息,比如 worker 被某个SQL 连到 RO1上,需要启动8个 worker 来工作,8个 worker 分布到RO2和RO3上,4个 worker 刚开始启动的时候是不知道任何信息的,RO1 将这条 SQL 的相关信息,通过网络发送给8个worker,这8个worker就可以去执行了。这就是做完全弹性化MPP分布式引擎的思路。此时 Coordinator 节点就变成了无状态化。既可以把 RO1 当作中心化的协调节点,也可以把 RO2 当做协调节点,这就消除了传统 Greenplum 架构下的单点问题。

第二,算力弹性扩展,在上图中有四个节点,它的业务里面涉及到一些SQL。这些SQL是复杂的查询,可以到RO1 和 RO2 上去查。另外一个业务域,可以把它的业务拆分成两部分,一部分业务可以跑到 RO3 和 RO4 上,是可以动态调整的。

PolarDB 性能表现

上图为 Polar DB 分布式并行性能和单机并行的性能的对比,第一张图显示了 TPCH 22条 SQL 加速比,其中有三条 SQL 的加速比是超过60倍的,大部分 SQL 都是超过十倍以上的提升。第二个测试将共享存储上 1TB 的TPCH的数据,16个计算节点,通过增加 CPU 看性能表现如何。在第二张测试图中,从16 core到 256 core,基本上是线性提升的表现,但是到 256core 就到达瓶颈。这是因为受限于存储带宽,如果增加带宽,整体的性能还会提升。最下方的图里面显示了22 条 SQL 在16core 到 256core 的性能的表现,可以看到在 16core 到 128core 时是线性提升的。

还有一组是 PolarDB 和 Greenplum 的对比。测试环境为相同的硬件,16个计算节点,1TB TPCH 。从上图中可以看到 Greenplum 有 16core和 16个 CPU 在做 SQL 处理。在采用相同并行度时,PolarO 的性能是 Greenplum 的89%。为什么在单核时 Polar 会达不到 Greenplum 的性能表现?这是因为数据在共享存储上是没有数据特征的, Greenplum 在建表的时候,数据默认做哈希分区,在两个表 join 时 join Key 和分布 Key 是一样的,不需要做数据的 Shuffle。而 Polar 只有一张表,这张表没有数据特征,是一个随机分布的数据格式。此时任何两个表去 join 的时候,都需要做一个shuffle,由于网络因素,Polar 单核性能表现只能达到 Greenplum 的89%。针对这个问题,我们将通过 PG 的分区表的方式进行优化。

虽然 Polar DB 底层的数据是共享的,但仍然可以以哈希的方式建一个分区表。这个时候可以将Polar DB的HTAP MPB的方式和Greenplum的方式对齐一致,这个功能实现之后,Polar 的单核性能和Greenplum就是一样的。图中红框部分我们又进行了四组测试,Polar DB 支持计算能力弹性扩展,此时数据是不需要重新分布的。这是数据随机分布的好处,在做分布式执行引擎的时候,第一优先级考虑的不是极致的性能,而是是系统的扩展性,即当你的计算能力不足的时候,可以快速增加节点来加速计算。

像 Greenplum 这类传统的 MPP 数据库,它的节点是固定,而Polar是无状态的,可以随时去做调整计算CPU数的。这组测试里面只需要调整一个GUC参数就能将Polar从16core变成256core,算力线性扩展。

当 Polar DB 支持了MPP之后,还能做哪些事情?新上线的业务导入了大量的数据之后,需要做一些索引。其原理是先将数据进行排序,之后在内存里组织成一个索引页面,然后将这些页面直接写到盘上。如果Polar DB 支持并行之后,玩法就不一样了,从上图中可以看到,通过节点 RO1、RO2 和 RO3,可以并行地到共享存储上去扫描数据,然后并行地在本地进行排序。排完序之后,将数据通过网络传给RW节点。RW节点经过归并排序,将排序的数据,在内存里面组织成一个索引页,交给btbuild进程。在内存里面,通过索引页,去更新索引页之间的指向关系,来构建索引树的指令关系,然后开始写盘。

这个方案借助了多个节点的计算能力以及 RO 能力,在排序的阶段进行了加速。同时通过网络传给MPP 的一个QC节点,即中心节点。这个节点再通过共享内存,发给 btbuild 进程。经测试使用500G的数据来建索引,性能可以提升到五倍左右。

加速时空数据库

时空数据库是一个计算密集型的、用 RTree 索引的粗过滤。先通过RTree,然后通过空间踩点定位到一个区域,在这个区域里面,再进一步精确的过滤。共享存储的 index scan 的过程,RTree 扫描,只能用NestLoopIndex Join,因为是没有办法做哈希join的,这是因为 RTree 的二维空间没有办法做完整的切分。对于时空的业务都是通过 NestLoopIndex Join,从一个表里面拿到一个数据,然后到另外一个表里面的 RTree上扫描,这在 Greenplum上是无法做到的,因为它的索引树是被拆分的。但是在 PolarDB 里面,RTree的索引树是共享状态,那么无论 worker 是在节点1,还是在节点2上,在共享里存储理念里索引树都是完整的。这个时候两个worker就可以直接用外表做协调的切分。由于它是计算密集型的,那么它的加速效果会更加的好。经过测试,在80 CPU 的环境下,整体的提升能达到71倍。

以上就是关于 HTAP 架构的介绍,后续将会有更多实现上的细节分享,比如优化器、执行器、分布式一致性等,敬请期待。

原文链接

本文为阿里云原创内容,未经允许不得转载。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511302.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kubernetes 的这几种存储卷,别再傻傻分不清了

作者 | 江小南来源 | 江小南和他的小伙伴们存储卷类型Kubernetes提供的存储卷(volume)属于Pod资源,共享于Pod内的所有容器,存储卷可在容器的文件系统之外存储相关的数据,也可以独立于Pod的生命周期实现数据持久化存储。…

这群人,用8年讲述体育能有多迷人

望尘科技:专注体育娱乐在线体验的自主研发,致力于让体育迷获得高品质的沉浸式体验。用科技致敬体育,是他们坚持的信仰。 客户故事 望尘科技一心专注深耕体育游戏。他们把自己的计算中心搬到了云上,借助阿里云数字基础设施为程序…

成中集团线下IDC迁移上云

阿里云根据成中集团业务场景入手,提供了上云方案和迁移建议,利用这套架构,保障了公司数据的安全性并且满足了公司对于备份机制的建立的基本诉求,并且降低了业务出现中断的风险。 公司介绍 成中简介: 我们公司是一家…

什么是hpaPaaS平台?

作者 | Gordon Van Huizen,Mendix公司平台战略高级副总裁 供稿 | Mendix Gartner为两种云端应用开发方法创造了两个名称:高生产力应用程序平台即服务(hpaPaaS)和高控制应用平台即服务(hcaPaaS)。本文将对二…

重新认识访问者模式:从实践到本质

简介:访问者模式在设计模式中的知名度虽然不如单例模式,但也是少数几个大家都能叫得上名字的设计模式了。不过因为访问者模式的复杂性,人们很少在应用系统中使用,经过本文的探索,我们一定会产生新的认识,发…

3个案例,详解如何选择合适的研发模式

简介:3个案例,详解如何选择合适的研发模式,研发模式的选择与产品形态、发布方式、团队规模、协作成熟度密切相关。本文我们将根据不同的团队场景,分析如何选择适合团队的研发模式。 策划&编辑|雅纯 上一讲&#x…

如何打造一款极速数据湖分析引擎

简介:本文向读者详细揭秘了数据湖分析引擎的关键技术,并通过 StarRocks 来帮助用户进一步理解系统的架构。 作者: 阿里云 EMR 开源大数据 OLAP 团队 StarRocks 社区数据湖分析团队 前言 随着数字产业化和产业数字化成为经济驱动的重要动…

如何在 Linux 命令行中按大小对文件进行排序

作者 | 刘光录来源 | TIAPls 命令用于显示目录的内容。使用 -l 选项,可以列出文件和目录及其属性。今天我们来分享一下如何根据文件大小对列表进行排序。ls -l 命令可以显示文件大小,但也仅仅是能让我们看到文件的大小,它默认是按照字母顺序显…

福建品品香茶业有限公司业务迁移上云

福建品品香茶业有限公司数据量较大,进行业务迁移上云时阿里云根据其公司需求综合考虑,推荐将原有IOE架构改为分布式架构,使用ECSRDS承载业务,为客户带来极大价值。 企业介绍 福建品品香茶业有限公司是一家集茶叶种植、加工、销售…

璀璨智行:V2X车路协同智慧交通

V2X车用无线通信技术是指车对外界的信息交换,作为未来智能交通运输系统的关键技术,璀璨智行潜心研究V2X技术,致力于V2X车路协同的落地,在智慧交通领域做出了卓越的贡献。 创业机会点 魏军博表示:“面对交通系统效率低…

Databricks 企业版 SparkDelta Lake 引擎助力 Lakehouse 高效访问

简介:本文介绍了Databricks企业版Delta Lake的性能优势,借助这些特性能够大幅提升Spark SQL的查询性能,加快Delta表的查询速度。 作者: 李锦桂(锦犀) 阿里云开源大数据平台开发工程师 王晓龙&#xff08…

深度解析数据湖存储方案Lakehouse架构

简介:从数据仓库、数据湖的优劣势,湖仓一体架构的应用和优势等多方面深度解析Lakehouse架构。 作者:张泊 Databricks 软件工程师 Lakehouse由lake和house两个词组合而成,其中lake代表Delta Lake(数据湖)&…

1688 复杂业务场景下的 Serverless 提效实践

简介:我们主要负责 PC 端 1688.com 以及手机端阿里巴巴 APP,是目前国内最大的 B 类电商交易平台,主要面向 B2B 电商业务的场景,为中小企业提供零售、批发、分销以及加工定制等电商交易渠道。 前言 首先为大家简单介绍一下我们的…

阿里 蚂蚁自研 IDE 研发框架 OpenSumi 正式开源

简介:经历近 3 年时间,在阿里集团及蚂蚁集团共建小组的努力下,OpenSumi 作为国内首个强定制性、高性能,兼容 VS Code 插件体系的 IDE 研发框架,今天正式对外开源。 作者 | OpenSumi 来源 | 阿里技术公众号 经历近 3 …

剖析 kubernetes 集群内部 DNS 解析原理

作者 | 江小南来源 | 江小南和他的小伙伴们引言说到DNS域名解析,大家想到最多的可能就是/etc/hosts文件,并没有什么错,但是/etc/hosts只能做到本机域名解析,如果跨机器的解析就有点捉襟见肘了。在服务器中还有一个配置值得大家注意…

首次公开,阿里云开源PolarDB总体架构和企业级特性

简介:在3月2日的阿里云开源 PolarDB 企业级架构发布会上,阿里云 PolarDB 内核技术专家北侠带来了主题为《PolarDB 总体架构设计和企业级特性》的精彩演讲。 在3月2日的阿里云开源 PolarDB 企业级架构发布会上,阿里云 PolarDB 内核技术专家 北…

阿里云数据库开源发布:PolarDB HTAP的功能特性和关键技术

简介:在3月2日的阿里云开源 PolarDB 企业级架构发布会上,阿里云 PolarDB 内核技术专家严华带来了主题为《PolarDB HTAP详解》的精彩演讲。在PolarDB存储计算分离架构的基础上,我们研发了基于共享存储的MPP分布式执行引擎,解决了单…

倒计时 2 天!2022 中国算力大会:移动云邀您共见算力网络,创新发展

7 月 29 日 - 31 日由工业和信息化部、山东省人民政府主办的首届中国算力大会将在泉城济南盛大举行!中国移动受邀承办“算力网络,创新发展” 论坛并设立展区分享行业前瞻洞察,构建开放共赢生态7 月 29 日下午,邀您共话算力精彩&am…

什么是好的错误消息? 讨论一下Java系统中的错误码设计

简介:一个好的Error Message主要包含三个部分:Context: 什么导致了错误?发生错误的时候代码想做什么?The error itself: 到底是什么导致了失败?具体的原因和当时的数据是什么?Mitigation: 有什么解决方案来…

阿里巴巴在开源压测工具 JMeter 上的实践和优化

简介:Apache JMeter 是 Apach 旗下的开源压测工具,创建于 1999 年初,迄今已有超过 20 年历史。JMeter 功能丰富,社区(用户群体)庞大,是主流开源压测工具之一。 作者:灵苒、涧泉 Ap…