文章插图
问题7:DN上是否执行查询操作?DN广播的数据是否属于同一个数据表?每个DN都广播数据 , 那最后所有DN的数据是否相同?图中t2发送给所有DN的t1?
解:执行 , DN上存的数据是表的几分之几 , 不是整个表 , 也不是一个表的部分 , 是所有表的一部分 , 这样做是为了并发 。 DN数据不相同 , 因为各取所需 。
SCTP通信库设计
1、概要
- SCTP 协议:一种可靠、保序协议 , 支持message-based模式 , 单个通道支持65535个流 , 且多流之间互不阻塞 , 利用该特性 , 可以打破设备物理连接数对大规模集群节点间通信的限制 , 支持更大规模的节点规模 。
- 通道共享:每两个节点之间有一个数据传输单向SCTP物理通道,在这条物理通道内部有很多逻辑通道(inner Stream) , 每个stream流由producer发送到consumer , 利用SCTP内部支持多流的特性 , 不同的producer & consumer对使用通道中不同的流(SCTP流) , 因此每两个点之间仅需要两个数据连接通道 。
- 通道复用:查询完成后 , 物理通道中的逻辑连接关闭 , 物理连接不关闭 , 后面的查询继续使用建好的物理连接 。
- 流量控制:采用pull模式 , 因为SCTP通道的所有流共享内核的socket buffer, 为了避免一个连接发的数据量过大,consumer端却不接收 , 导致kernel的buffer被填满,阻塞了其他流的发送,增加了流控,给每个流设置一个quota, 由接收端分配 , 当有quota时 , 告知发送端可发送数据 , 发送端根据发来的quota值 , 发送quota大小的数据量 , 实现接收端与发送端同步控制;为了保证控制信息的可靠性 , 将控制信息和数据通道分离 , 流控信息走单独的一条双向TCP控制通道 。
- TCP Channels:TCP控制通道 , 控制流走此通道;
- SCTP Channels:SCTP数据通道 , 包含很多stream流 , 数据流走此通道;
- Send Controller发送端流控线程:gs_senders_flow_controller() , 收发控制消息;
- Recv Controller接收端流控线程:gs_receivers_flow_controller() , 接收端用于发送和接收控制报文 , 与代理接收线程不同 , 代理接收线程接收的是数据 , 而接收流控线程接收的是报文;
- Receiver代理接收线程:gs_receivers_loop() , 用于接收数据的线程 , 从sctp数据通道中接收数据 , 将数据放到不同逻辑连接的不同cmailbox报箱中 , 并通知执行层的consumer工作线程来取 , 取走后 , 有空闲的buffer时 , 接收端流控线程会通过tcp控制通道通知发送端还有多少空闲内存 , 即还有多少quota可用于继续接收数据;
- Auxiliary辅助线程:gs_auxiliary() , 由top consumer , 每个两秒检查一下 , 处理公共事务 , 如DFX消息 , Cancel信号响应等;
- 数据PULL模型:每个逻辑连接有quota大小的buffer , 需要数据时将空闲buffer的大小(即quota)发送给发送端 , 发送端即可以发送quota大小的数据 , quota不足时阻塞发送 , 直到接收端的buffer被应用取走 。

文章插图
TCP多流实现
TCP代理在现有的逻辑连接、代理分发、quota流控等实现的基础上 , 将数据通道从SCTP协议替换成TCP协议 , TCP代理逻辑连接的实现基于head+data的数据包收发模型 , 在head中写入逻辑连接id及后续data的长度 。
问题8:单机TCP只有65535个端口 , SCTP呢?TCP多流和TCP在端口上的区别?TCP的三次握手是否依旧?
SCTP是基于消息流传输 , 数据收发的最小单位是消息包(chunk) , 一个SCTP连接(Association)同时可以支持多个流(stream) , 每个流包含一系列用户所需的消息数据(chunk) 。 而TCP协议本身只能支持一个流 , 因此我们需要在这一个流中区分不同逻辑连接的数据 , 通过在TCP报文的head中写入逻辑连接id及后续data的长度来区分 , 这样虽然TCP只有一个数据包组成 , 但每个数据包包含多个块 , 实现了TCP的多流 。 同时发送时需保证整包原子发送 。
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
