GreenPlum是一个底层是多台PostgreSQL分表分库的分布式数据库,它有如下特点

  • 支持标准SQL,几乎所有PostgreSQL支持的SQL,greenplum都支持
  • 支持ACID、分布式事务
  • 支持上百台集群(这一点有点不好,hadoop可以万台)

系统架构

Master Host

  • 处理用户请求,生成执行计划,以及在执行计划执行必要的聚合操作(avg)或者排序
  • 内部有一个PostgreSQL数据库,保存所有的元数据,索引信息
  • 监控所有segment的状态信息

Segment host

  • 每台Segment host有多个segment,一般segment等于core数
  • segment是一个PostgreSQL数据库,负责存储具体数据

内部网络

GreenPlum内部使用udp网络,但是Greenplum会对数据包进行校验,因此可靠性等同于TCP。使用TCP的时候,最多支持1000个segment

执行计划

当master接受到一条SQL语句,会将这条语句解析为执行计划DAG,将DAG中不需要进行数据交换的划分为slice,多表连接,aggerate,sort的时候,都会涉及到slice的重分布,会有一个motion任务来执行数据的重分布。将slice下发到涉及到的相关segment中。

我认为slice类似与Spark中的stage的概念,不需要进行数据shuffle

motion方式

  • gather motion(N->1):在master节点上把所有segment数据聚集起来,一般是sort,sort group,sort join
  • boardcast motion(N->N):每个segment把数据广播给其余所有segment
  • redistribute motion(N->N):每个segment把数据按照hash的方式重新分布


我们可以猜一猜上面的执行计划代表什么:A表和B表进行join连接,然后它们又进行sort或者聚合。

算子实现

索引

Greenplum支持所有postgresql的索引,另外还支持位图索引

Join方式

  1. Hash join:
  2. nestloop join:笛卡儿积必须nestloog join
  3. merge join

分布式事务

Greenplum虽然是面向OLAP的数据库,但是也提供了插入,删除,更新数据的接口,利用两阶段提交协议支持分布式事务,提供强一致性,支持ACID,支持的隔离级别是(读已提交,可串行化)。

Greenplum采用和Postgresql类似的方式,上层事务块控制事务状态转换,底层事务负责执行具体的语句以及和相关segment交互。


与单机事务相比,多了TBLOCK_PREPARE状态,代表两阶段提交协议中的中间状态。除此之外,分布式事务也有一套以DXT开头的分布式状态

例子

正常流程

  • 在所有segment都启动一个事务块,状态TBLOCK_BEGIN

  • 执行一条插入语句,状态TBLOCK_INPRGRESS

  • END命令,状态为DXT_STATE_PREPARED。这里master状态为TBLOCK_END,slave segment状态为TBLOCK_DEFAULT(初始状态)

  • 第二阶段,开始正式提交。DXT_STATE_PREPARED->DXT_STATE_INSGRETE_FORGET_COMMIT。master状态为TBLOCK_END->TBLOCK_DEFATULT,slave segmeng又重新经历一轮所有状态

容错

slave segment容错

每台segment都在其他机器上有备机

Primary Segment 与对应 Mirror Segment 之间的数据基于文件级别同步备份。Mirror Segment 不直接参与数据库事务和控制操作。

为什么采用文件同步的机制:mirror库数据直接获取primary的文件(日志文件)和数据(修改的数据页)。

恢复流程

发生宕机时,greenplum有两种恢复模式,"read-only"和"continue"。

  • read-only:也就是说如果一个segment坏了,整个greenplum会变成只读,不能写了
  • continue:由mirror正常提供服务,master节点会把新增数据记录下来,等待primary恢复后同步

primary segment容错

基于数据流通过WAL同步,由postgresql提供的容错。

负载均衡和数据组织方式

数据组织方式

  • 有一类特殊的表,称为append-only表,支持列存储,表压缩
  • 通过gpfdist插件,可以支持外部表

负载均衡

Greenplum通过分布和分区的方式,使得庞大的数据分布在不同的segment上。严格来说,分布才是拆表,分区只是为了加快查询速度。

  • 分布:是从物理上把数据分散到各个SEGMENT上,Greennplum提供hash函数
  • 分区:segment内部按照规则将数据组织在一起

分布

  1. hash分布:distributed by (column_name),可以指定多个分布键。相同的hash值分布到同一个segment
  2. 随机分布:distributed randomly,相同的记录可能分布到不同的segment

建议:

  • 分布列尽量选择需要经常JOIN的列,这类查询的并发越高,越应该考虑
  • 尽量选择分布均匀的列,或者多列
  • 不要轻易使用随机分布

分区

  1. range partition:按照数据的范围
  2. list partition:按照List中的值
  3. 多级分区

建议:

  • 尽量选择和查询条件相关的字段,缩小QUERY需要扫描的数据
  • 当有多个查询条件时,可以使用子分区,进一步缩小需要扫描的数据

资源控制

  1. 限制正在执行的所以SQL的最大cost
  2. 限制最多运行多少SQL
  3. 控制正在运行的SQL的优先级

参考资料

Greenplum分布式事务,很详细

主从同步

