标点符(钱魏 Way)

基于PostgreSQL的开源分布式数据库:Greenplum

Pivotal宣布开源大规模并行处理(MPP)数据库Greenplum,其架构是针对大型分析型数据仓库和商业智能工作负载专门设计的。借助MPP这种高性能的系统架构,Greenplum可以将TB级的数据仓库负载分解,并使用所有的系统资源并行处理单个查询。

Greenplum数据库基于PostgreSQL开源技术。本质上讲,它是多个PostgreSQL实例一起充当一个数据库管理系统。Greenplum以PostgreSQL 8.2.15为基础构建,在SQL支持、特性、配置选项和终端用户功能方面非常像PostgreSQL,用户操作Greenplum就跟平常操作PostgreSQL一样。不过,为了支持Greenplum数据库的并发结构,PostgreSQL的内部构件经过了修补。例如,为了在所有并行的PostgreSQL数据实例上并发执行查询,系统目录、优化器、查询执行器以及事务管理器组件都经过了修改和增强。此外,Greenplum还引入了针对商业智能工作负载优化PostgreSQL的特性。例如,增加了并行数据加载、资源管理、查询优化、存储增强。这些功能是标准PostgreSQL所不具备的。

根据Pivotal的开源公告,他们希望Greenplum会成为一个重大的里程碑,永久改变数据仓库这个行业。Greenplum数据库与其它开源数据处理系统(如Apache Hadoop、MySQL甚或PostgreSQL)的差别在架构和功能上都有体现。借助MPP,Greenplum在大型数据集上执行复杂SQL分析的速度比他们测试过的任何一个方案都要快。而借助下一代查询优化技术,Greenplum带来了其它开源方案中没有的数据管理质量特性、升级和扩展能力。他们相信,这样一款经过证明的、广泛采用的数据仓库开源将会在整个业界引发巨大的连锁反应。最重要的是,这降低了大规模实时数据分析的门槛,更多的公司可以参与到大数据所带来的挑战中来。

另据InfoWorld报道,数据库行业分析师Curt Monash将Greenplum视为分析型RDBMS的真正竞争者。而且,相比现有的产品(如TeradataHP VerticaIBM NetezzaOracle Exadata),其引入成本更低。Greenplum作为一项服务似乎是个再简单不过的选择。它有一个为人熟知的名字和广泛的用户基础。MySQL或PostgreSQL也通过类似的技术提供云端服务。但是,Greenplum真要展现出其优势,需要做好两个方面的工作:一是从现有的Greenplum部署移植要简单;二是有一个可行的发展路线,要么可以通过其它云托管产品富集数据,要么集成新兴的分析技术,如Spark。

Greenplum的架构 

Greenplum的高性能得益于其良好的体系结构。Greenplum的架构采用了MPP(大规模并行处理)。在 MPP 系统中,每个 SMP 节点也可以运行自己的操作系统、数据库等。换言之,每个节点内的 CPU 不能访问另一个节点的内存。节点之间的信息交互是通过节点互联网络实现的,这个过程一般称为数据重分配 (Data Redistribution) 。与传统的SMP架构明显不同,通常情况下,MPP系统因为要在不同处理单元之间传送信息,所以它的效率要比SMP要差一点,但是这也不是绝对的,因为MPP系统不共享资源,因此对它而言,资源比SMP要多,当需要处理的事务达到一定规模时,MPP的效率要比SMP好。这就是看通信时间占用计算时间的比例而定,如果通信时间比较多,那MPP系统就不占优势了,相反,如果通信时间比较少,那MPP系统可以充分发挥资源的优势,达到高效率。当前使用的OTLP程序中,用户访问一个中心数据库,如果采用SMP系统结构,它的效率要比采用MPP结构要快得多。而MPP系统在决策支持和数据挖掘方面显示了优势,可以这样说,如果操作相互之间没有什么关系,处理单元之间需要进行的通信比较少,那采用MPP系统就要好,相反就不合适了。

常见的OLTP数据库系统常常采用shared everything架构来做集群,例如oracle RAC架构,数据存储共享,节点间内存可以相互访问。

rac

Greenplum是一种基于postgresql(开源数据库)的分布式数据库。与Oracle RAC的Shared Everything架构不同,Greenplum采用Shared Nothing架构。整个集群由很多个数据节点(Segment Host)和控制节点(Master Host)组成,其中每个数据节点上可以运行多个数据库。

简单来说,Shared Nothing是一个分布式的架构,每个节点相对独立。典型的Shared Nothing系统会集数据库、内存Cache、等存储状态的信息;而不在节点上保存状态的信息。主机,操作系统,内存,存储都是自我控制的,不存在共享。

对于应对大规模数据处理的服务器集群设备,若将Session状态信息保存在各个数据节点上,各节点的Session复制会极大的影响性能;若采用 Shared Nothing,保持每个节点的无状态性,不再使用Session来保持全局的状态,而是将Session直接放在数据库中,在数据库前再加一层如 Memcached分布式Cache,这样将可极大的提高性能,当改变Session中的对象时,将同步到Cache和数据库。基于Shared Nothing的分布式架构模式,Greenplum在高效处理I/O数据吞吐和并发计算的过程就很好理解。

Greenplum主要由master host,segment host,interconnect三大部分组成。

Greenplum

Greenplum master是Greenplum数据库系统的入口,接受客户端连接及提交的SQL语句,将工作负载分发给其它数据库实例(segment实例),由它们存储和处理数据。Greenplum interconnect负责不同PostgreSQL实例之间的通信。Greenplum segment是独立的PostgreSQL数据库,每个segment存储一部分数据。大部分查询处理都由segment完成。

