|
| 1 | +## 一起学PolarDB - 第14期 - 为什么SQL不能动态分组计算? |
| 2 | + |
| 3 | +### 作者 |
| 4 | +digoal |
| 5 | + |
| 6 | +### 日期 |
| 7 | +2022-01-11 |
| 8 | + |
| 9 | +### 标签 |
| 10 | +PostgreSQL , PolarDB |
| 11 | + |
| 12 | +---- |
| 13 | + |
| 14 | +## 背景 |
| 15 | +懂PostgreSQL, 学PolarDB不难, 就好像有九阳神功护体, 可以快速融会贯通. |
| 16 | +对于DBA只要学会PolarDB精髓即可. |
| 17 | +对于开发者来说不需要学习, 使用PolarDB和PostgreSQL一样. |
| 18 | + |
| 19 | +#### 为什么SQL不能动态分组计算? |
| 20 | + |
| 21 | +社区版本: |
| 22 | +Greenplum, 表的数据必须hash分布在所有计算节点中. (使用DISTRIBUTED REPLICATED的复制表除外) |
| 23 | +- 查询时, 所有节点都要参与计算. (含分区键条件的查询、使用DISTRIBUTED REPLICATED的复制表的查询除外.) |
| 24 | + |
| 25 | +citus, pg-xc 可以创建节点分组, 然后将表的数据分布在指定的分组内. |
| 26 | +- 查询时, SQL中涉及的表所在的分组包含的计算节点需要参与计算. (含分区键条件的查询、复制表的查询除外.) |
| 27 | + - 如果遇到跨分组表JOIN(JOIN 的表分布在不同的逻辑分组内), 无法使用多阶段优化( [《HybridDB PostgreSQL "Sort、Group、distinct 聚合、JOIN" 不惧怕数据倾斜的黑科技和原理 - 多阶段聚合》](../201711/20171123_01.md) ), 必须跨多个分组重分布数据, 造成大量网络开销. |
| 28 | + |
| 29 | +``` |
| 30 | +pg-xc: |
| 31 | + |
| 32 | +CREATE NODE GROUP cluster_group WITH Datanode1, Datanode2; |
| 33 | + |
| 34 | +[ |
| 35 | + DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { [HASH | MODULO ] ( column_name ) } } | |
| 36 | + DISTRIBUTED { { BY ( column_name ) } | { RANDOMLY } | |
| 37 | + DISTSTYLE { EVEN | KEY | ALL } DISTKEY ( column_name ) |
| 38 | +] |
| 39 | +[ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ] |
| 40 | +``` |
| 41 | + |
| 42 | +``` |
| 43 | +citus: |
| 44 | + |
| 45 | +tables - distributed by column 记录映射到 shards |
| 46 | +shards 映射到 nodes |
| 47 | +多表shard对齐 : colocate tables shards |
| 48 | +``` |
| 49 | + |
| 50 | +哪些分组将会参与计算? 取决于建表时的指定, 不管怎么指定, 数据分布都是静态对应到某些节点的. |
| 51 | +- 每个分组中的每个节点只包含了部分数据. |
| 52 | +- 计算通常需包含所有节点(以greenplum为例) |
| 53 | + |
| 54 | +shared nothing数据库在多节点计算方面存在什么可改进点? |
| 55 | +- 所有节点都参与计算, 一个大的SQL查询容易把资源打满, 影响其他查询性能, RT抖动比较严重. |
| 56 | + - Greenplum通过resource group来隔离资源, 尽量减少这样的影响 |
| 57 | +- 网络开销较大, 指PG-XC, 如果遇到跨分组表JOIN(JOIN 的表分布在不同的逻辑分组内), 无法使用多阶段优化, 必须跨多个分组重分布数据, 造成大量网络开销. |
| 58 | + |
| 59 | + |
| 60 | +PolarDB: |
| 61 | +所有节点(RW, RO)共享一份存储, 当SQL需要用到多节点并行计算能力时, 可以多个实例共同出力(包括RW, RO), 出力是动态的, 所以可以满足SQL动态分组计算的前提. |
| 62 | +- 可以多少个节点处理? |
| 63 | + - 可以所有节点, 也可以指定某些节点. |
| 64 | +- 可以每个节点出多少力? |
| 65 | + - 每个节点分配多少个work都可以动态配置. |
| 66 | + |
| 67 | +为什么PolarDB满足SQL动态分组计算的前提? |
| 68 | +- 所有节点共享一份数据, 任意节点想出力都行, 不需要跨节点传输数据, 不存在shared nothing的弊端. |
| 69 | + - 任意节点可以组合成1组gang (动态指定一批计算节点处理某一个SQL, 业务区分. sql hint、guc) |
| 70 | + |
| 71 | + |
| 72 | + |
| 73 | +PolarDB SQL动态分组计算的典型应用场景: |
| 74 | +- 不同业务域的SQL同时跑在不同的节点集合上, 物理上隔绝干扰. (存储层是分布式块存储, 为所有PolarDB集群服务, 理论上可以认为是无限大、无限能力, 可以认为不存在存储层瓶颈) |
| 75 | +- HTAP 分时混合业务场景, 例如白天OLTP, 晚上T+1数据分析. 白天可以使用读写分离, 处理高并发小事务. 晚上可以用MPP特性, 调动所有节点的算力, 加速处理分析型SQL请求. |
| 76 | +- 节点级动态算力分配: 当某个节点负载较高时, 可以给这个节点分配较少的算力. |
| 77 | + |
| 78 | +本期问题1: |
| 79 | +为什么shared nothing架构无法实现动态的节点算力调度? |
| 80 | +- a. shared nothing数据库的分布算法是hash算法. |
| 81 | +- b. shared nothing数据库需要每个节点参与计算, 使得每一次SQL查询都可以用到所有计算能力. |
| 82 | +- c. shared nothing数据库每个节点只能访问本地数据, 除了带分布键的查询或复制表的查询以为, 其他的查询都需要所有节点的参与, 无法动态调动指定节点参与. |
| 83 | +- d. shared nothing数据库的存储分布在所有的计算节点, 每一次SQL查询都需要访问所有计算节点, 才能访问到完整的数据. |
| 84 | + |
| 85 | +答案: |
| 86 | +- c |
| 87 | + |
| 88 | +解释: |
| 89 | +- 参考本文内容 |
| 90 | + |
| 91 | +本期问题2: |
| 92 | +为什么PolarDB可以实现动态的节点算力调度? |
| 93 | +- a. 共享数据, 任意节点都能访问完整的数据, 都可以参与计算 |
| 94 | +- b. 支持类似MPP 的SQL优化器, 可以让多个计算节点参与计算 |
| 95 | +- c. 支持通过HINT或参数控制每条SQL调动的算力 |
| 96 | +- d. 查询时, 通过数据重分布实现跨节点动态计算 |
| 97 | + |
| 98 | +答案: |
| 99 | +- abc |
| 100 | + |
| 101 | +解释: |
| 102 | +- 参考本文内容 |
| 103 | + |
| 104 | +本期问题3: |
| 105 | +动态的节点算力调度有什么益处? |
| 106 | +- a. 隔离不同的业务域, 不同业务域可以使用不同的节点分组进行计算 |
| 107 | +- b. 每个节点都可以动态分配算力, 避免某些节点成为瓶颈(短板) |
| 108 | +- c. 适合混合负载, 白天oltp, 夜晚htap |
| 109 | +- d. 在需要时, 投入更多算力提高性能 |
| 110 | + |
| 111 | +答案: |
| 112 | +- abcd |
| 113 | + |
| 114 | +解释: |
| 115 | +- 参考本文内容 |
| 116 | + |
| 117 | + |
| 118 | +#### [期望 PostgreSQL 增加什么功能?](https://github.com/digoal/blog/issues/76 "269ac3d1c492e938c0191101c7238216") |
| 119 | + |
| 120 | + |
| 121 | +#### [PolarDB for PostgreSQL云原生分布式开源数据库](https://github.com/ApsaraDB/PolarDB-for-PostgreSQL "57258f76c37864c6e6d23383d05714ea") |
| 122 | + |
| 123 | + |
| 124 | +#### [PostgreSQL 解决方案集合](https://yq.aliyun.com/topic/118 "40cff096e9ed7122c512b35d8561d9c8") |
| 125 | + |
| 126 | + |
| 127 | +#### [德哥 / digoal's github - 公益是一辈子的事.](https://github.com/digoal/blog/blob/master/README.md "22709685feb7cab07d30f30387f0a9ae") |
| 128 | + |
| 129 | + |
| 130 | + |
| 131 | + |
0 commit comments