SMP(Symmetric Multi-Processor)对称多处理器结构

**MPP(Massively Parallel Processing)**大规模并行处理,是采用大量处理单元对问题进行求解的一种并行处理技术。是一种非共享架构,每个节点都有独立的操作系统和数据库等,节点之间信息交互只通过网络连接实现。简单的说,MPP是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的结果汇总在一起得到最终的结果(与Hadoop相似)

两种结构的比较: 与传统的SMP架构明显不同,通常情况下,MPP系统因为要在不同处理单元之间传送信息,所以它的效率要比SMP要差一点,但是这也不是绝对的,因为 MPP系统不共享资源,因此对它而言,资源比SMP要多,当需要处理的事务达到一定规模时,MPP的效率要比SMP好。这就是看通信时间占用计算时间的比例而定,如果通信时间比较多,那MPP系统就不占优势了,相反,如果通信时间比较少,那MPP系统可以充分发挥资源的优势,达到高效率。
主从结构。greenplum采用一主(Master)多从(Segment)的结构,Master负责查询解析、优化及任务分发,Segment负责查询处理、数据存储,双方通过Interconnect通信。总体架构图如下

master节点
segment节点
Interconnect
存储

Greenplum提供了以下三种数据分布策略
哈希分布:Hash分布是Greenplum最常用的数据分布方式,根据用户的分布键计算后的哈希值将数据分布到某个Segment上。分布键的选择非常重要,好的分布键应将数据均匀分布到各Segment上,同时在用户查询时尽量减少重分布
create table t1(id, int) DISTRIBUTED BY (id);
随机分布:采用循环的方式将一次插入的数据存储到不同的节点上,应尽量减少这种分布方式,除非不能确定一张表的哈希分布键或者不存在合理的能够避免数据倾斜的分布键。随机分布会采用循环的方式将一次插入的数据存储到不同的节点上。随机性只在单个 SQL 中有效,不考虑跨 SQL 的情况。譬如如果每次插入一行数据到随机分布表中,最终的数据会全部保存在第一个节点上。(一次插入一行和一次插入多行)
create table t1 (id int) DISTRIBUTED RANDOMLY;
复制表:即整张表在每个节点上都有完成的数据。一般适用于小表,这样可以减少查询执行过程中进行重分布或者广播
CREATE TABLE student_rep (id int) DISTRIBUTED REPLICATED;
三种数据的移动操作
Broadcast Motion (N:N):广播数据。每个节点向其他节点广播需要发送的数据。Redistribute Motion (N:N):重新分布数据。利用 join 列数据的 hash 值不同,将筛选后的数据在其他 segment 重新分布Gather Motion (N:1):聚合汇总数据。每个节点将 join 后的数据发到一个单节点上,通常是发到主节点 master 。数据重分布和广播(优化器会计算广播与重分布两种方式各自的代价,选择代价低的方式进行)
数据准备
-- 哈希分布
CREATE TABLE student (
id int4 NULL,
"name" varchar(400) NULL
)
DISTRIBUTED BY ("name");
-- 随机分布
CREATE TABLE student_class (
id int4 NULL,
class_name varchar(255) NULL,
student_name varchar(255) NULL
)
DISTRIBUTED RANDOMLY;
select *
from
student st
left join student_class sc on
st."name" = sc.student_name
重分布

gp_segment_configuration


查看greenplum库各个节点数据的分布情况
select gp_segment_id,count(*) from table_name group by gp_segment_id;
-- 查询数据在哪个节点上
select gp_segment_id, * from student;