亚信安慧AntDB数据库分布式架构剖析之snapshot sender进程

本文主要介绍亚信安慧AntDB数据库的分布式架构下的特有进程之snapshot sender进程的设计,与snapshot receiver进程是一对,也是分布式架构的核心进程之一

进程简介

与Snapshot Receiver进程相对应,该进程的作用从整体上看也只包含两个方面:

  • 同步/广播快照,作为通信的server端

  • 同步/广播事务号,同样也是server端

与此同时,该进程只会出现在gtm主节点上,这里特别强调,gtm的备节点上是没有该进程的,高可用切换以备提升为主,会自动拉起该进程。

进程的内存结构

该进程在物理上并没有特别的文件存储,进程启动之时会申请一起共享内存,大部分数据都存储在这部分内存之中。

内存结构名为SnapSenderData,代码内通常以SnapSender指针来访问这部分内存,完整的结构体定义较为琐碎,为了便于读者理解,这里仅挑选部分重要的内容给出说明,完整的定义参见源码文件(src/backend/replication/snapsender.c):

  • mutex:访问这部分共享内存时要加的

  • gxid_mutex:访问事务号成员时要加的锁

  • state: 标记所有cn节点是否都正常连接上

  • dn_conn_state:标记所有dn节点是否都正常连接上

  • cur_cnt_assign:gtm本节点申请的活跃事务号个数

  • xid_assign[MAX_CNT_SHMEM_XID_BUF]:gtm本节点申请的活跃事务号列表

  • cur_cnt_complete:gtm本节点结束的事务号个数

  • xid_complete[MAX_CNT_SHMEM_XID_BUF]:gtm本节点结束的事务号个数

  • xcnt:整个集群活跃的事务个数

  • xip[MAX_BACKENDS]:整个集群活跃事务号列表

  • latestCompletedXid:当前集群内最大的已完成的事务号

与Snapshot Receiver进程有所区别的是,除了共享内存之外,还有几个私有内存区域,首先是3个数组:

图1:私有内存区域

其次是client结构体,与集群内每个节点(gtm的pgxc_node表内记录的cn、dn主节点)相对应,每个节点在sender进程内都会有一个client对象:

图2:client结构体

除此之外还有2个列表,会用于更新上述client对象内的is_dn属性:

  • dn_master_name_list

  • cn_master_name_list

进程的通信协议

Snapshot sender进程的通信与snapshot receiver进程是相对应的,sender作为server端,响应receiver侧发来的各种请求,反馈相对应的消息,同时兼具广播给所有receiver进程的能力,可以结合《分布式架构剖析之snapshot receiver进程》这篇文章一起理解。

下面逐个介绍sender进程的通信逻辑:

  • 消息‘Q’

建连成功之后,receiver那边通过walrcv_startstreaming发来请求,这是建连之后的第一个消息,这个消息会有初始化client对象处理receiver上报的残留2pc,并同步最初的快照等一系列动作,这些都作为异常场景的一部分,具体细节留待下次专题分享。但是正常情况下,这个‘Q’里面没有残留,也没有快照需要同步,所以大部分的逻辑会直接跳过。

  • 消息‘a’

广播事务号,其接口是SnapSenderTriggerAssingAndFinishList,大致处理步骤如下:

1、从下面2个地方确认是否需要广播,如果任意一个数组内有值,那就需要广播:

(1)SnapSender->xid_assign:有值表示gtm本地申请了事务

(2)assign_xid_array:有值表示有cn/dn节点申请了事务号

2、合并上述2个数组的内容,调用ProcessShmemXidMsg接口进行广播:

(1)遍历sender内所有的client对象

(2)判断client的状态,如果不是streaming就跳过

(3)client大概率就是挂掉的节点,不能进行广播

(4)构建一条a消息,把事务号列表写入待广播的buffer

(5)通知client广播给对应的receiver进程

(6)如果广播失败,把对应的client状态更改为exiting,表示这个节点down了,会有别的地方去处理down掉的client

3、清空1里面的两个数组

  • 消息‘g’

