PostgreSQL 同步复制原理解析

news2025/1/24 8:40:27

背景

Postgresql 在主备架构的场景下,支持同步流复制功能。本文将以一主一备架构为例,介绍同步流复制(同步备机)的工作方式以及内核代码的相关原理。

配置同步备机

工欲善其事,必先利其器。我们现简单的配置一个同步备机,方便后续调试研究代码。
首先配置主库,并使用 pg_basebackup 拉起一个备库

-- 主库添加流复制用户
create role repl login replication;

-- 主库 pg_hba.conf 加一行
host    replication     repl        127.0.0.1/32                 trust

-- 拉起备库
./pg_basebackup -h localhost -U repl -p 5432  -P -v  -R -X stream -D ../data_b -l backup_label
echo "port = 5433" >> ../data_b/postgresql.conf
echo "hot_standby = on" >> ../data_b/postgresql.conf
./pg_ctl start -D ../data_b -l logfile_b

这时候,主备之间还属于异步复制状态,需要主库设置以下两个参数配置同步复制。

alter system set synchronous_commit = on;
alter system set synchronous_standby_names='walreceiver';
select pg_reload_conf();

现在备机已属于同步状态
在这里插入图片描述
为了方便后续调试,设置下面两个参数

client_min_messages=LOG
wal_debug=on

场景分析

首先使用 gdb 卡住备库的 walreceiver 进程,这时候主库执行一条 insert 语句,其结果如下
在这里插入图片描述
主库写了两条 XLOG,然后卡住不动:

  1. insert 记录;
  2. commit 记录。

此时使用 gdb 去看主库,发现其卡在 SyncRepWaitForLSN 函数中等待 latch。当我们释放卡住备库 walreceiver 进程的 gdb 后,latch 被唤醒,该事物最终被标记为提交。

原理分析

其大致原理如下图所示,主库刷完 XLOG 后,在 SyncRepWaitForLSN 函数中等待 latch。
在这里插入图片描述
接下来详细介绍下主库等待、唤醒这一套的实现机制,首先需要熟悉以下变量和函数:

  • SyncRepQueue:维护在共享内存中的队列。位于 WalSndCtlData 结构体中,可用于处理同步复制中的同步关系(备库 XLOG 落盘停止阻塞)。用于维护需要等待同步提交的进程队列;
  • SyncRepQueueInsert:主库 SyncRepWaitForLSN 函数调用,作用是把该进程插入 SyncRepQueue 队列中,然后开始等待;
  • SyncRepCancelWait:停止等待,并将该进程从队列中移除;
  • SyncRepWakeQueue:唤醒队列中所有等待的进程,并将所有进程移除队列;

具体流程如下:

  1. 主库插入数据,刷 XLOG;
  2. 调用 SyncRepWaitForLSN 等待,并将本进程插入 SyncRepQueue 队列中;
  3. 备库 walreceiver 进程将 XLOG 刷入磁盘,并且通知主库的 walsender 进程;
  4. 主库 walsender 进程收到备库的消息,使用 SyncRepWakeQueue 唤醒所有等待队列中的进程,并将其移出队列;
  5. 主库执行 SQL 的进程继续执行,通知其他进程本事物已提交。
    在这里插入图片描述

数据一致性讨论

这里由于主库先写了 XLOG 并且已落盘,如果此时:

  1. 主库 crash ;
  2. 备库尚未收到这条 xlog,但是 promote;
  3. 主库启动,走 recovery 流程。

那么就会出现一个场景:第 3 步主库会把这条数据恢复出来,而备库 promote 后就不会有这条数据了。由于 promote 的存在,这里我们仍然认为数据是一致的(如果不 promote,该条事物终究会在备库提交)。

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

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

相关文章

微信小程序图书管理系统

目 录 摘 要 I Abstract II 目 录 V 1 绪论 1 1.1研究背景 1 1.2研究课题和意义 2 1.3研究内容和论文结构 3 2 移动网络环境下图书管理系统的现状分析 4 2.1移动网络环境下图书管理系统的特点 4 2.2当前国内外移动网络环境下图书管理系统的现状 7 2.3微信给移动网络环境下图书管…

遥感技术及高分遥感影像在地震中的应用及高分二号获取

长期以来,地震预报监测、灾害调查、灾情信息获取主要依靠实地勘测手段,其获取的数据精度和置信度虽然较高,但存在工作量大、效率低、费用高和信息不直观等缺点。遥感技术手段可在一定程度上克服传统实地勘测手段的缺点,并具有其他…

我参加第七届NVIDIA Sky Hackathon——训练ASR模型

如何从0开始训练自己的ASR模型 第一步 获取NGC密钥 第二步 配置Ubuntu22.04的运行环境 第三步 开始训练ASR模型 文章目录如何从0开始训练自己的ASR模型前言一、获取NGC密钥二、配置Ubuntu22.04的运行环境1.安装 NVIDIA 驱动 460 以上版本2.安装 docker 与 nvidia-docker23.安装…

iClient for Leaflet实现动态绘圆的几何查询

作者:ls 【目录】 背景前期准备呈现效果实现过程完整代码 【背景】 几何查询是WebGIS项目中一项比较常用的功能,SuperMap iClient 产品支持的几何对象类型众多,能够满足用户的许多需求。 近期遇到许多小伙伴反应,绘制圆形进行…

spring复习03,注解配置管理bean

spring复习03,注解配置管理bean注解的配置1.标识组件的常用注解:2.扫描组件:3.基于注解的自动装配:4.使用注解以后:基于注解自动装配的小例子1.dao层:2.service层:3.controller层:4.spring配置文件5.测试输…

