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

news2025/1/18 20:16:28

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

进程简介

该进程的作用从逻辑上解释包含两个方面:

  • 同步快照,并且是作为通信的client端存在

  • 同步事务号,同样也是client端(

与此同时,该进程只存在于Coordinator节点(后文简称CN节点)和Datanode节点(后文简称DN节点)上,且主机和备机上都有,这些节点上有且仅有一个该进程。

(注:通信的server端则是snapshot sender进程,这部分内容笔者将会在另一篇文章中阐述)

进程的内存结构

Snapshot receiver进程在物理上并没有特别的文件存储方式,启动进程时同时会申请共享内存,所有的数据都在这部分内存之中。

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

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

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

  • geters:backend进程等待申请事务号时的队列,等待receiver进程响应申请事务号的请求

  • reters:已获取事务号的backend队列,等待backend取走事务号

  • xcnt:当前集群内活跃事务号的个数

  • xip[MAX_BACKENDS]:当前集群内活跃事务号的列表

  • wait_finish_cnt:本节点申请的事务号个数,仅CN节点会有这个值

  • wait_xid_finish[MAX_BACKENDS]:本节点申请的事务号列表,仅CN节点会有这个值

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

  • global_xmin:当前集群内的xmin(分布式集群内最老的活跃事务号)

  • local_global_xmin:本节点内的xmin(当前节点内最老的活跃事务号)

  • global_finish_id:本节点最近一次完成的事务号

进程的通信协议

“通信”特指与snapshot sender进程之间的通信,这里借用了逻辑复制的通信格式,采用了‘libpqwalreceiver’库的接口,使用到的接口的代码如下(src/backend/replication/libpqwalreceiver/libpqwalreceiver.c):

  • walrcv_connect

  • walrcv_disconnect

  • walrcv_startstreaming

  • walrcv_send

  • walrcv_receive

  • walrcv_get_senderinfo

不难看出,各接口的用途与名称有一定的必然联系,首先是建连,然后开始流复制,并通过send和receive传输数据。当snapshot receiver进程启动时,会主动连接snapshot sender进程,处理过程如下图所示:

图片

图1:snapshot receiver进程启动处理过程

建连成功之后会调用walrcv_startstreaming,把一些流复制选项同步到服务端,当服务端确认之后就会切换为copy-both模式,这时即表示可以正式传输数据了。当然,snapshot receiver进程同步的内容并不是流复制相关内容,而是事务号相关的内容,包括以下两个方面:

  • 下一个待分配的事务号(nextFullXid)

  • 本节点残留的2pc事务号列表,如果没有即为空(

注:这部分属于进程的异常处理逻辑,笔者会在后续的文章中专题剖析

建连完毕之后,进程即进入正式的通信阶段,一般来说,进入这个阶段集群基本已经启动完毕了,receiver和sender之间通过不同的消息类型去完成不同场景的需求,下面逐个介绍receiver进程的通信逻辑:

  • 消息‘a’

负责处理sender进程的广播消息,消息内容是其他CN申请的事务号,其接口是SnapRcvProcessAssign,处理步骤大致如下:

1、锁住共享内存(SnapRcv)

2、从消息流获取xid,然后遍历SnapRcv->xip数组,做去重处理,然后放入该数组内,同时SnapRcv->xcnt加1

3、解锁

4、如果新的xid大于等于本地的ShmemVariableCache->nextFullXid,并且不是备节点,就需要扩展新的clog,同时更新nextFullXid

  • 消息‘g’                                    

负责处理申请事务号后sender进程反馈回来的数据,其接口是SnapRcvProcessAssignRequest,处理步骤大致如下:                     

1、锁住共享内存(SnapRcv)

2、从消息流获取xid和procno,然后遍历SnapRcv->reters队列,找出正在等待事务号的进程对应的procno

3、找到进程之后,xid赋值给proc->getGlobalTransaction

4、然后setlatch,通知backend进程,backend进程会取出proc->getGlobalTransaction返回给上层调用

5、解锁           

  • 消息‘c’                                     

负责处理sender进程的广播消息,消息内容是其他CN结束的事务号,其接口是SnapRcvProcessComplete,处理步骤大致如下:

1、锁住共享内存(SnapRcv)

2、从消息流获取xid,然后遍历SnapRcv->xip数组,若找到就把这个xid从该数组内删除,同时SnapRcv->xcnt减1;如若没找到,会报ERROR

3、同时,如果该xid大于SnapRcv->latestCompletedXid,那就更新SnapRcv->latestCompletedXid的值

4、唤醒正在等待该事务提交的backend进程

5、解锁

6、用最新的SnapRcv->latestCompletedXid值来更新本地的ShmemVariableCache->latestCompletedXid

                                   

  • 消息‘f                                  

负责处理结束事务号后sender进程反馈回来的数据,其接口是SnapRcvProcessFinishRequest,处理步骤大致如下:

1、锁住共享内存(SnapRcv)

2、从消息流获取xid和procno,然后遍历SnapRcv->wait_commiters队列,找出正在等待的进程对应的procno和xid

3、找到进程之后,proc->getGlobalTransaction的值恢复为InvalidTransactionId

4、然后setlatch,通知backend进程

5、解锁

  • 消息‘s’                                     

负责处理sender进程同步来的快照数据,其接口是SnapRcvProcessSnapshot,处理步骤大致如下:

1、从消息流获取快照、xmin和latestCompletedXid三份数据

2、锁住共享内存(SnapRcv)

3、用gtm传来的值更新SnapRcv->latestCompletedXid

4、把快照数据整体memcpy到SnapRcv->xip数组

5、唤醒等待中的进程

6、解锁

7、更新SnapRcv->global_xmin(这个值在backend获取快照时,用于更新snapshot->global_xmin)

  • 消息‘h’                                    

处理心跳消息的反馈,其接口是SnapRcvProcessHeartBeat,处理步骤大致如下:

1、接收的心跳包内包含2个内容,时间戳和xmin

2、接收到心跳之后,更新SnapRcv->gtm_delta_time和SnapRcv->global_xmin

相对应的,还有一个发送心跳包的接口为SnapRcvSendHeartbeat,这个并不是‘h’消息的处理内容,而是SnapReceiverMain主函数的流程,处理步骤大致如下:

1、每次循环到对应的处理阶段(参考图2的流程),判断当前时间是否超过了设定的心跳间隔时间阈值(snap_receiver_timeout),这个是guc参数,默认60s 

2、 如果超过了阈值,就发送心跳包,否则跳过

3、发送的内容同接收一样,时间戳和xmin

  • 消息‘u’                                    

sender进程会通过这个消息,把nextFullXid同步到所有其他节点,其接口是SnapRcvProcessUpdateXid,处理步骤如下:

1、sender发来的只有一个事务号,即nextFullXid(下一个待分配的事务号)

2、如果拿到的xid比本地ShmemVariableCache->nextFullXid的要大,就更新ShmemVariableCache->nextFullXid和ShmemVariableCache->latestCompletedXid

3、最后更新SnapRcv->latestCompletedXid(先锁后更新)

进程的工作主流程

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

图片

图 2:Snapshot receiver进程工作主流程图

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

小结

本文介绍了snapshot receiver进程在正常情况下的处理逻辑,通过流复制协议,配合以不同的消息处理函数,完成了分布式事务号、分布式快照的同步功能。一个进程不可能总是处于正常状态,那当异常发生时,AntDB如何来保证事务的一致性呢?敬待后续的专题分享。

关于亚信安慧AntDB数据库

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

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

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

相关文章

css之常用样式

展示样式一&#xff1a; <div class"showListBox"><div class"List" v-for"(i,index) in sealList" :key"index"> <div class"ListItemCon"><div class"ListItem-titleBox"><img src…

Ollama管理本地开源大模型,用Open WebUI访问Ollama接口

现在开源大模型一个接一个的&#xff0c;而且各个都说自己的性能非常厉害&#xff0c;但是对于我们这些使用者&#xff0c;用起来就比较尴尬了。因为一个模型一个调用的方式&#xff0c;先得下载模型&#xff0c;下完模型&#xff0c;写加载代码&#xff0c;麻烦得很。 对于程…

工作中用到的 —— 工作总结提炼出来的股文

这里是目录 ---------------- VUE相关 -----------------1 - Vue3 是怎么得更快的&#xff1f;1-1 Fragment [frɡˈment]1-2 Suspense [səˈspens]1-3 Teleport [ˈtelipɔːt]1-4 v-memo 2- 说一下 Composition API3- 说一下 setup4- watch 和 watchEffect 的区别5- Vue3 响…

mysql索引 (索引的忧缺点 ,联合索引)

索引的忧缺点 优点 &#xff08;增加读操作效率&#xff0c;排序成本&#xff09; 1 查询效率高 2 降低排序成本&#xff0c;索引对应的字段 就已经 自动排序&#xff0c;因为索引本身就是一种排好序的数据结构 缺点&#xff08;降低写操作效率&#xff0c;占用空间&#xf…

知识蒸馏Matching logits与RocketQAv2

知识蒸馏Matching logits 公式推导 刚开始的怎么来&#xff0c;可以转看下面证明梯度等于输出值-标签y C是一个交叉熵&#xff0c;我们要求解的是这个交叉熵对的这个梯度。就是你可以理解成第个类别的得分。就是student model&#xff0c;被蒸馏的模型&#xff0c;它所输出的…

大根堆排序

堆是完全二叉树,分为大根堆和小根堆 完全二叉树 从左到右依次变满,高度O(logn) 非完全二叉树: 需要知道的几个点【堆可以看做一段连续的数组来存放】 i是索引位置 i位置的左孩子:2 * i + 1 i位置的右孩子:2 * i + 2 i位置的父亲节点:( i - 1 ) / 2 大根堆【每一颗…

es 分词器详解

基本概念 分词器官方称之为文本分析器&#xff0c;顾名思义&#xff0c;是对文本进行分析处理的一种手段&#xff0c;基本处理逻辑为按照预先制定的分词规则&#xff0c;把原始文档分割成若干更小粒度的词项&#xff0c;粒度大小取决于分词器规则。 分词器发生的时期 1、分词…

兼容性测试策略

&#x1f4cb; 个人简介 作者简介&#xff1a;大家好&#xff0c;我是凝小飞&#xff0c;软件测试领域作者支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 一.背景介绍 Android严重的碎片化&#xff0c;主要体现在品牌碎片化、设备碎片化、系统碎片化、分辨率碎…

HDFS的架构优势与基本操作

目录 写在前面一、 HDFS概述1.1 HDFS简介1.2 HDFS优缺点1.2.1 优点1.2.2 缺点 1.3 HDFS组成架构1.4 HDFS文件块大小 二、HDFS的Shell操作&#xff08;开发重点&#xff09;2.1 基本语法2.2 命令大全2.3 常用命令实操2.3.1 上传2.3.2 下载2.3.3 HDFS直接操作 三、HDFS的API操作3…

将Linux curl命令转换为windows平台的Python代码

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

怎么采集美团的数据

怎么使用简数采集器批量采集美团的活动、商家和商品相关信息呢&#xff1f; 简数采集器暂时不支持采集美团的相关数据&#xff0c;建议换其他网站采集&#xff0c;谢谢。 简数采集器采集网站文章数据特别高效方便&#xff0c;在简数智能向导模式下&#xff0c;只要填写要采集…

【Python】进阶学习:一文了解NotImplementedError的作用

【Python】进阶学习&#xff1a;一文了解NotImplementedError的作用 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望…

ios开发错误积累

1.xcode 下载模拟器报错 Could not download iOS 报错&#xff1a; 解决&#xff1a; 1、去官网下载自己需要 地址&#xff08;https://developer.apple.com/download/all&#xff09; 2、下载完成后&#xff0c;执行以下命令添加&#xff1a;xcrun simctl runtime add /路径…

桌面备忘录,电脑桌面备忘录怎么设置

在当今快节奏的生活中&#xff0c;备忘录成为了人们工作和生活中不可或缺的工具。然而&#xff0c;随着科技的发展&#xff0c;纸质备忘录逐渐被电子桌面备忘录所取代。在电脑桌面设置备忘录&#xff0c;可以更加高效地管理任务和提醒事项。 电脑桌面是我们日常工作和娱乐的主…

Dense Distinct Query for End-to-End Object Detection

摘要 对象检测中的一对一标签分配成功地消除了作为后处理的非极大值抑制&#xff08; NMS &#xff09;的需要&#xff0c;并使流水线端到端。然而&#xff0c;这引发了一个新的困境&#xff0c;因为广泛使用的稀疏查询无法保证高召回率&#xff0c;而密集查询不可避免地带来更…

论文篇00-【历年论文真题考点汇总】与【历年论文原题2009~2023年文字版记录】(2024年软考高级系统架构设计师冲刺知识点总结-论文篇-先导篇)

专栏系列文章推荐: 案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】 综合知识篇00-综合知识考点汇总目录 ...... 历年真题论文题考点汇总 历年软考系统架构设计师论文原题(2009-2022年) 因最新的2023年目前仅能搜索到回忆版,等楼主搜集到…

内容检索(2024.03.15)

随着创作数量的增加&#xff0c;博客文章所涉及的内容越来越庞杂&#xff0c;为了更为方便地阅读&#xff0c;后续更新发布的文章将陆续在此汇总并附上原文链接&#xff0c;感兴趣的小伙伴们可持续关注文章发布动态&#xff01; 本期更新内容&#xff1a; 1. 信号完整性理论与…

找机厅 洛谷 BFS

P10234 [yLCPC2024] B. 找机厅 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> #define pii pair<int,int> #define fr first #define sc second using namespace std; string maze[2000]; int vis[2000][2000]; char dirs[2005][2005]; st…

数据和类型转换

文章目录 数据类型数字类型数字操作NaNJavaScript算术运算符的执行顺序 字符串类型&#xff08;string&#xff09;字符串拼接模板字符串 未定义类型&#xff08;undefined&#xff09;布尔类型&#xff08;boolean&#xff09;null&#xff08;空类型&#xff09; 类型转换显式…

Ubuntu上搭建TFTP服务

Ubuntu上搭建TFTP服务 TFTP服务简介搭建TFTP服务安装TFTP服务修改配置文件 重启服务 TFTP服务简介 TFTP是一个基于UDP协议实现的用于在客户机和服务器之间进行简单文件传输的协议&#xff0c;适用于开销不大、不复杂的应用场合。TFTP协议专门为小文件传输而设计&#xff0c;只…