写点什么

数据高速公路:详解数仓集群通信技术

  • 2024-01-04
    广东
  • 本文字数:3179 字

    阅读完需:约 10 分钟

数据高速公路:详解数仓集群通信技术

本文分享自华为云社区《直播回顾 | 数据高速公路—数仓集群通信技术详解》,作者: 胡辣汤。


大数据时代,集群规模越来越大,业务并发越来越高,数据库集群各节点间的通信压力也越来越大。在本期《数据高速公路—数仓集群通信技术详解》的主题直播中,我们邀请到华为云 GaussDB(DWS)技术布道师魏登老师,深入讲解 GaussDB(DWS)集群通信技术,如何在大规模集群中承载高并发业务,如何实现高性能分布式通信系统。

一、GaussDB(DWS)集群通信总览


在 GaussDB(DWS)集群中,会有 1 个或多个协调节点(CN)、每台主机有若干个数据节点(CN)、全局事物控制器(GTM)、运维管理模块(OM)、集群管理模块(CM)、数据导入导出模块(GDS)。


  • 协调节点(CN):负责请求分解、调度、结果返回;SQL 解析和优化;仅保存元数据,不保存数据。

  • 数据节点(DN):负责存储实际表数据(指定分布方式:哈希表、复制表、RroundRobin 表);执行 SQL 任务并向 CN 返回执行结果。

  • 全局事务控制器(GTM):负责生成和维护全局事务 ID、事务快照、时间戳等需要全局唯一的信息。

  • 运维管理模块(OM):提供日常运维、配置管理。

  • 集群管理模块(CM):集群管理和监控各单元物理资源使用情况。

  • GDS Loader:批量数据加载,并行加速


以上所有模块通过集群网络相互通信,集群通信不同于执行器、优化器、存储等数据库传统模块,集群通信是分布式数据库特有的。对于集群问题定位,集群性能优化有极大的影响。


下图是 GaussDB(DWS)集群总览,本次内容分享对图示进行了一些简化。GaussDB(DWS)是 MPP 型分布式数据库,使用 Share Nothing 架构。数据分散存储在各个 DN 节点。CN 不存储数据,作为接收查询的入口,生成的计划会尽量下推到 DN 并行执行以提升性能。DN 执行多表 Join 时,因为本地 DN 只有部分数据,需要进行 DN 间的数据交换对表数据或中间结果集中分布。


GaussDB(DWS)一般查询的数据通信流程:(绿色箭头)


  • 客户端连接 CN,下发 query;

  • CN 连接所有 DN,生成并下发执行计划;

  • DN 间通过网络做表数据或中间结果交换;

  • DN 本地做数据加工,将结果集返回给 CN;

  • CN 将结果集聚合加工后返回客户端。


GaussDB(DWS)集群通信总览

二、CN 通信框架介绍

1、IP 和端口信息


客户端通过 IP 端口连接到 CN,CN 中的 pgxc_node 系统表保存了集群所有节点的 IP 和端口信息,帮助 CN 连接集群其他节点。


下图 pgxc_node 系统表中,node_port,node_host 为主机信息;node_port1,node_host1 为备机信息。hostis_primary 为主备关系,为 t 时,CN 会先连接主机再连接备机,反之亦反。hostis_primary 值由 CM 集群管理组件在主备切换时自动刷新。


2、客户端与 CN 通信


客户端执行查询流程:


  • 客户端向 CN 的监听端口发起连接;

  • CN postmaster 主线程 accept 连接,创建 postgres 线程并将连接交给此线程处理;

  • 客户端下发 query 到 CN;

  • CN 的 postgres 线程将查询计划下发给其他 CN/DN,查询结果沿原路径返回到客户端;

  • 客户端查询结束,关闭连接;

  • CN 上对应的 postgres 线程销毁退出。


客户端与 CN 通信示意图


CN 与 DN 建连立流程,和客户端与 CN 建连立流程基本相同。为了减少 CN 与 DN 建立连接,以及 DN 进程中 postgres 线程创建、销毁的开销,CN 端实现了 pooler 连接池。

3、Pooler 连接池


Pooler 连接池保存了 CN 与其他 CN/DN 进程的所有连接,每一个连接都对应其他 CN/DN 上的一个 postgres 线程。Pooler 连接池通过对连接和线程的复用减少了建立连接以及 DN 创建、销毁 postgres 线程产生的开销。


Pooler 复用流程:


  • session 需要连接时,通过 DB+USER 为 key 找到正确的 pooler 连接池,优先从中取走现有连接;

  • query 结束后,CN 的 postgres 线程并不会归还连接,连接可以用于当前 session 的下一个查询;

  • session 结束后,CN 的 postgres 线程会将连接还到对应的 pooler,连接对应的 DN 上的 postgres 线程并不会退出,处于 ReadCommand 中,等待复用后 CN 新的 postgres 线程发起任务。


Pooler 连接池示意图

4、Pooler 视图


