GPDB - 高可用 - 流复制状态
GPDB - 高可用 - 流复制状态
GPDB的高可用基于流复制,通过FTS进行自动故障切换。自动故障切换需要根据primary-mirror流复制的各种状态进行判断。本节就聊聊primary-mirror流复制的各种状态。同样适用于PgSQL
1、WalSndState
typedef enum WalSndState
{WALSNDSTATE_STARTUP = 0,WALSNDSTATE_BACKUP,WALSNDSTATE_CATCHUP,WALSNDSTATE_STREAMING,WALSNDSTATE_STOPPING
} WalSndState; WalSndState保存的是wal sender进程的状态信息,变量值如上代码。
WALSNDSTATE_STARTUP表示启动状态;
WALSNDSTATE_BACKUP表示备份状态
WALSNDSTATE_CATCHUP表示追赶状态
WALSNDSTATE_STREAMING表示流复制状态
WALSNDSTATE_STOPPING表示wal sender即将退出
2、什么时候切换到WALSNDSTATE_STOPPING

1)集群shutdown有三种方式:smart、fast、immediate
三种标记值分别为:
#define SmartShutdown 1
#define FastShutdown 2
#define ImmediateShutdown 3 Smart shutdown:不允许有新连接,待已有连接全部结束后关闭数据库;
Fast shutdown:不允许新连接,向所有活跃的服务进程发送SIGTERM信号,让他们立即退出,之后等待所有子进程退出并关闭数据库
Immediate shutdown:不允许新连接,主进程postgres向所有子进程发送SIGQUIT信号并立即退出,所有子进程也会立即退出。下次启动会回放WAL日志进行恢复。
2)如果shutdown模式不为immediate,则集群shutdown的时候,postgres主进程会向checkpoint进程发送SIGUSR2信号:

3)checkpoint进程的SIGUSR2信号处理函数为ReqShutdownHandler,从上图的代码逻辑可见,ReqShutdownHandler会将shutdown_requested置为true,并唤醒MyLatch。
4)checkpoint进程接着调用ShutdownXLog,然后proc_exit(0)退出checkpoint进程。
5)ShutdownXLog函数调用WalSndInitStopping向所有sender进程发送SIGUSR1信号;然后调用WalSndWaitStopping等待所有sender进程退出,每个10ms判断一次。
6)sender进程SIGUSR1信号处理函数procsignal_sigusr1_handler检查信号来自PROCSIG_WALSND_INIT_STOPPING,然后将got_STOPPING置为true
7)流复制的sender处理完SIGUSR1信号后,继续返回信号前处理流程。Sender的发送日志函数为XLogSendPhysical,此时got_STOOPING已为true,所以调用WalSndSetState将walsnd->state切换到WALSNDSTATE_STOPPING状态,然后调用FTSReplicationStatusUpdateForWalState更新WAL复制状态
8)另外当sender进程从WalSndLoop退出后(replication_active置为false),这个时候,Wal sender进程才接收到信号,HandleWalSndInitStopping中也可以看到,会向自己发送SIGTERM信号,信号处理函数die,即退出进程(因为流复制终止了,不必管它了)。
9)若,sender进程还没从WalSndLoop退出(replication_active置为true),这个时候,Wal sender进程接收到信号,HandleWalSndInitStopping中也可以看到,他会设置got_STOPPING为true,让WAL sender进程发送完WAL后退出WalSndLoop循环后调用proc_exit自行退出。
2、sender进程什么时候退出?
书接上文,产生个问题:WalSndLoop何时退出?若没有shutdown,何时再发起流复制?

