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

32次阅读

共计 4321 个字符,预计需要花费 11 分钟才能阅读完成。

林舒,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 工作负载

本文由华为云公布

正文完
 0