关于程序员:性能提升100倍GaussDBfor-MySQL近数据处理NDP解锁查询新姿势

林舒,20年以上数据库内核研发教训。原IBMDB2数据库内核专家,特长数据库内核性能优化、SQL查问优化、MPP分布式数据仓库技术等。现就职于华为加拿大研究所,全程参加了RDS for MySQL以及GaussDB(for MySQL)的研发工作,相熟GaussDB(for MySQL) 全栈技术。负责NDP的总体架构设计和实现,并胜利落地上线。领有多项技术发明专利,并co-author了SIGMOD 2020 Taurus( GaussDB(for MySQL)) Paper,目前专一于下一代云数据库智能优化器的钻研。

业务增长对数据库吞吐量和响应能力提出新挑战

随着企业和政府机构将其应用程序迁徙到云端,对基于云的数据库即服务(DBaaS)产品的需要也在迅速增长。传统上的DBaaS产品,是云服务提供商基于现有的数据库软件自身,将惯例数据库部署在云端虚拟机上,应用的是本地或者云存储。这种办法易于施行,然而未能提供足够的性能和可扩展性,而且因为须要复制数据,存储老本也很高。

为了应答这些挑战,云服务提供商开始构建新的云原生关系数据库系统,专门为云基础架构设计,通常采纳将计算和存储拆散到独立扩大的分布式层的设计。这种办法具备多种劣势,包含数据库存储的主动扩大、按应用付费性能、跨多个AZ部署的高可靠性以及故障疾速切换和复原。这些云原生设计还有助于缩小只读正本的数据更新时延,并进步硬件共享和可扩展性。华为云数据库GaussDB(for MySQL),正是具备上述劣势的一款云原生分布式数据库。

因为计算和存储节点通过网络通信,网络带宽和提早往往成为瓶颈。为了克服这一挑战,GaussDB(for MySQL)通过从数据库节点中去除写页面的操作并将检查点操作向下推送到存储节点,以优化与写入相干的网络流量。GaussDB(for MySQL)数据库节点向存储节点发送REDO日志,而不是数据页。因为REDO日志(记录对数据页的批改)通常比批改的数据页小得多, 所以这种办法缩小了网络流量。存储节点(也称为页面存储)可能依据REDO日志构建数据库页面,并能够响应数据库节点的申请,将页面返回到数据库节点。

在传统数据库中,SQL执行引擎从存储中获取数据,并执行包含投影、谓词计算和聚合在内的步骤。对于常常波及大型表扫描的剖析查问,SQL执行引擎必须从存储中读取大量数据页。当存储节点与计算拆散,通过网络通讯时,大表扫描会转化为减少的网络流量。一个典型的例子是对一个十分大的表进行计数查问,查问对象表的所有页面必须从页面存储池(Page stores)发送到要计数的数据库节点,之后,数据库节点将抛弃这些页面中的大部分,因为缓冲区池不能装载这么多数据页,这是对网络带宽资源的节约。华为云翻新的NDP(Near Data Processing,近数据处理,简称NDP)计划解决了这一问题。  

GaussDB(for MySQL)近数据处理(NDP)详解

NDP的设计思路是防止在分布式系统中挪动数据,并让数据处理在其所存储的中央进行。在云原生数据库中,存储节点通常由大量性能弱小的服务器组成,这些存储节点上的CPU资源常常利用率较低,这就为近数据处理(NDP)提供了一个绝佳的机会。

GaussDB(for MySQL)的NDP性能将选定的SQL操作下推到页面存储中,页面存储过滤掉不必要的数据,只将匹配的数据子集返回给数据库节点进一步解决。例如,要解决计数查问,页数据存储能够计数行,并将计数而不是理论数据页返回到数据库节点。这样就防止了大量的网络流量,应用此技术也晋升了查问响应工夫。

GaussDB(for MySQL)能够将三种SQL操作推送到页面存储:列投影、谓词计算和聚合。

  • 列投影:页面存储通过仅保留查问所需的列并抛弃其余列,从而缩小行的长度。
  • 谓词计算:页数据存储仅保留满足谓词的行,并抛弃不满足谓词的行。
  • 聚合:页面依据查问中聚合函数的要求,将多行聚合到单行中,并抛弃原始行。

这三种SQL操作能够以任何组合呈现在NDP中。例如,NDP操作可能仅蕴含列投影,也可能蕴含所有三个SQL操作。让咱们看看一个示例SQL查问:

sele ctsum(salary)
from worker
where age< 40 and
join_date>= date ‘2010-01-01’ and
join_date< date ‘2010-01-01’ + interval ‘1’ year

对于“worker”表中的每一行,页面存储计算谓词“age < 40 and join_date >= date‘2010-01-01’ and join_date < date ‘2010-01-01’ + interval ‘1’ year”。如果行不满足谓词,则将立刻抛弃。如果该行满足谓词,则将其聚合到sum(salary)值中,并抛弃原始行。如果页数据存储无奈聚合行(因为某些外部解决要求),它依然能够从行投影三列(salary, age, and join_date),并生成更窄的行。尔后,原始即将被抛弃。最初,将一个显著缩小的数据集返回到数据库节点。

GaussDB (for MySQL)的 NDP个性架构如下图所示。数据库节点向页面存储发送NDP申请(请留神,通常有多个页面存储服务于每个数据库节点),为了升高IOPS(每秒IO数),将多个页面分组为一个NDP申请(批量页面读取申请),页面存储中的NDP运算符能够执行上述三种SQL操作,并将较小的数据集返回到数据库节点。数据库节点能够是主节点,也能够是只读正本节点,两者都反对NDP。