了解完Greenplum的架构后,对其工作流程也就相对简单了。因greenplum采用了MPP架构,其主要的优点是大规模的并行处理能力,应该把精力主要放在大规模存储与并行处理两个方面。

大规模存储

Greenplum数据库通过将数据分布到多个节点上来实现规模数据的存储。数据库的瓶颈经常发生在I/O方面,数据库的诸多性能问题最终总能归罪到I/O身上,久而久之,IO瓶颈成为了数据库性能的永恒的话题。Greenplum采用分而治之的办法,将数据规律的分布到节点上,充分利用segment主机的IO能力,以此让系统达到最大的IO能力(主要是带宽)。

在greenplum中每个表都是分布在所有节点上的。Master host首先通过对表的某个或多个列进行hash运算,然后根据hash结果将表的数据分布到segment host中。整个过程中master host不存放任何用户数据,只是对客户端进行访问控制和存储表分布逻辑的元数据。

greenplum-data

高效I/O的实现

I/O瓶颈是数据库,特别是大规模数据分析处理中永恒的话题。在Greenplum中,需要存储的数据在进入进入数据库时,将首先进行数据分布的处理工作;将一个表里的数据平均分布到每个节点,并为每个表指定一个分发列(distribute Column),之后便根据Hash来分布数据。

greenplum-io

基于Shared Nothing的原则,Greenplum这样处理可以充分发挥每个节点处I/O的处理能力。在这一过程中,控制节点(Master Host)将不再承担计算任务,而只负责必要的逻辑控制和客户端交互。这是Greenplum的独到之处。在多数集群的大规模数据处理系统中,都使用中心节点进行大量的控制和计算,大量的数据交换过程中将造成中心节点 的负载过大;多数情况下,数据库的I/O瓶颈在这一位置(处理过程)形成病灶,进而随多核心CPU时序控制和处理响应的时段等问题开始蔓延,最终致使系统 中很多节点的I/O位置病入膏肓。在Greenplum中,控制节点只负责必要的逻辑处理和客户端交互,节点间的数据交互将直接在节点间完成,而不需要控制节点;在一定的硬件资源支持下,高效I/O不再是DBA的梦想。

并行处理

I/O瓶颈的解决为并行计算能力的提升创造了良好的环境。下面我们一起来看看Greenplum是如何进行高性能的并行计算的。

  • 在硬件方面,Greenplum可以使用标准的服务器并通过服务器间的高级通信连接,将多台服务器组成一个强大的计算平台,实现快速的海量并行运算。
  • 在系统内部,Greenplum通过自己的并行数据流引擎来实现更多计算需求的硬件资源调度。一般,多表JOIN操作是考验系统并行计算能力的经典 案例。在Greenplum中,这一过程是将一个表里的数据平均分布到每个节点,并为每个表指定一个分发列,之后便根据Hash算法来分布数据。

这样,每个节点的数据通过分发列即得知。如果对distribute Column做JOIN操作,只需要通过分发列得到数据的节点位置,并对相应的节点进行计算,最后合并结果就可完成。当然,这种几个表规模的查询还不能证明Greenplum在并行计算方面的能力。但重要的是,通过Greenplum的并行数据流引擎,我们可以在一个主机上同时启动多个PostgreSQL数据库进行更多表的关联及更复杂的查询操作。这就充分发挥了硬件资源的性能。

greenplum-2

在进行数据装载时,不是常规的一个中心数据源将数据分发至各节点,而是所有节点同时读取数据,然后根据Hash算法,将属于自己的数据留下,将其他的节点的数据通过网络直接传送给需求方。这种多数据流的并行传输保证了高性能的数据装载速度。

在进行并发数据分析时,Greenplum的另一个强大之处是支持对一个Segment节点的虚拟化,在载入数据后,我们可以对数据节点虚拟多个数 据库进行并行分析操作,依旧源于Share nothing架构,Greenplum的一个Segment可支持2-10个虚拟数据库(官方推荐为6个),可以最大限度发挥硬件设备,提高并行规模和查询分析效率。

Greenplum的并行处理主要体现在外部表并行装载,并行备份恢复与并行查询处理三个方面。数据仓库的主要精力一般集中在数据的装载和查询,数据的并行装载主要是在采用外部表或者web表方式,通常情况下通过gpfdist来实现。

greenplum-3

Gpfdist程序能够以370MB/s装载text格式的文件和200MB/s装载CSV格式文件,ETL带宽为1GB的情况下,我们可以运行3个gpfdist程序装载text文件,或者运行5个gpfdist程序装载CSV格式文件。例如图例中采用了2个gpfdist程序进行数据装载。可以根据实际的环境通过配置postgresql.conf参数文件来优化装载性能。

查询性能的强弱往往由查询优化器的水平来决定,greenplum主节点负责解析SQL与生成执行计划。Greenplum的执行计划生成同样采用基于成本的方式,基于数据库是由诸多segment实例组成,在选择执行计划时主节点还要综合考虑节点间传送数据的代价。

工作原理:

在主节点上存在query dispatcher (QD)进程,该进程前期负责查询计划的创建和调度,segment instance返回结果后,该进程再进行聚合与向用户展示;segment host存在query executor (QE)进程,该进程负责其它节点相互通信与执行QD调度的执行计划。

greenplum-4

Greenplum最为一个严格的数据库系统,同样支持线性扩展,高可用性架构,数据与主机的容错机制,还有数据的分区与压缩功能。

参考链接:

码字很辛苦,转载请注明来自标点符《基于PostgreSQL的开源分布式数据库:Greenplum》

评论