当有其他节点申请事务号时,gtm负责完成事务号的分配,当把事务号反馈给申请节点时,会封装这个‘g’消息,其接口是SnapSenderProcessAssignGxid,大致处理步骤如下:

1、首先从消息流取出procno,这个后续反馈的时候需要一并打包

2、调用GetNewTransactionIdExt函数获取下一个事务号

3、将新获取的事务号放入对应的client->xid内

4、将新获取的事务号放入assign_xid_array数组

5、set latch,sender的latch事件会触发a消息和c消息,即广播申请完成的事务号

  • 消息‘c’

与a消息有点类似,这里广播的是结束的事务号,其接口是SnapSenderTriggerAssingAndFinishList,大致处理步骤如下:

1、从下面2个地方确认是否需要广播,如若任意一个数组内有值则就表示需要广播

(1)SnapSender->xid_complete:有值即表示有gtm本地的事务结束

(2)finish_xid_array:有值即表示有cn/dn节点的事务号结束

2、合并上述2个数组的内容,调用ProcessShmemXidMsg接口进行广播

(1)遍历sender内所有的client对象

(2)判断client的状态,如果不是streaming就跳过

(3) client大概率就是挂掉的节点,不能进行广播

(4)构建一条c消息,把事务号列表写入待广播的buffer

(5)通知client广播给对应的receiver进程

(6)如果广播失败,则把对应的client状态更改为exiting,表示这个节点down了,会有别的地方去处理down掉的client

3、清空1里面的两个数组

  • 消息‘f’

处理receiver进程发来的结束事务的请求,其接口是SnapSenderProcessFinishGxid,处理步骤大致如下:

1、从消息流里拿到xid和procno

2、从SnapSender->xip里面删除这个事务号,同时SnapSender->xcnt同步减1,即把完成的事务号从集群活跃事务列表内清除

3、从xid_xact2pc_array数组里面删除这个事务号(在有的情况下)

4、从对应client->xid里面删除这个事务号,如果删除成功了(即client->xid里面有值),把这个事务号放入finish_xid_array数组,后续c消息会处理这个数组

  • 消息‘s’

同步快照数据给receiver进程,其接口是SnapSenderSendInitSnapShot,触发s消息的行为有2处,它们分别是:

1、每次‘Q’消息的时候,如果所有的cn、dn都正常连接到sender,并且adb_check_sync_nextid(为HA切换单独保留的参数,非HA切换状态恒为true)参数为true,就会触发一次同步快照

2、每次唤醒等待中的节点时,就会触发一次同步快照,把快照同步给该节点

对于SnapSenderSendInitSnapShot函数的处理步骤,涉及包括Q消息上报的残留2pc,gtm自身的残留的2pc等这几部分内容,而这些同样也是异常处理的一部分,留待专题介绍。

  • 消息‘h’

心跳处理,其接口是snapsenderProcessHeartBeat,包括以下2个部分:

1、根据各个节点上报来的xmin,更新sender这边对应的client里面的global_xmin,然后重新获取gtm本地的xmin,最后根据整个集群的xmin得到最终的xmin,并更新到SnapSender->global_xmin上

2、把最终的xmin和时间戳封装,反馈给receiver那边

  • 消息‘u’

同步nextFullXid给所有节点,其接口是snapsenderUpdateNextXidAllClient,处理步骤如下:

这个u消息目前仅会在Q消息里面触发,每当有receiver进程连上,就把其上报的nextFullXid广播,日常情况下nextFullXid的更新是融合在receiver的a消息内一并进行更新的。

进程的工作主流程

Snapshot sender进程整体上同其他辅助进程相类似,启动之后会处于一个无限循环之中,不断监听各种事件和信号,笔者整理了一份流程图,帮助读者理解,如下图所示:

图3:snapshot sender进程工作主流程图

上述流程图对应的既是SnapSenderMain函数,又是snapshot sender进程的主函数,之前的各种消息处理都是从这里开始的,想深入理解各种细节的读者可以从这里入手。

