GreenPlum:基于PostgreSQL的分布式关系型数据库
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方式
- Hash join:
- nestloop join:笛卡儿积必须nestloog join
- 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内部按照规则将数据组织在一起
分布
- hash分布:distributed by (column_name),可以指定多个分布键。相同的hash值分布到同一个segment
- 随机分布:distributed randomly,相同的记录可能分布到不同的segment
建议:
- 分布列尽量选择需要经常JOIN的列,这类查询的并发越高,越应该考虑
- 尽量选择分布均匀的列,或者多列
- 不要轻易使用随机分布
分区
- range partition:按照数据的范围
- list partition:按照List中的值
- 多级分区
建议:
- 尽量选择和查询条件相关的字段,缩小QUERY需要扫描的数据
- 当有多个查询条件时,可以使用子分区,进一步缩小需要扫描的数据
资源控制
- 限制正在执行的所以SQL的最大cost
- 限制最多运行多少SQL
- 控制正在运行的SQL的优先级
参考资料
GreenPlum:基于PostgreSQL的分布式关系型数据库的更多相关文章
- [转帖]Greenplum: 基于PostgreSQL的分布式数据库内核揭秘(下篇)
Greenplum: 基于PostgreSQL的分布式数据库内核揭秘(下篇) http://www.postgres.cn/v2/news/viewone/1/454 原作者:姚延栋 创作时间:201 ...
- [转帖]Greenplum :基于 PostgreSQL 的分布式数据库内核揭秘 (上篇)
Greenplum :基于 PostgreSQL 的分布式数据库内核揭秘 (上篇) https://www.infoq.cn/article/3IJ7L8HVR2MXhqaqI2RA 学长的文章.. ...
- Google的分布式关系型数据库F1和Spanner
F1是Google开发的分布式关系型数据库,主要服务于Google的广告系统.Google的广告系统以前使用MySQL,广告系统的用户经常需要使用复杂的query和join操作,这就需要设计shard ...
- Google 分布式关系型数据库 F1
F1是Google开发的分布式关系型数据库,主要服务于Google的广告系统.Google的广告系统以前使用MySQL,广告系统的用户经常需要使用复杂的query和join操作,这就需要设计shard ...
- 基于E-R模型的关系型数据库设计方法
摘要 在管理信息系统开发中,数据库设计的目标是建立DBMS能识别的关系数据模型.而关系数据模型建立的基础是首先建立E-R模型,通过E-R模型才能转换为关系数据模型.如何建立E-R模型以及如何将E-R模 ...
- 对象关系型数据库管理系统(PostgresQL )
PostgresQL是 对象关系型数据库管理系统(ORDBMS).PostgreSQL支持大部分SQL标准并且提供了许多其他现代特性:复杂查询.外键.触发器.视图.事务完整性.MVCC.同样,Po ...
- POLARDB与其他关系型数据库对比
https://baijiahao.baidu.com/s?id=1610828839695075926&wfr=spider&for=pc 前言 在数据库的选择上,MySQL成为中国 ...
- Node的关系型数据库ORM库:bookshelf
NodeJs 关系数据库ORM库:Bookshelf.js bookshelf.js是基于knex的一个关系型数据库的ORM库.简单易用,内置了Promise的支持.这里主要罗列一些使用的例子,例子就 ...
- 非关系型数据库(NOSQL)和关系型数据库(SQL)区别详解
前言: 在我们的日常开发中,关系型数据库和非关系型数据库的使用已经是一个成熟的软件产品开发过程中必不可却的存储数据的工具了.那么用了这么久的关系数据库和非关系型数据库你们都知道他们之间的区别了吗?下面 ...
随机推荐
- hdu 5025 bfs+状压
http://acm.hdu.edu.cn/showproblem.php?pid=5025 N*N矩阵 M个钥匙 K起点,T终点,S点需多花费1点且只需要一次,1-9表示9把钥匙,只有当前有I号钥匙 ...
- cheerio笔记
不会的东西,再简单都是难:会的东西,再难都是简单. 给自己写的,写的通俗易懂. cheerio:在node服务端,解析网页,是jquery的核心,去除了DOM中不一致的地方. 先获得网页的源码,再通过 ...
- asp.net Mvc 模型绑定项目过多会导致页面运行时间卡
asp.net Mvc 模型绑定项目过多会导致页面运行时间卡的问题. 解决方式就是采用ModelView方式进行精简,已减少模型绑定及验证的时间.
- vim 安装vim-javascript插件--Vundle管理
最近看了一下node.js,但是写的时候,vim对js没有很好的提示.于是就安装插件来处理,准备安装vim-javascript.但是安装github上面的插件时,推荐用Vundle和pathogen ...
- DevOps Workshop 研发运维一体化(成都站) 2016.05.08
成都的培训与广州.上海.北京一样,只是会议室比较小,比较拥挤,大家都将就了.可惜换了电脑以后,没有找到培训时的照片了,遗憾. 培训思路基没有太大变化,基本按照下面的思路进行: 第一天对软件开发的需求管 ...
- IIS 绑定 HTTPS 域名
HTTPS为SSL安全通道,虽然并不清楚具体有什么用,但至少网站看上去比HTTP上档次,访问速度也没什么影响,所以有条件的话,还是做下,可以做噱头忽悠人. WIN2008系统 因为端口443冲突,只能 ...
- wpf expender 展开动画
非原创,网上下载的,觉得还可以,记录一下以便以后查看学习 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2 ...
- Sql Server字符串拆分(Split)方法汇总
详细链接:https://shop499704308.taobao.com/?spm=a1z38n.10677092.card.11.594c1debsAGeak--方法0:动态SQL法 declar ...
- 移植Max中的控制器到Unity - 前言
一切源自于一个ppt http://pan.baidu.com/s/1kT8x2V9 看到这个ppt之前,其实自己也想过将Max当中的一些约束移植到游戏中,一方面是那时候能力不足,另一方面还是自己不那 ...
- Python实现汉诺塔问题的可视化(以动画的形式展示移动过程)
学习Python已经有一段时间了,也学习了递归的方法,而能够实践该方法的当然就是汉诺塔问题了,但是这次我们不只是要完成对汉诺塔过程的计算,还要通过turtle库来体现汉诺塔中每一层移动的过程. 一.设 ...