postgres数据库的流复制

1. 流复制和逻辑复制的差异

  • 逻辑复制和流复制最直观的不同是,逻辑复制支持表级别复制
  • 区分点事原理不同
    • 逻辑日志是在wal日志产生的数据库上,由逻辑解析模块对wal日志进行初步的解析,解析结果是ReorderBufferChange(理解为HeapTupleData),再由pgoutput plugin对中间结果进行过滤和消息化拼接,然后将其发送到订阅端,订阅端根据接受到的Heap TupleData重新对其执行insert、delete、udpate操作
    • 流复制时将数据从walrecord拷贝到数据页,
    • 逻辑复制时将数据重新执行一次insert、update或delete

2. 流复制

  • 流复制面对未提交的事务,事务没有提交也会同步到备机,当主库进行提交和回滚的时候,也会同步进行提交和回滚。对大事务相对友好
  • 流复制会导致备机也会产生大量死元祖,需要做vacuum
  • 流复制时将wal日志中记录的内容按照确切的块地址逐字节的拷贝到备库,因此主备之间数据分布是一样的,意味着主备机器上,同一条记录的ctid是相同的

3. 流复制的实现原理

  • 后端进程通过执行XLogInsert和XLogFlush函数,将wal数据写入并刷新到WAL段文件中
  • walsender进程将写入wal段的wal数据发送给walreveiver进程
  • 发送wal数据后,后端进程继续等待备用服务器的ACK响应。更准确的说,后端进行通过执行内部函数SyncRepWaitForLSN获得一个latch,并等待他被释放
  • 备用服务器上的walreveiver将接受到的wal数据写入备用的wal段中,使用write系统调用,并向walsender返回一次ACK响应
  • walreveiver使用如fsync等系统调用将wal数据刷新到wal段,向walsender返回另一个ACK响应,并通知启动进程关于wal数据的刷新
  • startup进程回访已写入wal段的wal数据
  • 当walsender收到walreveiver的ack响应时,释放后端进程的latch,然后后端进程的提交或中止操作将完成。latch释放的时机取决于参数synchronous_commit,如果设置为on,当收到步骤5的ACK时释放latch,如果设置为remote_wirte,则在收到步骤3的ACK时释放latch

ACK的包括内容

  • 写入最新wal数据的lsn位置
  • 刷新最新wal数据的lsn位置
  • 在启动过程中回放最新wal数据的lsn位置
  • 发送此响应的时间戳

过程分析

  • 主库的进程进行写操作
  • 产生WAL record
  • walsender感知到新的wal,发送给备库
  • 备库接受,写盘再回放

是否发送wal日志与主库事务的提交与否没有关系,但主库是否能提交取决于备库的wal日志写入位置,默认是on的话需要落盘,备库实时回放

注意点

  • 流复制就是借助latch实现主从进程间的协作
  • 流复制场景下,只读事务、子事务的提交以及事务回滚,无需等待备库的ACK

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

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

相关文章

SpringBoot整合拦截器和日期转换器

一、SpringBoot整合拦截器 1.添加拦截器 package com.by.interceptor;import com.by.pojo.User; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import java…

BaseMapper 接口介绍

