从发展历程到通信模型设计 , 到你了解一下GaussDB通信原理知识 。 下面 , 让我们一起来看看 。
MPPDB通信库发展历程
1、Postgres-XC
方法:采用libpq通信库实现CN和DN之间的连接 , CN负责计算 , DN仅进行数据存储 。
缺点:随着计算任务的不断增大 , CN计算出现瓶颈 , 且白白浪费DN的计算能力 。
2、V1R3
方法:提出分布式执行框架 , 将计算下推到DN上执行 , DN不仅作为存储同时承担计算任务 。 由于每个DN只存储有一部分数据 , 因此DN间也需要进行通信 , 采用stream线程TCP直连 , 每个连接都需要一个TCP端口 。
缺点:随着集群规模的增加 , DN之间的连接数不断增加 , 在大并发场景下需要大量的TCP端口 , 而实际情况是由于单机TCP端口只有65535个 , TCP端口数严重限制了数据库的集群规模和并发规模 。
3、V1R5-V1R7C00
方法:结合SCTP协议的多流优点 , DN间的通信采用SCTP通信库架构 , 使用逻辑连接来代替物理连接 , 用来解决DN之间连接太多的问题 。
缺点:SCTP协议本身存在的内核BUG , 通信报错 。
4、V1R7C10
方法:TCP代理通信库 。
缺点:CN和DN之间的物理连接数也会暴涨 。
5、V1R8C00
方法:CN和DN之间也采用逻辑连接实现 , 即CN多流 。
问题1:DN间是查询结果的通信还是原始数据的通信?
解:既有查询结果 , 也有原始数据;DN之间的数据交流是Hash之后 , 各个DN根据所需获取 。
通信模型的设计
1、Pooler通信模型
问题2:连接池上的CN、DN是否存在交集 , 即poolA中的DN在poolB中也存在?
解:不存在 。
问题3:CN和CN的连接是做什么的?为什么设计连接池连接CN上的PG线程?CN上为什么有多个PG线程 , 有什么用途?
解:CN和CN之间连接是为了数据同步等 , 包括建表之后的信息交汇 。 CN上的PG线程也是为了用户查询建立 。
问题4:DN上为什么有多个PG线程 , 有什么用途?
解:一个查询操作就是创建一个新的PG线程 。
问题5:如何理解gsql客户端退出时 , 只退出PG线程和agent代理线程 , 而取到的slot连接会还回database pool?
解:slot连接退回到pooler , 下次连接可以直接获取 , 若不存在 , 则重新创建 。
问题6:DN间的TCP连接数:C = (H * D * Q * S)* D , 为什么最后乘以D , 而不是(D – 1)/ 2 ? 此外 , 这个公式是否存在高重复 , 每次查询都要建立DN间的通信 , 而不考虑重复性?DN间的通信线程数量是否有限制?
解:数据是双向通信 , 但执行算子是单向的 , 所以不能除以2 。 数量有限制 , 但可以调整 。

文章插图
2、DN间stream线程通信模型
执行计划需要使用多个线程进行执行 , 包括1个CN线程和每个DN上3个线程t1-t3 。 每个DN节点都有3个线程是因为数据是分布到每个DN上的 , 在执行查询过程中 , 查询的每个阶段每个DN都要参与 。
自下而上是数据流 , 自上而下是控制流 。 具体执行过程如下:
- 每个DN的t3顺序扫描table表 , 将表数据广播到所有DN的t2线程;
- 每个DN的t2接收t3的数据 , 建立hash表 , 然后扫描store_sales数据与customer表进行hashjoin , join结果进行哈希聚集后 , 重分布发送到对应DN的t1线程;
- 每个DN的t1线程将收到的数据进行第二次哈希聚集 , 排序后将结果传输到CN;
- CN收集所有DN的返回数据 , 作为结果集返回 。
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
