关于数据库:MPP数据库实现入门

52次阅读

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


大规模并行剖析(MPP)数据库自诞生以来,为数据驱动型企业提供了微小的机会。近日,HashData 联结创始人王占伟围绕 MPP 数据库的根底原理及技术特点与网友进行了分享交换。本文摘选局部精彩观点,与大家共享。

如上图所示,MPP 数据库内核次要包含模块查问、编译查问、优化任务调度查问、执行存储。

MPP 数据库的 API(application programming interface)或者命令行接管到了 SQL 查问申请之后,零碎先通过查问编译,而后查问优化,通过任务调度执行从存储引擎外面把数据拉进去,计算出后果,再返回一个后果集给客户。

在数据库外面遇到的第一个模块叫查问编译。查问编译分大略分为三大块:词法剖析、语法分析、语义查看。

一个查问语句,通过词法剖析、语法分析、语义查看生成的后果叫做 query tree,在通过优化器之后叫做 plan tree,这个就是编译的作用。

查问编译模块在整个数据库外面是最根底的。查问编译之后的过程是查问优化。查问优化器次要负责两个性能:逻辑优化和物理优化。

逻辑优化是指基于关系代数的实践,把查问语句的 SQL 语句做一些等价变换。这里要留神的是,“等价”十分重要,如果把一个 SQL 语句变成了不等价的,后果就会出错。等价变换的目标是为了提供更多可用来参考这个查问打算的解空间。

物理优化是指抉择最优的物理计划。抉择优化的根据有两种,一种是基于规定的优化,在做等价变换的时候,如果变换之后的这个执行计划肯定比变换之前的更优良,那么会抉择等价变换;如果变换之后的计划不肯定更优良,那就要思考变换之前和变换之后的两种计划。前者相当于去做了剪枝,把解空间减掉了一半,后者相当于把解空间减少了一半。

第二类根据是基于代价的查问优化,接下来会重点讲述根据代价的查问优化。

以上图为例,要做到三表关联,关联操作要满足替换率和联合率。通过计算能够得出三种可能的执行形式。这三种形式外面哪种更优良呢?这个时候要去进行评估,付出的老本越小,这个计划就越好。这样产生的查问打算就是基于代价的查问优化。

接下来讲查问优化的代价模型。什么是代价模型?代价是怎么算进去的?代价就是服务器用了多少 CPU 拜访多少磁盘。在算法确定的状况下,网络连接其实是确定的,就能算进去一个操作所须要的开销。每一个操作的开销算进去之后,整个查问打算的开销也就能算进去。

查问打算准确度统计取决于信息的准确度 GIGO、模型的准确度、代价模型的前置依赖等几个因素。

统计信息是基于代价的查问优化器的输出,如果统计信息不准,那它输入的查问打算肯定是垃圾。

影响准确度的第二个因素就是模型是不是精确,因为一个算法,一个数据库的算法的模型是非常复杂的。模型能不能高度还原你的算法,对于查问打算准确度很重要。

代价模型广泛都有一些前置条件,假如这些模型没有相关性,那算进去肯定是错的。

综上所述,查问打算的代价就是把所有的可能性都计算一遍,而后筛选其中最好的一个。

如上图中的例子,是两个表关联进去的一个分布式的查问打算。

查问优化计算出来后,会失去一个查问打算(plant tree),它是一个树状构造。MPP 数据库通常会把一个工作分给所有的执行节点去执行。有没有特例呢?当咱们确定一个工作只须要一个节点就能实现的时候,那咱们能够把它调度为一个节点,这是一个特例。当然,有的时候咱们会让调度器做得更灵便一点,把任务调度给一部分节点去执行,这也是一种策略。

查问打算确定后,就是查问执行。执行器大略可分为两种形式:

第一种形式叫做拉模式,这也是目前广泛采纳的一种形式。拉模式能够了解为所有的计算机一起工作,一台机器计算出来一个数据后,交给下一台机器接着算,就像流水线上的工人一样。