基于 mybatis-mapper/provider 核心部分实现的基础的增删改查操作,提供了一个核心的 io.mybatis.mapper.BaseMapper 接口和一个 预定义 的 io.mybatis.mapper.Mapper 接口,BaseMapper 接口定义如下: /*** 基础 Mapper 方法,可以在…

React useImperativeHandle Hook

useImperativeHandle Hook 是一个比较比较简单的 hook,为 ref 节点添加一些处理方法,下面是来自官网例子,为 ref 添加了两个方法。 import { forwardRef, useRef, useImperativeHandle } from react;const MyInput forwardRef(function MyI…

香港办公室顺利落地,量子之歌发布白皮书开启银发新篇章

6月25日,量子之歌香港办公室开业典礼暨《2023年中国中老年服务市场白皮书:银发经济,耀眼的黄金赛道》发布会于香港中环交易广场隆重开幕。 这一里程碑事件不仅彰显了量子之歌在银发经济领域的行业领军者风范,更凸显了其在专业服务…

一文了解自定义表单系统开源的多个优势

降本、提质、增效,是当前很多企业都想实现的目的。什么样的软件可以助力企业创造价值?低代码技术平台是近些年得到了很多客户喜爱的平台产品,因为它能帮助大家减少编程代码的撰写,能轻松助力各部门之间做好协调沟通工作&#xff0…

算法导论 总结索引 | 第四部分 第十六章:贪心算法

1、求解最优化问题的算法 通常需要经过一系列的步骤,在每个步骤都面临多种选择。对于许多最优化问题,使用动态规划算法求最优解有些杀鸡用牛刀了,可以使用更简单、更高效的算法 贪心算法(greedy algorithm)就是这样的算…

13.1 Go 反射(Reflection)

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

文本生成图像综述

本调查回顾了扩散模型在生成任务中广泛流行的背景下文本到图像的扩散模型。作为一份自成一体的作品,本调查首先简要介绍了基本扩散模型如何用于图像合成,然后介绍了条件或指导如何改善学习。基于这一点,我们介绍了文本到图像生成方面的最新方…

条码二维码读取设备在医疗设备自助服务的重要性

医疗数字信息化建设的深入推进,医疗设备自助服务系统已成为医疗服务领域的一大趋势,条码二维码读取设备作为自助设备的重要组成部分,通过快速、准确地读取条形码二维码信息,不公提升了医疗服务效率,还为患者提供了更加…

Flutter页面状态保留策略

目的: 防止每次点击底部按钮都进行一次页面渲染和网络请求 1. 使用IndexedStack 简单,只需要把被渲染的组件外部套一层IndexedStack即可 缺点: 在应用启动的时候,所有需要保存状态的页面都会直接被渲染,保存起来. 对性能有影响 2. 使用PageController 实现较为复杂,但是不用…

Biome-BGC生态系统模型与Python融合技术

Biome-BGC是利用站点描述数据、气象数据和植被生理生态参数,模拟日尺度碳、水和氮通量的有效模型,其研究的空间尺度可以从点尺度扩展到陆地生态系统。 在Biome-BGC模型中,对于碳的生物量积累,采用光合酶促反应机理模型计算出每天…

C++设计模式——Facade外观模式

一,外观模式简介 外观模式是一种结构型设计模式, 又称为门面模式,也是一种基于创建对象来实现的模式,为子系统中的各组接口的使用提供了统一的访问入口。 外观模式对外提供了一个对象,让外部客户端(Client)对子系统的…

dataguard 主备切换方式switchover 和 failover 操作步骤

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG数据库运维(如安装迁移,性能优化、故障应急处理等) 公众号:老苏畅谈运维 欢迎关注本人公众号,更多精彩与您分享。datagu…

【ATU Book - i.MX8系列 - OS】NXP i.MX Linux Desktop (Ubuntu) BSP 开发环境架设

一、概述 谈论嵌入式系统的开发环境,不得不提起近年来相当实用的 Yocto 建构工具。此工具拥有极为灵活的平台扩展性,广泛的软体套件与社群支持、多平台支援整合性,能够满足开发者特定需求和多种热门的嵌入式系统架设,已成为当今顶…

【深海王国】小学生都能玩的单片机?零基础入门单片机Arduino带你打开嵌入式的大门!(10)

Hi٩(๑o๑)۶, 各位深海王国的同志们,早上下午晚上凌晨好呀~辛勤工作的你今天也辛苦啦 (o゜▽゜)o☆ 今天大都督继续为大家带来系列——小学生都能玩的单片机!带你一周内快速走进嵌入式的大门,let’s go! (10&#…

Java学习笔记(多线程):CompetableFuture

本文是自己的学习笔记,主要参考资料如下 https://www.cnblogs.com/dolphin0520/p/3920407.html JavaSE文档 https://blog.csdn.net/ThinkWon/article/details/102508721 1、Overview2、重要参数3、主要方法3.1、创建实例,获取返回值3.2、线程执行顺序相关…

三十九篇:UML与SysML:掌握现代软件和系统架构的关键

UML与SysML:掌握现代软件和系统架构的关键 1. 引言 1.1 为什么系统设计如此关键 在当今快速发展的技术环境中,系统设计的重要性不言而喻。无论是软件开发还是复杂的系统工程,良好的设计是确保项目成功的基石。系统设计不仅关系到功能的实现…

day38动态规划part01| 理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

**理论基础 ** 无论大家之前对动态规划学到什么程度,一定要先看 我讲的 动态规划理论基础。 如果没做过动态规划的题目,看我讲的理论基础,会有感觉 是不是简单题想复杂了? 其实并没有,我讲的理论基础内容,…

状态压缩动态规划(State Compression DP)算法详解

状态压缩动态规划(State Compression DP)是一种高效解决组合优化问题的技术,特别适用于那些状态空间较大且可以用二进制表示的情况。本文将详细讲解状态压缩DP的原理、常用的位运算技巧、以及具体的例题分析。 原理概述 状态压缩DP的核心思…

HTML5实现字母记忆配对游戏

HTML5实现字母记忆配对游戏 这个小游戏具有重新开始功能和难度设置功能。 “重新开始“按钮,点击它或完成一局游戏后,会自动开始新游戏。 下拉列表框,,难度设置,包含简单、中等和困难三个选项。 简单:8…