GreenPlum:基于PostgreSQL的分布式关系型数据库的更多相关文章

  1. [转帖]Greenplum: 基于PostgreSQL的分布式数据库内核揭秘(下篇)

    Greenplum: 基于PostgreSQL的分布式数据库内核揭秘(下篇) http://www.postgres.cn/v2/news/viewone/1/454 原作者:姚延栋 创作时间:201 ...

  2. [转帖]Greenplum :基于 PostgreSQL 的分布式数据库内核揭秘 (上篇)

    Greenplum :基于 PostgreSQL 的分布式数据库内核揭秘 (上篇) https://www.infoq.cn/article/3IJ7L8HVR2MXhqaqI2RA 学长的文章.. ...

  3. Google的分布式关系型数据库F1和Spanner

    F1是Google开发的分布式关系型数据库,主要服务于Google的广告系统.Google的广告系统以前使用MySQL,广告系统的用户经常需要使用复杂的query和join操作,这就需要设计shard ...

  4. Google 分布式关系型数据库 F1

    F1是Google开发的分布式关系型数据库,主要服务于Google的广告系统.Google的广告系统以前使用MySQL,广告系统的用户经常需要使用复杂的query和join操作,这就需要设计shard ...

  5. 基于E-R模型的关系型数据库设计方法

    摘要 在管理信息系统开发中,数据库设计的目标是建立DBMS能识别的关系数据模型.而关系数据模型建立的基础是首先建立E-R模型,通过E-R模型才能转换为关系数据模型.如何建立E-R模型以及如何将E-R模 ...

  6. 对象关系型数据库管理系统(PostgresQL )

    PostgresQL是   对象关系型数据库管理系统(ORDBMS).PostgreSQL支持大部分SQL标准并且提供了许多其他现代特性:复杂查询.外键.触发器.视图.事务完整性.MVCC.同样,Po ...

  7. POLARDB与其他关系型数据库对比

    https://baijiahao.baidu.com/s?id=1610828839695075926&wfr=spider&for=pc 前言 在数据库的选择上,MySQL成为中国 ...

  8. Node的关系型数据库ORM库:bookshelf

    NodeJs 关系数据库ORM库:Bookshelf.js bookshelf.js是基于knex的一个关系型数据库的ORM库.简单易用,内置了Promise的支持.这里主要罗列一些使用的例子,例子就 ...

  9. 非关系型数据库(NOSQL)和关系型数据库(SQL)区别详解

    前言: 在我们的日常开发中,关系型数据库和非关系型数据库的使用已经是一个成熟的软件产品开发过程中必不可却的存储数据的工具了.那么用了这么久的关系数据库和非关系型数据库你们都知道他们之间的区别了吗?下面 ...

随机推荐

  1. java web 入门实例servlet篇(显示后台数据库列表,删除某一条记录并显示)

    编写过程中需要注意的问题: 1.建立eclipse动态web工程时,需要改写编译后class文件的位置,通常情况下是这个位置:/WebContent/WEB-INF/classes 2.配置的页面链接 ...

  2. Oracle EBS 采购 接收入库 接口开发

    http://blog.itpub.net/25164132/viewspace-746657/ 接收入库是项目中会经常碰到的开发,这类开发一般来说比较简单,但是接收入库在Oracle中其实涉及到很多 ...

  3. vim 安装vim-javascript插件--Vundle管理

    最近看了一下node.js,但是写的时候,vim对js没有很好的提示.于是就安装插件来处理,准备安装vim-javascript.但是安装github上面的插件时,推荐用Vundle和pathogen ...

  4. 微软儿童编程技术,kodu(酷豆)为儿童创造一个游戏世界

    受微软青年星火项目组的邀请,我和微软项目组的朋友参加了一场针对儿童编程的技术指导. 儿童和编程,本来是两个完全不靠边的词.在大家的常规思维中,编程一直是软件开发人员的事情,是高科技类型的工作,高不可攀 ...

  5. MYC编译器源码之词法分析

    前文  .NET框架源码解读之MYC编译器 和 MYC编译器源码分析之程序入口 分别讲解了 SSCLI 里示例编译器的架构和程序入口,本文接着分析它的词法分析部分的代码. 词法解析的工作都由Tok类处 ...

  6. 设计模式之模版方法模式(Template Method Pattern)

    一.什么是模版方法模式? 首先,模版方法模式是用来封装算法骨架的,也就是算法流程 既然被称为模版,那么它肯定允许扩展类套用这个模版,为了应对变化,那么它也一定允许扩展类做一些改变 事实就是这样,模版方 ...

  7. Oracle数据库中 to_date()与24小时制表示法及mm分钟的显示

      一.在使用Oracle的to_date函数来做日期转换时,时候也许会直接的采用“yyyy-MM-dd HH:mm:ss”的格式作为格式进行转换,但是在Oracle中会引起错误:“ORA 01810 ...

  8. C#中获取用户登录IP地址

    using System.Net; //导入命名空间 public string getLocalIP() { string strHostName = Dns.GetHostName(); //得到 ...

  9. Oracle function函数赋权

    -- 1.赋权 -- 在原有权的账号下个执行 grant select on psprd.functionName to user; -- 2. 别名 -- 在需要使用别名的账号下执行 CREATE ...

  10. C++中new申请动态数组

    C++中数组分为静态数组和动态数组,静态数组必须确定数组的大小,不然编译错误:而动态数组大小可以不必固定,用多少申请多少.静态数组类于与我们去餐馆吃饭,餐馆会把菜做好.而动态数组类似于我们自己买菜做饭 ...