小结

本文介绍了snapshot sender进程在正常情况下的处理逻辑,辅以snapshot receiver进程的配合,二者共同完成了分布式事务号、分布式快照的同步功能。

除了这两个进程之外,分布式架构里与事务相关的还有一个remote xact manager进程,这个进程与异常处理更是息息相关,在后续异常处理的专题文章内会有介绍。

关于亚信安慧AntDB数据库

AntDB数据库始于2008年,在运营商的核心系统上,服务国内24个省市自治区的数亿用户,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔通信核心交易,保障系统持续稳定运行超十年,并在通信、金融、交通、能源、物联网等行业成功商用落地。

antdbantdb数据库

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Shopee 4月市场趋势及选品分析,shopee虾皮品类爆款预测

废话不多说,马上进入本周Shopee“现象爆品”、“热门爆品趋势”及“热搜词周榜"版块,帮助商家及时了解Shopee最新市场现状,掌握选品趋势。 1 现象爆品 近几来,为健康“买单”,已经成为全年龄层群体的“刚需”。 图…

第P1周:实现mnist手写数字识别

>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **🍖 原作者:[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)** 目录 一、前言 二、我…

青年才俊的聚集地 带你一览DATE 2024会议现场

会议之眼 快讯 第27届欧洲设计、自动化和测试会议(Design, Automation and Test in Europe Conference )已于2024 年 3 月 25 日-27日在西班牙瓦伦西亚圆满举办!DATE第一届会议是在 1998 年在法国巴黎召开的。从那时起,DATE 会议…

ICLR 2024 | FeatUp: A Model-Agnostic Framework for Features at Any Resolution

论文:https://arxiv.org/abs/2403.10516代码:https://github.com/mhamilton723/FeatUp 背景动机 深层特征是计算机视觉研究的基石,捕获图像语义并使社区即使在零或少样本情况下也能解决下游任务。然而,这些特征通常缺乏空间分辨率…

俄罗斯深陷芯片自主困境,良率仅5成 |百能云芯

俄罗斯的芯片产业一直以来都面临着诸多挑战,尤其是在当前的国际形势下,这些挑战更加凸显。随着俄乌冲突的爆发,西方国家对俄罗斯实施了一系列经济制裁,导致俄罗斯科技产业受到了严重影响。据了解,俄国最大的本土芯片厂…

vue3使用vuedraggable实现拖拽(有过渡)

1. 安装与使用 vue中vuedraggable安装: pnpm i -S vuedraggablenext或者 yarn add vuedraggablenext注意:vue2和vue3安装的是不同版本的vuedraggable,写法上也会有一些区别。 比如在vue3中使用拖拽,要以插槽的方式,…

C# 操作 Word 全域查找且替换(含图片对象)

目录 关于全域查找且替换 Word应用样本 SqlServer数据表部分设计样本 范例运行环境 配置Office DCOM 设计实现 组件库引入 实现原理 查找且替换的核心代码 窗格内容 页眉内容 页脚内容 形状内容 小结 关于全域查找且替换 C#全域操作 Word 查找且替换主要包括如下…

GK7205V500国科微 GK7205RNCFV500 GOKE

GK7205V300 芯片是国科针对 IPC 市场推出的新一代支持 H.265 编码的低功耗 IPC SOC 芯片。 该芯片集成专用的 ISP,拥有高效的视频编码处理性能,支持 H.265 编码,满足客户各种差异化业务需求。集 成了 RTC、POR、Audio codec 以及丰富的外设…

大话设计模式之策略模式

策略模式是一种行为设计模式,它允许在运行时选择算法的行为。这种模式定义了一族算法,将每个算法都封装起来,并且使它们之间可以互相替换。 在策略模式中,一个类的行为或其算法可以在运行时改变。这种模式包含以下角色&#xff1…

Elasticsearch:语义搜索即服务处于卓越搜索的中心

