• GreenPlum:基于PostgreSQL的分布式关系型数据库


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

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

    系统架构

    image

    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的方式重新分布

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

    算子实现

    索引

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

    Join方式

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

    分布式事务

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

    image

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

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

    例子

    正常流程

    image

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

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

    image

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

    image

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

    容错

    slave segment容错

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

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

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

    恢复流程

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

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

    primary segment容错

    image

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

    负载均衡和数据组织方式

    数据组织方式

    image

    • 有一类特殊的表,称为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需要扫描的数据
    • 当有多个查询条件时,可以使用子分区,进一步缩小需要扫描的数据

    资源控制

    image

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

    参考资料

    Greenplum分布式事务,很详细

    主从同步

  • 相关阅读:
    jtopo
    转载model2
    转载model
    Vue -- 后台系统布局导航栏
    Vue -- iview表格 axiso调用接口数据
    Vue -- 视频&&下载 组件
    Vue -- echarts 折线图demo
    Vue -- axios封装
    Vue -- 验证码
    01 & 02 & 03笔记
  • 原文地址:https://www.cnblogs.com/biterror/p/6909872.html
Copyright © 2020-2023  润新知