pg_pooler_status 视图记录了 pooler 连接池中的所有连接信息。如下图所示,每一行表示本 CN 发起的一个连接,对应对端进程的一个 postgres 线程。in_use 为‘t’表示这个连接正在某线程使用,为‘f’表示空闲连接等待复用。tid 列为本 CN 的持有此连接的线程号 node_name 列为对端进程号,remote_pid 列为对端线线程号。在 query_id 为 0 或 CN/DN 不一致时,通过 pooler 视图查找 CN 与 DN 连接关系。


5、Pooler 连接清理


连接池清理机制分为 2 种,分别是:Session 持有的连接、Pooler 空闲连接池中的连接。


Session 持有的连接:


  • cache_connection,是否使用 pooler 连接池缓存连接;

  • session_timeout,客户端连接空闲超时后报错退出归还连接;

  • enable_force_reuse_connections,事务结束后强制归还连接;

  • conn_recycle_timeout(2.1),CN 空闲 session 超时后归还连接。


Pooler 空闲连接池中的连接:


  • pg_clean_free_conn,清理 1/4 的空闲连接池连接,CM 定期调用;

  • clean connection,清理对应 DB 或 user 的所有空闲连接。

三、DN 通信框架介绍

1、Stream 算子


GaussDB(DWS)是 MPP 型分布式数据库,使用 Share Nothing 架构,数据分散存储在各个 DN 节点,两表满足 join 条件的数据必须分布在同一个 DN 上,不满足条件的表需要进行数据重分布,即产生一个 stream 算子。


每个 stream 算子需要上下两个线程处理异步网络 IO,下层发送数据的称为 producer,上层接收数据的称为 consumer。

2、Stream 线程


DN 上的 stream 算子都需要启动一个 stream 线程异步发送网络数据,如果开启了 SMP 并行,一个 stream 算子可能需要启动多个 stream 线程,也会建立更多的 DN 间连接。stream 算子(Streaming)分为以下三种:


  • GATHER:CN 与 DN 通信,收集 DN 结果集

  • BROADCAST:DN 将本地数据全量广播给其他 DN

  • REDISTRIBUTE:DN 将本地数据 Hash 后发给对应 DN

3、Stream 线程池


stream 线程池实现了 DN stream 线程的复用,避免了 stream 线程创建、初始化、清理、销毁的开销。


stream 线程池使用无锁队列实现,2000 个 stream 线程并发启动,耗时从 2 秒级优化到 10ms。stream 算子需要 stream 线程时,通过 DB name 匹配对应的 stream 线程池,优先复用相同 DB 的已有线程。已创建的 stream 线程在查询结束后放入线程池等待复用。stream 线程池中的线程本身具有空闲时超时退出功能,每 60s 超时回收 1/4。max_stream_pool 参数设置线程池缓存上限,为 0 时关闭 stream 线程池功能,也可以临时设置用于清理 stream 线程。


Stream 线程池示意图

4、Libcomm 通信库


当集群达到 1000 个 DN 时,每个 stream 线程需要建立 1000 个连接。如果 1000 stream 线程并发,DN 总共需要建立 100 万个连接,会消耗大量的连接、内存、fd 资源。基于这种情况,设计了 Libcomm 通信库,Libcomm 通信库在一个物理长连接上模拟 n 个逻辑连接,使得所有并发的数据跑在一个物理连接上,解决了物理连接数过多和建连耗时的问题。

四、通信问题定位

1、通信 hang 问题


通信 hang 问题定位步骤:


  • 在 pgxc_stat_activity 视图中找到问题查询的 query_id;

  • 根据 query_id 查询 pgxc_thread_wait_status 视图;

  • 过滤掉 wait node、flush data、synchronize quit 状态后,发现查询阻塞点;

  • 如果均上为上述三种状态,使用 Libcomm 逻辑连接视图进一步定位;

2、通信报错问题


常见通信报错问题如图所示:


3、通信性能问题定位


  • 使用 explain perfomance 分析;



  • 按 hang 问题定位热点阻塞堆栈;

  • 使用 gsar 工具查看环境是否发生网络丢包重传;

4、网络环境问题


  • 使用 gsar 工具确认是否发生网络丢包重传;

  • 使用 netstat 命令确认重传发生在哪一个连接上;


gs_ssh -c "netstat -anot|grep 'on ('|grep -v '/0/0'|sort -rnk3|head“|grep tcp


  • 使用 top 命令在连接两端机器排查 ksoftirq 进程 CPU 占用是否有异常;

  • 使用 ping、telnet 和 tcpdump 进一步分析丢包问题;


本期分享到此结束,更多关于 GaussDB(DWS)产品技术解析、数仓产品新特性的介绍,请关注 GaussDB(DWS)论坛,技术博文分享、直播安排将第一时间发布在 GaussDB(DWS)论坛。


论坛链接:https://bbs.huaweicloud.com/forum/forum-598-1.html

直播回放链接:https://bbs.huaweicloud.com/live/cloud_live/202312191630.html


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
数据高速公路:详解数仓集群通信技术_大数据_华为云开发者联盟_InfoQ写作社区