GPDB-内核原理-如何指定发送数据目的地

news2025/1/12 10:46:41

GPDB-内核原理-如何指定发送数据目的地

GPDB是一个分布式数据库,数据存放在各个segment上。Master用于接收用户请求,并将执行计划发送到各个segment上去执行。各个segment将数据发送个master汇总并返回用户。当进行join,join条件不是分布键时,各个segment就需要将数据重分布或者广播给其他segment。这个数据发送时,默认利用UDP协议进行传输,那么各个segment的端口号怎么指定呢?是否是各个segment配置的端口?发送时怎么指定发送目的?

1、发送函数

当然是motion算子来完成数据的传输,所以需要从motion算子执行开始入手看它的执行流程。

bc820b81bbec852297aba4bde051c4c2.png

1)Motion算子执行时分为接收和发送两个模块。这里我们仅关注发送模块,由函数execMotionSender函数来完成。

2)execMotionSender会循环从执行计划子节点拉取数据,然后调用SendTuple函数将其发送走,直至所有数据都处理完。

f96c1f48fac8a6eb454a7de6a3b377d5.png

1)SendTuple会先将记录序列化,放到发送缓冲中,若发送缓冲没了空间,则将其先放到链表tcItem中

2)然后将发送缓冲的东西发送走,再将链表内容拷贝过来,接着发送

3)发送函数由SendChunkUDPIFC函数完成

9e95884ce739e83b7470b60cea3db35b.png

1)SendChunkUDPIFC函数最终调用sendto函数来发送

2)系统函数sendto的dest_addr入参为发送目的:指向目的套接字的地址

3)向上回溯,dest_addr为conn->peer,即MotionConn::peer

2、发送目的套接字

ee0d8091a16d1e67aeb9a70b409c4b34.png

1)QE执行器开始执行的函数是standard_ExecutorStart函数

2)QE执行器开始执行时,会初始化UDP传输需要的连接等信息

3)流程中,可以看到conn->peer来自cdbProc->listenerAddr(IP或主机名)和cdbProc->listenerPort(端口)构建套接字内容

4)而cdbProc则来自recvSlice->primaryProcesses链表

那就需要看下该链表来自哪里。

3、Slice的primaryProcesses链表

660ed56cd0c0235fb89249bf5281602b.png

1)QD:分发执行计划时,根据motion切分slice,并创建gang,即生成QE进程

2)可以看到primaryProcesses链表由CdbProcess* process构建组成

3)process中的端口listenerPort来自segdbDesc->motionListener

此时就需要继续溯源,看下segdbDesc->motionListener来自哪里?

4、Gang的创建cdbgang_createGang_async

a80a8916fce432e2e97ab89a3f7b3414.png

创建gang,和QE建立好连接后,QE进程会将QE的监听端口发给QD,从而让QD将QE的UDP监听端口保存到segdbDesc->motioListener中。

QE的监听端口由Gp_listener_port保存,接着这个现索进行分析,看下Gp_listener_port来自哪里?

5、Gp_listener_port

0f8459f55f21ad7b6d1d7d42abba5db1.png

Gp_listener_port的端口可以从上述流程看分析出:他是随机分配的端口。

每个segment上可能有不同的QE,此时不同QE分配的接收数据监听端口不同,那么就可以发送时指定到底发给哪个QE了。

不要以为同一个segment上的不同QEs它的接收数据监听端口相同,而发送数据时指定端口时不知道给同一个segment的哪个QE发送数据!

6、InitMotionLayerIPC什么时候调用

39953270e5f7b83676a43c8c3665e244.png

当然,还是QE进程fork出来初始化的时候,可以看到他是先随机分配监听端口,然后再将监听端口发送给QD的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/981363.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.3.2 【MySQL】客户端和服务器通信中的字符集

3.3.2.1 编码和解码使用的字符集不一致的后果 我们知道字符 我 在 utf8 字符集编码下的字节串长这样: 0xE68891 ,如果一个程序把这个字节串发送到另一个程序里,另一个程序用不同的字符集去解码这个字节串,假设使用的是 gbk 字符集…

【Ubuntu搭建MQTT Broker及面板+发布消息、订阅主题】

