直播回顾 | 数据高速公路—数仓集群通信技术详解

举报
胡辣汤 发表于 2024/01/03 11:40:04 2024/01/03
【摘要】 大数据时代,集群规模越来越大,业务并发越来越高,数据库集群各节点间的通信压力也越来越大。在本期《数据高速公路—数仓集群通信技术详解》的主题直播中,我们邀请到华为云GaussDB(DWS)技术布道师魏登老师,深入讲解GaussDB(DWS)集群通信技术,如何在大规模集群中承载高并发业务,如何实现高性能分布式通信系统。一、GaussDB(DWS)集群通信总览在GaussDB(DWS)集群中,会有...

大数据时代,集群规模越来越大,业务并发越来越高,数据库集群各节点间的通信压力也越来越大。在本期《数据高速公路—数仓集群通信技术详解》的主题直播中,我们邀请到华为云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端口连接到CNCN中的pgxc_node系统表保存了集群所有节点的IP和端口信息,帮助CN连接集群其他节点。

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

2、客户端与CN通信

客户端执行查询流程:

  • 客户端向CN的监听端口发起连接;
  • CN postmaster主线程accept连接,创建postgres线程并将连接交给此线程处理;
  • 客户端下发queryCN
  • CN的postgres线程将查询计划下发给其他CN/DN,查询结果沿原路径返回到客户端;
  • 客户端查询结束,关闭连接;
  • CN上对应的postgres线程销毁退出。

客户端与CN通信示意图

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

3、Pooler连接池

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

Pooler复用流程:

  • session需要连接时,通过DB+USERkey找到正确的pooler连接池,优先从中取走现有连接;
  • query结束后,CNpostgres线程并不会归还连接,连接可以用于当前session的下一个查询;
  • session结束后,CNpostgres线程会将连接还到对应的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_id0CN/DN不一致时,通过pooler视图查找CNDN连接关系。


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,清理对应DBuser的所有空闲连接。

三、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:CNDN通信,收集DN结果集
  • BROADCAST:DN将本地数据全量广播给其他DN
  • REDISTRIBUTE:DN将本地数据Hash后发给对应DN

3、Stream线程池

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

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

Stream线程池示意图

4、Libcomm通信库

当集群达到1000DN时,每个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 nodeflush datasynchronize 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占用是否有异常;
  • 使用pingtelnettcpdump进一步分析丢包问题;

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

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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。