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

本文主要介绍亚信安慧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个省市自治区的数亿用户,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔通信核心交易,保障系统持续稳定运行超十年,并在通信、金融、交通、能源、物联网等行业成功商用落地。

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

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

相关文章

【博客7.4】缤果Qt5_TWS串口调试助手V2.0 (高级篇)

超级好用的Qt5_TWS耳机串口调试助手 开发工具: qt-opensource-windows-x86-5.14.2 (编程语言C) 目录 前言 一、软件概要: 二、软件界面: 1.App演示 三、获取 >> 源码以及Git记录: 总结 前言 串口调试助手支持常用的50bps - 10M…

MyBatisPlus 之四:MP 的乐观锁和逻辑删除、分组、排序、链式的实现步骤

乐观锁 乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果冲突,则返回给用户异常信息,让用户决定如何去做。 乐观锁适用…

WannierTools安装教程

wanniertools简单介绍 开源软件包WannierTools,是一个用于研究新型拓扑材料的软件。此代码在紧束缚模型中工作,可以由另一个软件包Wannier90生成。 它可以通过计算Wilson loop来帮助对给定材料的拓扑相进行分类,通过角分辨光电发射(ARPES)和…

掘根宝典之C++正向迭代器和反向迭代器详解

简介 迭代器是一种用于遍历容器元素的对象。它提供了一种统一的访问方式,使程序员可以对容器中的元素进行逐个访问和操作,而不需要了解容器的内部实现细节。 C标准库里每个容器都定义了迭代器,这迭代器的名字就叫容器迭代器 迭代器的作用类…

后端系统开发之——创建注册接口

原文地址:后端系统开发之——创建注册接口 - Pleasure的博客 下面是正文内容: 前言 这是一篇SpringBoot项目的实践篇。 主要用于介绍如何从零开始搭建某一种类型的系统。 个人认为,只要后端逻辑完善了,纵使前端页面千变万化都可…

硬件基础:带缓启动MOS管电源开关电路

电源开关电路,经常用在各“功能模块”电路的电源通断控制,是常用电路之一。 本文要讲解的电源开关电路,是用MOS管实现的,且带缓开启功能,非常经典。 一、电路说明 电源开关电路,尤其是MOS管电源开关电路…

2024-3-18-C++day6作业

1>思维导图 2>试编程 要求: 封装一个动物的基类,类中有私有成员:姓名,颜色,指针成员年纪 再封装一个狗这样类,共有继承于动物类,自己拓展的私有成员有:指针成员:腿的个数&a…

蓝桥杯-24点-搜索

题目 思路 --暴力递归全组合的方法。只有4个数,4种计算方式,共有4 * 3 * 2 * 1 * 4种不同的情况,可以写递归来实现。 --每次计算都是两个数之间的运算,因此4个数需要3次计算,第一次计算前有4个数,第二次有…

Mysql与MyBatis

1 Sql语句 增删改查 1.1 建表 -- cmd展示数据库 show databases ; -- cmd登录数据库 mysql localhost -u root -p-- auto_increment 自动增长,每添加一个表项id自动增1 -- char定长字符串 0-255,不足十个字符按十个字符算, varchar变长字符串…

阿里云服务器“地域”,这么选择就对了!

阿里云服务器地域选择方法,如何选择速度更快、网络延迟更低的地域节点,地域指云服务器所在的地理位置区域,地域以城市划分,如北京、杭州、深圳及上海等,如何选择地域?建议根据用户所在地区就近选择地域&…

预防近视的台灯有哪些?多款专家说好的护眼台灯推荐

现在的儿童青少年近视率真的非常高!据统计,我国儿童青少年的总体近视率为52.7%,其中6岁儿童为14.3%,小学生为35.6%,初中生为71.1%,高中生为80.5%。而造成如此高近视率的原因主要还是长时间过度用眼导致的疲…

【Qt问题】使用QSlider创建滑块小部件无法显示

问题描述: 使用QSlider创建滑块小部件用于音量按钮的时候,无法显示,很奇怪,怎么都不显示 一直是这个效果,运行都没问题,但是就是不出现。 一直解决不了,最后我在无意中,在主程序中…

LabVIEW飞行器螺旋桨性能测试与数据监控

LabVIEW飞行器螺旋桨性能测试与数据监控 开发LabVIEW的电动飞行器螺旋桨性能测试与数据监控系统,专门针对电动飞行器螺旋桨在运行过程中的性能测试和监控需求。通过采集转速、转矩、拉力和温度等关键参数,系统能够实时监测和分析螺旋桨的状态&#xff0…

AI - 集成学习

目录 集成学习概念 集成学习器性能评估 随机森林 AdaBoost 😆😆😆感谢大家的阅读😆😆😆 集成学习概念 💎集成学习是机器学习中的一种思想,它通过多个模型的组合形成一个精度…

【Spring MVC】Spring MVC拦截器(Interceptor)

目录 一、拦截器介绍 二、拦截器 Interceptor 定义 2.1 HandlerInterceptor接口 2.2 Spring MVC中提供的一些HandlerInterceptor接口实现类 1、AsyncHandlerInterceptor 2、WebRequestInterceptor 3、MappedInterceptor 4、ConversionServiceExposingInterceptor 三、拦…

力扣题单(小白友好)

力扣题单 算法小白自用题单,目前对于一些简单的数据结构感觉掌握的还可以,但是力扣很多题还是需要看题解,不够熟练;故整理了一份题单,用于巩固练习; 网上确实有很多对于算法分类讲解的网站,but:有一丢丢选择困难症,每天不知道该刷什么题,再加上网站对于一类题一般就有十几道题目…

人工智能技术的不当利用与风险

目录 前言1 视频篡改技术的滥用1.1 虚假信息传播与社会动荡1.2 对公众信任的破坏与舆论混乱 2 隐私泄露与监视风险2.1 个人信息安全与数据滥用风险2.2 社会稳定与个人自由权利的平衡 3 虚假评论与信息传播3.1 舆论操纵与社会意识形态的影响3.2 对信息可信度与公众信任的威胁 结…

雷龙发展Nand flash芯片试用体验

一、项目背景 最近自己开始准备了一个智能家居控制系统项目,需要包含室内的温湿度、空气质量、烟雾浓度以及气体含量,能够存储相应的数据,并进行显示。 Nand-flash存储器是flash存储器的一种,其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案…

阿里云ecs服务器配置反向代理上传图片

本文所有软件地址: 链接:https://pan.baidu.com/s/12OSFilS-HNsHeXTOM47iaA 提取码:dqph 为什么要使用阿里云服务器? 项目想让别人通过外网进行访问就需要部署到我们的服务器当中 1.国内知名的服务器介绍 国内比较知名的一些…

一招让你的Mac重获新生!CleanMyMac专业软件助你清理系统垃圾,保障安全!

一、Mac用户必备神器——CleanMyMac 随着Mac的使用时间越来越长,系统中的垃圾文件也会越来越多,不仅占用宝贵的硬盘空间,还会影响系统的运行速度。这时候,一款专业的清理软件就显得尤为重要。CleanMyMac作为荣获多项大奖的清理软件…