Ubuntu搭建MQTT Broker及面板发布消息、订阅主题 配置curl数据源 curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash开始安装 sudo apt-get install emqx启动 sudo emqx start使用面板 根据自己的服务器是否开始了防火墙放行端口(1808…

【系统设计系列】 DNS和CDN

系统设计系列初衷 System Design Primer: 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版: https://github.com/donnemarti…

MIT6.828实验记录-Lab1

1.Lab1 刚刚入门,难度确实很大,大量的参考资料,知识点涉及的较深,好在每个实验,作者都给出了很多提示,让繁琐的实验变得有趣起来。逐个exercise进行,知识点有些断片,所以特意花点时…

excel中删除重复项

数据如图: 要删除姓名这一列的重复项,操作: (1)选中姓名这一列(2)点击“数据”(3)点击“删除重复项" 这是excel会自动检测出还有别的关联列 直接默认,点击删除重复项...弹出下面的界面 因为我们只要删除“姓名”列的重复值&…

C++智能指针之unique_ptr(保姆级教学)

目录 unique_ptr 概述 涉及程序 初始化 手动初始化 std::make_unique函数(C14) unique_ptr常规操作 不支持操作:该指针不支持拷贝和赋值操作;所以不能拷贝到容器里 移动语义std::move(); release(); reset(); *解应用…

【计算机网络】 子网划分

文章目录 IP地址分类子网掩码网关广播地址非默认子网掩码子网划分常见问题 IP地址分类 学会十进制和二进制的相互转换可以很快速的有规律的记住 子网掩码 又叫网络掩码,地址掩码,子网络遮罩,就是说把子网络遮起来,不让外界窥探到…

“安全即服务”为网络安全推开一道门

8月30日,三六零(下称“360”)集团发布了2023年半年报,其中安全业务第二季度收入6.54亿元,同比增长98.76%,环比增长157.16%,安全第二增长曲线已完全成型!特别值得一提的是&#xff0c…

【Unittest】Requests实现小程序项目接口测试

文章目录 一、搭建接口测试框架二、初始化日志三、定义全局变量四、封装接口五、编写测试用例六、生成测试报告 一、搭建接口测试框架 目录结构如下。 二、初始化日志 在utils.py文件中编写如下如下代码,初始化日志。 # 导入app.py全局变量文件 import app import l…

基于Zookeeper搭建Kafka高可用集群(实践可用)

目录 一、Zookeeper集群搭建 1.1 下载 & 解压 1.2 修改配置 1.3 标识节点 1.4 启动集群 1.5 集群验证 二、Kafka集群搭建 2.1 下载解压 2.2 拷贝配置文件 2.3 修改配置 2.4 启动集群 2.5 创建测试主题 2.6 写入数据测试 一、Zookeeper集群搭建 为保证集群高可…

SV中的随机化约束

1.多个变量相互依赖,如何进行随机化? 采用solve before (1)constraint c_valid_write_data {solve access_type before data;solve burst_length before data;(access_type TVIP_AXI_WRITE_ACCESS) -> data.size() burst…

算法通过村第五关-队列和Hash黄金笔记|LRU的设计与实现

文章目录 前言1. LRU的含义2. Hash双向链表实现LRU总结 前言 提示:我曾如此渴望命运的波澜,到最后才发现:人生最曼妙的风景,竟是内心的淡定从容。 我们层如此盼望世界的认可,到最后才知道:世界是自己&#…

01-Kafaka

1、Kafka 2 的安装与配置 1、上传kafka_2.12-1.0.2.tgz到服务器并解压: tar -zxf kafka_2.12-1.0.2.tgz -C /opt 2、配置环境变量并更新: 编辑profile配置文件: vim /etc/profile #设置kafka的环境变量export KAFKA_HOME/opt/kafka_2.1…

【ESP32--FreeRTOS 任务间的同步与通信】

本文主要记录【ESP32–FreeRTOS 任务间的同步与通信】的学习记录,邮件,信号量,事件组的使用和优缺点以及应用场景 📋 个人简介 💖 作者简介:大家好,我是喜欢记录零碎知识点的小菜鸟。&#x1f6…

软件测试之随机测试

目录 一、作随机测试之前的一些前提条件 二、随机测试功能点的选取 三、功能点的随机测试 在软件测试中除了根据测试用例和测试说明书进行功能测试外,还需要进行随机测试(Ad-hoc testing),随机测试是没有书面测试用例、记录期望…

【算法】插入排序

插入排序 插入排序代码实现代码优化 排序: 排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性: 假定在待排序的记录序列中,存在多个具有相同的关键字的记录&…

【算法】归并排序 详解

归并排序 详解 归并排序代码实现1. 递归版本2. 非递归版本 排序: 排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性: 假定在待排序的记录序列中,存在多个具有相…

dpkt 处理linux cooked capture

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

CUDA小白 - NPP(4) 图像处理 Data Exchange and Initialization(1)

cuda小白 原始API链接 NPP GPU架构近些年也有不少的变化,具体的可以参考别的博主的介绍,都比较详细。还有一些cuda中的专有名词的含义,可以参考《详解CUDA的Context、Stream、Warp、SM、SP、Kernel、Block、Grid》 常见的NppStatus&#xf…

QT 初识多线程

1.QThread线程基础 QThread是Qt线程中有一个公共的抽象类,所有的线程类都是从QThread抽象类中派生的,需要实现QThread中的虚函数run(),通过start()函数来调用run函数。 void run()函数是线程体函数,用于定义线程的功能…