Python控制程控电源

文章目录前言一、环境搭建二、使用步骤三、执行结果总结前言 本文章主要是记录汽车电子或嵌入式设备自动化测试中,部分场景需要控制被测设备的供电电源,以下就以常见的艾德克斯程控电源为例,分享如何通过Python来控制程控电源。 一、环境搭建…

Java字符串(String类)

目录 🛴一.认识String类 🛴二.String类的使用 🎄2.1构造字符串 🎄2.2字符串长度 🎄2.3String对象的比较 🎄2.4字符串查找 👜charAt方法 👜indexOf方法 👜lastI…

浅谈 Class.forName() 的用法

目录 什么是class对象 获得class对象的三种方法 class的作用和方法 Class.forName()用法 什么时候用Class.forName()? newInstance和new关键字的区别 应用问题解析 情景一:载入数据库驱动的时候 情景二:使用AIDL与电话管理Servic进行通…

[Spring Boot 5]安全管理

本文介绍了Spring Security 以及Shiro 在Spring Boot中的使用,对于Spring Security 有基于传统认证方式的Session认证,也有使用OAuth 协议的认证。一般来说,传统的Web架构中,使用Session 认证更加快速,但是&#xff0c…

2. 如何给在 SAP Business Application Studio 里开发的 OData 服务准备测试数据

在开始本步骤的学习之前,请大家务必完成前一步骤1. SAP Business Application Studio 里创建一个基于 CAP 模型的最简单的 OData 服务的学习。换言之,大家已经在 SAP Business Technology Platform 上的 Business Application Studio 里,创建好了 Dev Space,并且拥有一个能…

JVM 别和我说你还不知道这几种垃圾回收器?Serial |Parallel|ParNew|CMS|G1|ZGC

Serial / Serial Old 从单词翻译过来看 serial 串行,每次它就是一款单线程收集器。 Serial 工作在新生代垃圾回收,Serial Old在老年代进行垃圾回收,Serial Old一般作为CMS 并发收集失败后的备选回收方案。 在垃圾收集器面前,它…

《Flowable流程引擎从零到壹》引入日志框架和部署流程定义

14天学习训练营导师课程: 邓澎波《Flowable流程引擎-基础篇【2022版】》 邓澎波《Flowable流程引擎-高级篇【2022版】》 学习笔记《Flowable流程引擎从零到壹》回城传送 ❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。Java领域优质创…

目标检测算法——YOLOv5/YOLOv7改进之结合​PP-LCNet(轻量级CPU网络)

>>>深度学习Tricks&#xff0c;第一时间送达<<< 目录 ​PP-LCNet——轻量级且超强悍的CPU级骨干网络&#xff01;&#xff01; &#xff08;一&#xff09;前沿介绍 1.PP-LCNet主要模块 2.相关实验结果 &#xff08;二&#xff09;YOLOv5/YOLOv7改进之结…

GreenPlum6.x之ETL工具

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、ETL是什么&#xff1f;二、数据加载工具GPLoad1.GPLoad安装部署2.编写控制文件test.yml总结前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#…

[Flask]Flask零基础项目---登录demo

借助Flask框架实现模拟用户登录操作&#xff1b; 一步一步的来实现这个登录接口 login.py from flask import Flask, render_template,requestapp Flask(__name__, template_folderlogin)app.route(/) def hello_flask():data request.get_data()print(data)return render_…

黑白图片和黑白图片上色系统毕业设计,AI黑背图像上色系统设计与实现,AI黑白照片上色系统论文毕设作品参考

功能清单 【后台管理员功能】 系统设置&#xff1a;设置网站简介、关于我们、联系我们、加入我们、法律声明 广告管理&#xff1a;设置小程序首页轮播图广告和链接 留言列表&#xff1a;所有用户留言信息列表&#xff0c;支持删除 会员列表&#xff1a;查看所有注册会员信息&a…

电子商务交易系统的设计与实现(javaee+mysql)

目录 1 概论 1 1.1电子商务交易发展 1 1.1.1电子商务交易 1 1.1.2发展前景&#xff1a; 1 2 系统可行性及需求分析 3 2.1 系统调研 3 2.2 系统可行性分析 3 2.2.1技术可行性分析 3 2.2.2 操作可行性分析 3 2.2.3 社会可行性分析 4 2.2.4可行性分析小结 4 2.3 系统需求分析 4 2.…

Windows10添加群晖磁盘映射,总是提示用户名密码不正确解决办法

在使用群晖NAS时&#xff0c;我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过winr键&#xff0c;输入\\NAS的IP地址&#xff0c;登录设备时总是提示”用户名或密码不正确”。但是实际密码是正确的。 原因描述&#xff1a;Windows 10&#xff08;或更早版本&a…

Android如何自定义服务器DynamicMockServer的使用

在平时开发时经常需要与服务器进行联调&#xff0c;但是服务器开发往往比前端的要滞后。这时候需要我们自己去mock数据来调通流程。 今天给大家介绍一款Android上的MockServer----DynamicMockServer&#xff0c;支持接口调用&#xff0c;静态文件。 DynamicMockServer&#x…

Web 安全:PKI 扫盲

个人博客 在互联网世界&#xff0c;我们广泛采用 TLS 来保护通信安全&#xff0c;这里的安全主要包含两部分内容&#xff1a;身份鉴别、通信加密。身份鉴别是一切的基础&#xff0c;特别当发送消息比较敏感需要加密时&#xff0c;对接收方必然有一个身份“假设”&#xff0c;“…