Wal sender进程接收到mirror发来的start replication命令后,进入StartReplication开始流复制。
1)WalSndLoop循环中,通过XLogSendPhysical函数不断发送WAL
2)XLogSendPhysical函数发送WAL达到一个时间线的末尾节点位置时,向mirror的receiver进程发送CopyDone消息,即开头为‘c’的消息,并将streamingDoneSending变量改为true
3)receiver进程的入口函数WalReceiverMain,通过walrcv_receive::libpqrcv_receive不断接收WAL日志和消息。当接收到发来的CopyDone消息后返回-1
4)接着,返回到WalReceiverMain函数中,当walrcv_receive返回-1后,一路下来会退出接收消息和日志的循环,并进入walrcv_endstreaming再向primary发送个CopyDone消息
5)primary的ProcessRepliesIfAny处理mirror发来的消息,当接收到CopyDone消息后,将streamingDoneReceiving改为true
6)返回WalSndLoop循环,当streamingDoneSending和streamingDoneReceiving都为true时退出循环
总结一句话:primary发完一个时间线内的WAL,切换下一个时间线时,会退出发送WAL日志的循环stop streaming;当然mirror的receiver进程发起下一个时间线的日志拉取,即再次调用libpqrcv_startstreaming函数向primary发送START_REPLICATION命令后,primary仍旧会再次进入WalSndLoop循环发送WAL日志。
3、什么时候进入WALSNDSTATE_BACKUP?
exec_replication_command:进行基础备份的时候
exec_replication_command:进行基础备份的时候switch (cmd_node->type){case T_BaseBackupCmd:PreventInTransactionBlock(true, "BASE_BACKUP");SendBaseBackup((BaseBackupCmd *) cmd_node);| parse_basebackup_options(cmd->options, &opt);| WalSndSetState(WALSNDSTATE_BACKUP);| perform_base_backup(&opt);break;...} 进行基础备份,也就是构建mirror的时候进入该状态。
4、什么时候进入WALSNDSTATE_STARTUP?
1)sender进程刚fork出来,InitWalSenderSlot初始化的时候
2)WalSndLoop进程退出后又进入startup状态,因为下个时间线的复制即将开始
3)sender进程遇到ERROR故障,跳回到PostgresMain回退操作处,回退事务后,进入WalSndErrorCleanup,若没有stop则重新设置为startup状态,等待接收start replication命令重新开始复制。
PostgresMainif (am_walsender)InitWalSender();//sender进程的初始化|-- InitWalSenderSlot|-- for (i = 0; i < max_wal_senders; i++){| WalSnd *walsnd = &WalSndCtl->walsnds[i];| SpinLockAcquire(&walsnd->mutex);| if (walsnd->pid != 0){| //找一个空闲的slot| SpinLockRelease(&walsnd->mutex);| continue;| }else{| walsnd->pid = MyProcPid;| walsnd->state = WALSNDSTATE_STARTUP;| ...| break;| }| }|-- on_shmem_exit(WalSndKill, 0); StartReplication:sender的WalSndLoop退出后又进入startup状态WalSndLoop(XLogSendLogical);...if (got_STOPPING)proc_exit(0);WalSndSetState(WALSNDSTATE_STARTUP);EndCommand("COPY 0", DestRemote); PostgresMain//sender进程遇到ERROR报错,sender进程需要再次start replication才能进入传输walif (sigsetjmp(local_sigjmp_buf, 1) != 0){AbortCurrentTransaction();if (am_walsender)WalSndErrorCleanup();|-- if (got_STOPPING || got_SIGUSR2)| proc_exit(0);|-- WalSndSetState(WALSNDSTATE_STARTUP);...for (;;){firstchar = ReadCommand(&input_message);switch (firstchar){case 'Q':{if (am_walsender){if (!exec_replication_command(query_string))exec_simple_query(query_string);}else if (am_ftshandler)HandleFtsMessage(query_string);else if (am_faulthandler)HandleFaultMessage(query_string);elseexec_simple_query(query_string);send_ready_for_query = true;break;}case 'M': ...}} 5、什么时候进入WALSNDSTATE_CATCHUP?
开始流复制前,设置成catchup状态。
StartReplication:开始流复制前WalSndSetState(WALSNDSTATE_CATCHUP);/* Send a CopyBothResponse message, and start streaming */pq_beginmessage(&buf, 'W');pq_sendbyte(&buf, 0);pq_sendint16(&buf, 0);pq_endmessage(&buf);pq_flush();WalSndLoop(XLogSendLogical);... 6、什么时候进入WALSNDSTATE_STREAMING?
当前时间线内没有要发送的日志了,并且没有下一个时间线需要切换发送日志,则将其改为streaming状态。
WalSndLoopfor (;;){if (!pq_is_send_pending())send_data();elseWalSndCaughtUp = false;...//现在没有要发送的了if (WalSndCaughtUp && !pq_is_send_pending()){if (MyWalSnd->state == WALSNDSTATE_CATCHUP)WalSndSetState(WALSNDSTATE_STREAMING);}...}
相关文章:
GPDB - 高可用 - 流复制状态
GPDB - 高可用 - 流复制状态 GPDB的高可用基于流复制,通过FTS进行自动故障切换。自动故障切换需要根据primary-mirror流复制的各种状态进行判断。本节就聊聊primary-mirror流复制的各种状态。同样适用于PgSQL 1、WalSndState typedef enum WalSndState {WALSNDSTATE…...
最佳解决方案:如何在网络爬虫中解决验证码
Captcha(全自动区分计算机和人类的公开图灵测试)是广泛应用的安全措施,用于区分合法的人类用户和自动化机器人。它通过呈现复杂的挑战,包括视觉上扭曲的文本、复杂的图像或复杂的拼图等方式,要求用户成功解决这些挑战以…...
在线项目实习分享:股票价格形态聚类与收益分析
01前置课程 数据挖掘基础数据探索数据预处理数据挖掘算法基础Python数据挖掘编程基础Matplotlib可视化Pyecharts绘图 02师傅带练 行业联动与轮动分析 通过分析申银万国行业交易指数的联动与轮动现象,获得有意义的行业轮动关联规则,并在此基础上设计量…...
c# vb.net检测字符串是否匹配一组相似度数组input Like
VB.NET 检测字符串是否符合一个数组中的多个like条件,有没有最简单的函数? 在VB.NET中,可以使用Array.Exists方法结合String.Like方法来检测一个字符串是否符合一个数组中的多个LIKE条件。Array.Exists方法用于确定序列中的任何元素是否满足…...
DEJA_VU3D - Cesium功能集 之 113-获取圆节点(2)
前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(每篇博文都会奉上完整demo的源代码…...
spring-boot项目启动类错误: 找不到或无法加载主类 com.**Application
问题:Springboot项目启动报错:错误: 找不到或无法加载主类 com.**Application 解决步骤: 1.File–>Project Structure 2.Modules–>选中你的项目–点击“-”移除 3.重新导入:点击“”号,选择Import Module&…...
搭建大数据开发环境【AutoDL容器】
租用AutoDL容器 注意:结束实验时记得将数据库数据转移存储 使用Docker实现本地IDEA连接AutoDL 后为ssh服务器地址用户名为前的端口号ssh密码为用户密码 安装JDK 压缩包安装 Java下载地址:Oracle Java Download(hadoop不指定特定版本java&…...
写一个简单的Java的Gui文本输入窗口,JFrame的简单使用
JFrame是指一个计算机语言-java的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化、最小化、关闭。 Swing的三个基本构造块:标签、按钮和文本字段;但是需要个地方安放它们,并希望用户知道如何处理它们。JFrame 类就是解决这个问题的——它是一个容器…...
Unity中URP下抓屏的 开启 和 使用
文章目录 前言一、抓屏开启1、Unity下开启抓屏2、Shader中开启抓屏 二、抓屏使用1、设置为半透明渲染队列,关闭深度写入2、申明纹理和采样器3、在片元着色器使用请添加图片描述 三、测试代码 前言 我们在这篇文章中看一下,URP下怎么开启抓屏。 一、抓屏…...
业务题day01
1-1 请说一下你项目中是如何进行项目管理和发布的 我们项目使用的是Gogs进行代码托管,Jenkins进行项目自动运维发布。 在我们的项目中,我们使用Gogs进行代码托管和版本控制,以确保团队成员可以协同开发和管理代码。 Gogs是一个轻量级的、开…...
DEJA_VU3D - Cesium功能集 之 114-雷达效果(基础效果)
前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(每篇博文都会奉上完整demo的源代码…...
【Leetcode】2696. 删除子串后的字符串最小长度
文章目录 题目思路代码 题目 2696. 删除子串后的字符串最小长度 思路 计算通过删除字符串中的 “AB” 和 “CD” 子串后,可获得的最终字符串的最小长度。 主要思路是使用一个栈来模拟字符串的处理过程,每次遍历字符串时,如果当前字符和栈…...
利用gulp工具对常规web项目进行压缩打包
前言 对于一个常规的web项目,如下项目目录 |- imgs | - img1.png | - img2.png |- js | - user.js | - utils.js |- css | - index.css | - user.css |- html | - user.html |- index.html可以使用各种构建工具(如webpack、gulp、grunt等)来…...
面试经典题---68.文本左右对齐
68.文本左右对齐 我的解法: 两层while循环嵌套,外层循环用于处理不同行,内层while循环计算出每行应有的单词个数。 使用left和right记录一行中应有的单词下标,即当前行应包含从words[left]到words[right-1]这count个单词…...
完整的模型验证套路
读取图片 from PIL import Imageimg_path "../Yennefer_of_Vengerberg.jpg" image Image.open(img_path) print(image)转换成灰度图(可选) image image.convert(L) image.show()转换成RGB格式 image image.convert(RGB)因为png格式是四…...
内 存 取 证
1.用户密码 从内存中获取到用户admin的密码并且破解密码,以Flag{admin,password}形式提交(密码为6位); 1)查看帮助 -h ./volatility_2.6_lin64_standalone -h 2)获取内存镜像文件的信息 imageinfo ./volatility_2.6_lin64_stand…...
【PHP】价格区间字段验证,如4万-5万
参数值示例: $str1 "4万-5万"; $str2 "4万-5万元"; $str3 "5万元以内"; 以下是一个PHP示例,用于检查字符串是否满足要求: function checkString($str) {// 检查字符串中是否包含"-"或"以内…...
安徽省暨合肥市“希望工程·梦想计划”小盖茨机器人捐赠启动仪式举行
1月5日,安徽省暨合肥市“希望工程梦想计划”小盖茨机器人捐赠启动仪式在合肥市一六八玫瑰园学校东校区举行。共青团安徽省委副书记叶征,北京儒布特教育科技有限公司董事牛俊明,北京儒布特教育科技有限公司市场总监高进,安徽省青基…...
Kafka消息存储
一、层次结构 具体到某个broker上则是, 数据目录/分区名/日志相关文件集合。其中日志文件集合内包括.log文件, index索引文件和.timeindex时间戳索引文件。 二、.log 结构 .log中记录具体的消息。一般消息由header和body组成, 这点儿在Kafka消息中也同样适用。 message MES…...
【Vue3+Ts项目】硅谷甄选 — 用户管理+角色管理+菜单管理+首页
一、用户管理 1.1 接口 1.1.1 接口定义 src/api/acl/user/index.ts // 用户管理模块的接口 import request from /utils/request import type {AllRoleResponseData,SetRoleData,User,UserResponseData } from ./type enum API {// 获取全部已有用户账号信息ALLUSER_URL /…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
大数据治理的常见方式
大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...
