Greenplum(GP)采用了MPP架构,基于开源的数据库 PostgreSQL(PG)。

1.首先什么是MPP架构?

GreenPlum的架构采用了MPP(大规模并行处理)。在 MPP 系统中,每个 Segment 节点也可以运行自己的操作系统、数据库等。换言之,每个节点内的 CPU 不能访问另一个节点的内存。节点之间的信息交互是通过节点互联网络实现的,这个过程一般称为数据重分配(Data Redistribution) 。与传统的SMP架构明显不同,通常情况下,MPP系统因为要在不同处理单元之间传送信息,所以它的效率要比SMP要差一点,但是这也不是绝对的,因为 MPP系统不共享资源,因此对它而言,资源比SMP要多,当需要处理的事务达到一定规模时,MPP的效率要比SMP好。这就是看通信时间占用计算时间的比例而定,如果通信时间比较多,那MPP系统就不占优势了,相反,如果通信时间比较少,那MPP系统可以充分发挥资源的优势,达到高效率。

Greenplum开发-LMLPHP

2.简单介绍一下GP的各个组件:

数据库由Master Severs和Segment Severs通过Interconnect互联组成。

Master主机负责:建立与客户端的连接和管理;SQL的解析并形成执行计划;执行计划向Segment的分发收集Segment的执行结果;Master不存储业务数据,只存储数据字典。

Segment主机负责:业务数据的存储和存取;用户查询SQL的执行。

master node高可用,类似于hadoop的namenode和second namenode,实现主备的高可用。

Greenplum开发-LMLPHP

3.数据是如何分布的?

在 GPDB 中创建(Create)或者修改(Alter)表时,有一个额外的 DISTRIBUTED 子句用以定义表的分布策略(Distribution Policy)。分布策略决定了表中的数据记录如何被打散到GP的 Segment Instance。GPDB 提供了2种分布策略:

HASH 分布 使用 HASH 分布时,1个或数个Table Column被用作Distribution Key(简称 DK)。DK被HASH 算法用来决定每行记录对应特定的Segment Instance。相同Key值的记录会HASH 到相同的 Segment Instance。选择一个唯一键(unique key)作为DK,比如主键(Primary Key),可以确保尽可能的平坦分布数据。

随机(Random)分布 使用随机分布,数据记录被循环的分布到 Segment Instance。相同值的记录可能会落在不同的Segment Instance。随机分布可以确保数据分布的平坦性,但为了确保性能优势应该尽可能的使用 HASH 分布。

4.GPDB查询过程

用户可以像使用其他的DBMS一样向GPDB提交查询。直接通过客户端程序(例如 psql)连接到GP的Master主机并提交查询语句,也可以通过pgadmin工具来连接GP执行查询语句。

psql -l  //列出所有的database

psql -d xxxx //登陆数据库,默认gpadmin用户

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

查询被Master 接收、处理、优化、创建一个并行的或者定向的查询计划(根据查询语句决定)。之后 Master将查询计划分发到相关的Instance去执行,每个Instance只负责处理自己本地的那部分数据。

大部分的操作—比如扫表、关联、聚合、排序都是同时在Instance上并行被执行。每个操作都独立于其他Instance执行。

例如:

QUERY查询语句及分析结果

Greenplum开发-LMLPHP

下图解释了查询计划。每个Instance获取到查询计划的副本且并行执行。对于该查询计划来说,有一个重分布操作(Redistribute motion),这是为了完成连接(join)而执行的数据 移动操作。查询计划被重分布操作分割为两步(slice 1 与 slice 2)。该查询计划还有另外一种数据移动称为汇总移动(Gather motion)。汇总移动是Instance将计算结果反馈到Master从而可以反馈给客户端的一种操作。由于在移动动作发生时查询计划总是会被分割,该查询计划还存在一个隐含的操作(slice 3)。不是所有的查询都有汇总操作,比如:CREATE TABLE…AS SELECT...语句就不需要汇总操作。

Greenplum开发-LMLPHP

5.JDBC连接GP

首先需要去GP官网下载最新的JDBC驱动包

地址:https://network.pivotal.io/api/v2/products/pivotal-gpdb/releases/6342/product_files/27496/download

然后在Eclipse中引入这个驱动包,新建一个测试类,如下:

Greenplum开发-LMLPHP

运行结果如下:

Greenplum开发-LMLPHP

引申:开发一个登陆界面,监控GP

登陆界面需要从GP中获取用户表来验证登陆用户名和密码。具体代码如下:

login.html--登陆页面

Greenplum开发-LMLPHP

login_check.jsp--验证密码

部分截图

Greenplum开发-LMLPHP

登陆效果:

Greenplum开发-LMLPHP

Greenplum开发-LMLPHP

05-13 20:55