PostgreSQL码农集散地

团队来了猪队友,请问怎么办?

文章开始前推荐2个学习环境: 

1、欢迎使用镜像快速体验PostgreSQL/DuckDB强大功能:《最好的PostgreSQL学习镜像》

2、欢迎使用云起实验室: 《免费体验PolarDB开源数据库》

3、PolarDB开源数据库内核、应用等学习图谱:  https://www.aliyun.com/database/openpolardb/activity 

为什么木桶有短板?

https://www.bilibili.com/video/BV1KS4y1Z7Le/

《一起学PolarDB - 第12期 - 为什么增加只读实例不能提高单条SQL的执行速度?》 这一期讲了PolarDB 通过多个计算节点可以并行执行同一条SQL, 类似于Greenplum MPP特性.
但是Greenplum有短板问题(就是那个猪队友), PolarDB是怎么解决的呢?

社区版本:
1、Greenplum, 由于SQL是在多个计算节点上并行执行的, 所以SQL的执行时间取决于最慢的节点. 当计算节点的负载不均匀、计算能力不均匀、IO设备性能不均匀的情况下, 性能会出现剧烈抖动.
2、还有一种情况是数据的存储结构倾斜, 也会导致短板, 例如分布键字段的某value比其他value记录条数多很多, 使得这部分数据所在的计算节点数据量比其他节点多很多, 这个节点就会成为短板.
非分布键数据倾斜一般对聚合操作影响不大, Greenplum支持2阶段聚合来解决问题, 但是对数据分布不均匀束手无策:

  • 《Greenplum支持人为多阶段聚合的方法 - 直连segment(PGOPTIONS='-c gp_session_role=utility') Or gp_dist_random('gp_id') Or 多阶段聚合 prefunc》

  • 《HybridDB PostgreSQL "Sort、Group、distinct 聚合、JOIN" 不惧怕数据倾斜的黑科技和原理 - 多阶段聚合》

  • 《PostgreSQL 11 preview - 多阶段并行聚合array_agg, string_agg》

PolarDB:
https://github.com/ApsaraDB/PolarDB-for-PostgreSQL/blob/main/doc/PolarDB-CN/Architecture.md
针对前面提到的第一个问题: 当某个节点因为各种原因(例如某个节点的存储raid 5损坏了1块盘, 某个节点的数据存储有倾斜导致了节点负担变大.)存在短板时, 由于Greenplum每个节点只有部分数据, 其他节点不能帮短板节点进行计算, 只能干等.
PolarDB 的数据扫描以4MB为单位进行动态扫描, 哪个节点强, 哪个节点就扫得多, 处理得多. 打破短板问题. 目前已实现seqscan的动态扫描.
Image

动态扫描相比静态扫描的性能提升:
Image

动态扫描最终能带来的目标和好处:

  • 消除木桶短板, polardb RW RO可以随意配置, RO与RO也可以随意配置, 运行时负载也可以不对齐.

本期问题1:
为什么Greenplum在执行SQL时可能存在木桶短板问题?

  • a. 由于分布键的数据倾斜, 某个节点的数据比其他节点多

  • b. 由于Greenplum某些节点的配置比较差

  • c. 由于Greenplum某些节点的硬件出现性能问题, 例如存储RAID 5遭受坏盘, 导致每次读取需要从校验信息中恢复数据

  • d. 由于某些计算节点当前比较繁忙

答案:

  • abcd

解释:

  • 参考本文内容

本期问题2:
PolarDB 通过什么方式来解决SQL执行时某些节点执行较慢的木桶短板问题?

  • a. 重新选择分布键分布数据

  • b. 采用动态扫描, 每次扫描4MB数据. 处理快的节点会扫描更多的数据, 处理慢点节点扫描的数据更少.

  • c. 提升这些较慢节点的配置

  • d. 增加一层逻辑shard, 将逻辑shard重新按比例分配到不同的计算节点

答案:

  • b

解释:

  • 参考本文内容

欢迎关注我的github (https://github.com/digoal/blog) , 学习数据库不迷路.  

近期正在写公开课材料, 未来将通过视频号推出, 欢迎关注视频号:

Image

文章中的参考文档请点击阅读原文获得.