作者:来自 Elastic Sherry Ger, Stephen Brown 对于许多企业来说,搜索卓越中心(center of excellence - COE)向其用户提供搜索服务,从不同的数据源中整理知识,并将搜索功能集成到其内部和外部应用程序中。…

Tensorflow2.0笔记 - metrics做损失和准确度信息度量

本笔记主要记录metrics相关的内容,详细内容请参考代码注释,代码本身只使用了Accuracy和Mean。本节的代码基于上篇笔记FashionMnist的代码经过简单修改而来,上篇笔记链接如下: Tensorflow2.0笔记 - FashionMnist数据集训练-CSDN博…

AI 异构计算机设计方案:902-基于6U VPX 高带宽PCIe的GPU AI 异构计算机

基于6U VPX 高带宽PCIe的GPU AI 异构计算机 一、产品概述 基于6U 6槽 VPX 高带宽PCIe的GPU AI 异构计算机以PCIe总线为架构,通过高带宽的PCIe互联,实现主控计算板、GPU AI板卡,FPGA接口板,存储板的PCIe高带宽互联访问&…

揭秘百度百科审核内幕,百科词条审核究竟需要多久?

百度百科作为国内最大的网络百科全书平台之一,致力于提供全面、准确的知识服务,同时也承担着审核百科词条的工作。在互联网时代,人们对信息的需求日益增长,因此百度百科的审核工作显得尤为重要。那么,百度百科词条审核…

152 Linux C++ 通讯架构实战7 ,makefile编写改成for cpp,读配置文件,内存泄漏查找,设置标题实战

读写配置文件代码实战。nginx.conf 一个项目要启动,需要配置很多信息,第一项就是学习如何配置一个项目 nginx.conf的内容 #是注释行, #每个有效配置项用 等号 处理,等号前不超过40个字符,等号后不超过400个字符&#…

虚幻引擎资源加密方案解析

前段时间,全球游戏开发者大会(Game Developers Conference,简称GDC)在旧金山圆满落幕,会议提供了多份值得参考的数据报告。根据 GDC 调研数据,当下游戏市场中,Unreal Engine (下文简称虚幻)和 Unity 是使用最多的游戏引…

Qlib-Server:量化库数据服务器

Qlib-Server:量化库数据服务器 介绍 Qlib-Server 是 Qlib 的配套服务器系统,它利用 Qlib 进行基本计算,并提供广泛的服务器系统和缓存机制。通过 Qlib-Server,可以以集中的方式管理 Qlib 提供的数据。 框架 Qlib 的客户端/服务器框架基于 WebSocket 构建,这是因为 WebS…

js动态设置页面高度

准备一个div <div class"card-edit"><!-- 业务需求 --> </div>开始操作 // 获取页面的中需要设置高度的元素 如&#xff1a;card-editconst autoStyle document.getElementsByClassName(card-edit)[0]// 根据业务需求做判断// 此处设定&#…

DC电源模块的设计与制造流程

BOSHIDA DC电源模块的设计与制造流程 DC电源模块是一种用于将交流电转换为直流电的设备。它广泛应用于各种电子设备中&#xff0c;如电子产品、工业仪器、电视等。下面是DC电源模块的设计与制造流程的简要描述&#xff1a; 1. 需求分析&#xff1a;在设计DC电源模块之前&#…

sql——对于行列转换相关的操作

目录 一、lead、lag 函数 二、wm_concat 函数 三、pivot 函数 四、判断函数 遇到需要进行行列转换的数据处理需求&#xff0c;以 oracle 自带的表作为例子复习一下&#xff1a; 一、lead、lag 函数 需要行列转换的表&#xff1a; select deptno,count(empno) emp_num from…

R语言赋值符号<-、=、->、<<-、->>的使用与区别

R语言的赋值符号有&#xff1c;-、、-&#xff1e;、&#xff1c;&#xff1c;-、-&#xff1e;&#xff1e;六种&#xff0c;它们的使用与区别如下: <-’&#xff1a;最常用的赋值符号。它将右侧表达式的值赋给左侧的变量&#xff0c;像一个向左的箭头。例如&#xff0c;x …