另一种形式叫推模式。这种模式与拉模式正好相同,它是由上层节点先计算,而后将数据逐渐推到最顶上。

接下来着重讲一下 motion 节点。motion 节点负责分布式数据库里的数据交换。

在分布式数据库里,有两类数据的链路替换。一类数据是控制流,它传递的是这个管制命令,传递的是 plan 和一些管制的后果。执行的后果胜利了还是失败了、有没有报错、错误信息是什么等都是这类后果。

另外一类的数据通路是数据流,也就是 tuple 数据,motion 节点解决的都是 tuple 数据。这个数据流量十分大,它不像控制流比拟小。它有一个特点,就是基于 TCP 协定去实现这个 motion 节点数据交换。

分布式数据库执行器如何去实现汇集操作?咱们通常有三种解决形式:一阶段汇集、两阶段汇集、三阶段汇集。

一阶段汇集,是指这个汇集操作只有一台机器执行,和单机数据库一样。它的长处是简略,毛病就是慢,实用于数据量较少的场景。

两阶段汇集是分布式系统中最常见一个办法。这种办法先在每个节点上计算一遍 sum 两头后果,这样能缩小数据总量,升高传输的代价,而且不同节点的 sum 都是并行计算的。

三阶段汇集场景非常少,比拟非凡,这里不再细讲。


向量化和代码生成是近几年数据库执行器畛域呈现的新技术。这两种技术的呈现都是为了晋升性能,更精确地讲是为了晋升 CPU 的运行性能。

实向量化和代码生成并不能晋升 IO 的性能。以上图为例,就是计算一个元组所须要的指令周期。

解释执行的老本在于形象的代价。那么怎么能把这些解释执行的代价降到最低?次要有两种伎俩,一种伎俩是应用计时编译的办法,这样生成的代码是十分紧凑的,打消了不必要的分支,打消了形象的代价,并且进行了内链优化。这意味着能够把解释执行的老本降得非常低。

第二个形式就是晋升分母,以此来摊薄解释执行的老本,这就是向量化。

向量化也好,还是用 Jit 计时编译的办法也好,都能够应用一个叫做 SIMD 指令。

SIMD 指令是 CPU 提供的一种性能,它能够让用户以一条指令来计算多个数据。所以不论是内链优化、Jit 还是向量化,都能够用上 SIMD 指令。

具体实现过程中,向量化的实现可能相对来说容易一些,而运行器代码生成在做代码调试的时候相当的苦楚。咱们通常抉择其中一种来做。但实际上两种联合一起做 Jit 的形式在解决表达式计算的时候是十分无效的。同样的,咱们也能够把它使用到元组解析上。

最初咱们要讲的主题是存储引擎。通常大家议论存储的时候,常常提到列存。那什么是列存?列存和行存有什么区别?

如上图所示,把数据以行的模式寄存,一行存完了再存下一行,下一行存完了再存下一行,这是按行来存,叫做行存。行存次要面向事务型利用。

列存是指同一条数据被拆散在了不同的中央存储,同一列的数据、同一类型的数据严密地寄存在一起。列存次要面向剖析型事务,具备更高效的压缩、节俭 IO 等劣势,毛病是对内存耗费较大。

那么分布式数据库的存储有什么特点呢?分布式数据库在存储方面一个非常重要的的概念叫做数据分布。方才讲的分布式数据库会有很多个节点,每个节点解决的是不同的数据。那这个数据怎么来区别?谁解决哪些数据呢?这就思考到数据分布了。

数据分布通常咱们有两种方法:一种是随机散布;另一种是哈希散布,计算一个哈希值,而后分给大家,这样分布式比拟有法则。

存储引擎在设计时要思考高可用。什么叫高可用?通常的做法是减少正本的数量。那么,减少正本的数量又会带来新的问题,即怎么保障正本之间的数据是一样的呢?现阶段常见的方法是采纳一致性协定,比方状态机复制,从而保障多个正本之间的一致性,不会造成失落数据。

正文完
 0