NDP中的批处理读取和并行处理

在云原生数据库系统中,即便数据库节点和页面存储通过高速RDMA网络连接,但与传统数据库中的本地存储相比,提早依然很高,通过升高网络IOPS和并行执行多个IO能够缩小提早带来的负面影响。在NDP性能中,咱们实现了“批处理读取”的概念。这个想法是在B+树叶数据节点中向前看,并将相邻的叶数据节点分组到一个批处理申请中,而这些B+树叶数据节点是正在进行近数据处理的查问所须要的。批量读取是升高IOPS的一个绝佳办法。如果咱们在每个申请中发送一个页面,那么IO的数量将等于页面的数量。如果咱们将1000个页面分组到一个申请中,IO的数量将缩小1000倍。

下图论述了批处理读取的工作原理。数据库节点发送批量申请,SAL(存储形象层)标识页面所在的页面存储,并将批处理读取拆分为多个子读取:每个页面存储一个子读取。而后,子读取将并行发送到页面存储。应用这种办法,能够同时应用多个页面存储来服务NDP申请。

页面存储接管蕴含多个页面的NDP申请,而这些页面之间没有依赖关系,因而能够应用NDP以任何程序解决。这样既提供了灵活性,又使页面存储可能将页面调配给多个线程并行处理。

GaussDB(for MySQL)应用加强的SQL优化器主动断定NDP是否可能对特定查问无利。如果无利,它将主动启用NDP,SQL优化器查看扫描大小等因素,以及SQL运算如果推送到页面存储,是否能够显著升高数据集大小。一般来说,NDP并不有利于小扫描,例如,当能够用索引缩小要扫描的数据量时。

同时,NDP也有本人的资源诉求。在数据库节点中,NDP次要占用内存资源,因为它须要内存来保留NDP页面。在GaussDB(for MySQL)数据库节点中,NDP页面与惯例页面共享雷同的内存池(又名缓冲区池),没有专门为NDP保留的内存。这种办法的长处是,当零碎中没有NDP时,整个缓冲池可用于惯例解决。然而页面内存一旦被NDP操作占用,在NDP操作实现之前,不能被其余查问应用。这就是为什么必须管制调配的NDP页数,以防止惯例页被剥夺内存。

NDPQ(NDP+PQ),开释查问极致性能,定义分布式数据库新方向

并行查问(PQ)是商业关系型数据库系统的事实标准,为剖析工作负载提供高性能反对。PQ通常采纳“leader-worker”设计,要解决的表被划分为非重叠的数据块,并把这些数据块调配给多个worker解决。每个worker都会产生两头后果,leader会累积这些后果并做进一步解决,以产生最终后果。PQ在数据库节点中提供并行性,利用多个CPU并发解决查问。华为云GaussDB(for MySQL)具备PQ个性,而且NDP和PQ能够协同工作,进一步提高查问性能。能够为PQ worker启用NDP。PQ worker执行的一些SQL操作能够推送到页面存储区,通过将NDP和PQ联合,咱们在GaussDB零碎的数据库节点、多个页面存储之间和一个页面存储外部这三层激活了并行处理的魔力,进一步提高查问性能。

如何启用NDP?

GaussDB(for MySQL)会主动判断NDP是否有助于查问,并为查问启用NDP。用户须要做的就是关上零碎变量“ndp_mode”。ndp_mode能够为整个数据库关上,也能够仅为以后会话关上。要为整个数据库关上ndp_mode,请在“set”命令中增加“global”关键字,如下所示:

set[global] ndp_mode = on

您能够应用“explain”查问以理解是否为查问启用了NDP。例如,以下是树格局的TPC-H查问14的解释输入。为LINEITEM表扫描启用了NDP,投影和谓词计算都会推送到数据页面存储区。此外,还为LINEITEM表扫描启用了PQ。

上面是另一个例子,在LINEITEM表上的计数查问,咱们将此查问命名为Q002。谓词计算和聚合都会推送到页面存储区,PQ也已启用。

上面咱们通过在100GB的TPC-H数据库上运行多个查问,展现NDP和PQ如何晋升查问效率。

测试环境:

  • 上海-1区域的华为云GuassDB (for MySQL)
  • CPU:16个,内存:64GB,缓冲池大小:20GB
  • 将join_buffer_size 和 sort_buffer_size减少到1MB,因为这两个缓冲区对于哈希连贯和排序的性能很重要
  • PQ并发度设置为16

下图的y轴显示查问响应工夫减速因子。减速因子定义:如果原始查问工夫为100秒,而启用PQ后,查问工夫变为50秒,则减速因子应为2。

从上面的测试后果能够看出, NDP+PQ将Q002减速了100多倍

NDP将数据库节点和存储节点解耦,这一个性将成为将来云原生数据库系统的一个规范。大型扫描在OLAP工作负载中很常见,NDP将大大晋升此类操作的效率。

综上所述,NDP能够:

  • 缩小网络带宽的使用量
  • 升高网络IOPS
  • 同时应用多个页数据存储来实现NDP并行处理
  • 进步须要大表扫描的SQL查问的性能
  • 升高数据库节点的CPU使用率,使数据库节点可能反对更多的OLTP工作负载

本文由华为云公布

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据