特性分析 | PostgreSQL Primary/Standby 主备流复制机制

postgresql 主备配置 阅读详情

本文首发于 2015-11-21 20:02:26

引言

PostgreSQL 在 9.0 之后引入了主备流复制机制,通过流复制,备库不断的从主库同步相应的数据,并在备库 apply 每个 WAL record,这里的流复制每次传输单位是 WAL 日志的 record 。而 PostgreSQL 9.0 之前提供的方法是主库写完一个 WAL 日志文件后,才把 WAL 日志文件传送到备库,这样的方式导致主备延迟特别大。同时,PostgreSQL 9.0 之后提供了 Hot Standby,备库在应用 WAL record 的同时也能够提供只读服务,大大提升了用户体验。

主备总体结构

PostgreSQL 主备流复制的核心部分由 walsender,walreceiver 和 startup 三个进程组成。

walsender 进程是用来发送 WAL 日志记录的,执行顺序如下:

PostgresMain()->exec_replication_command()->StartReplication()->WalSndLoop()->XLogSendPhysical()

walreceiver 进程是用来接收 WAL 日志记录的,执行顺序如下:

sigusr1_handler()->StartWalReceiver()->AuxiliaryProcessMain()->WalReceiverMain()->walrcv_receive()

startup 进程是用来 apply 日志的,执行顺序如下:

PostmasterMain()->StartupDataBase()->AuxiliaryProcessMain()->StartupProcessMain()->StartupXLOG()

walsender 和 walreceiver 进程流复制过程

walsender 和 walreceiver 交互主要分为以下几个步骤:

  1. walreceiver 启动后通过 recovery.conf 文件中的 primary_conninfo 参数信息连向主库,主库通过连接参数 replication=true 启动 walsender 进程;
  2. walreceiver 执行 identify_system 命令,获取主库 systemid/timeline/xlogpos 等信息,执行 TIMELINE_HISTORY 命令拉取 history 文件;
  3. 执行 wal_startstreaming 开始启动流复制,通过 walrcv_receive 获取 WAL 日志,期间也会回应主库发过来的心跳信息(接收位点、flush 位点、apply 位点),向主库发送 feedback 信息(最老的事务 id),避免 vacuum 删掉备库正在使用的记录;
  4. 执行 walrcv_endstreaming 结束流复制,等待 startup 进程更新 receiveStart 和 receiveStartTLI,一旦更新,进入步骤2。

walreceiver和startup进程

startup 进程进入 standby 模式和 apply 日志主要过程:

  1. 读取 pg_control 文件,找到 redo 位点;读取 recovery.conf,如果配置 standby_mode=on 则进入 standby 模式。

  2. 如果是 Hot Standby 需要初始化 clog、subtrans、事务环境等。初始化 redo 资源管理器,比如 Heap、Heap2、Database、XLOG 等。

  3. 读取 WAL record,如果 record 不存在需要调用 XLogPageRead->WaitForWALToBecomeAvailable->RequestXLogStreaming 唤醒 walreceiver从walsender 获取 WAL record。

  4. 对读取的 WAL record 进行 redo,通过 record->xl_rmid 信息,调用相应的 redo 资源管理器进行 redo 操作。比如 heap_redo 的 XLOG_HEAP_INSERT 操作,就是通过 record 的信息在 buffer page 中增加一个 record:

MemSet((char *) htup, 0, sizeof(HeapTupleHeaderData));
 /* PG73FORMAT: get bitmap [+ padding] [+ oid] + data */
 memcpy((char *) htup + offsetof(HeapTupleHeaderData, t_bits),
 	   (char *) xlrec + SizeOfHeapInsert + SizeOfHeapHeader,
 	   newlen);
 newlen += offsetof(HeapTupleHeaderData, t_bits);
 htup->t_infomask2 = xlhdr.t_infomask2;
 htup->t_infomask = xlhdr.t_infomask;
 htup->t_hoff = xlhdr.t_hoff;
 HeapTupleHeaderSetXmin(htup, record->xl_xid);
 HeapTupleHeaderSetCmin(htup, FirstCommandId);
 htup->t_ctid = xlrec->target.tid;

 offnum = PageAddItem(page, (Item) htup, newlen, offnum, true, true);
 if (offnum == InvalidOffsetNumber)
 	elog(PANIC, "heap_insert_redo: failed to add tuple");

 freespace = PageGetHeapFreeSpace(page);		/* needed to update FSM below */

 PageSetLSN(page, lsn);

 if (xlrec->flags & XLOG_HEAP_ALL_VISIBLE_CLEARED)
 	PageClearAllVisible(page);

 MarkBufferDirty(buffer);

还有部分 redo 操作(vacuum 产生的 record)需要检查在 Hot Standby模式下的查询冲突,比如某些 tuples 需要 remove,而存在正在执行的query 可能读到这些 tuples,这样就会破坏事务隔离级别。通过函数 ResolveRecoveryConflictWithSnapshot 检测冲突,如果发生冲突,那么就把这个 query 所在的进程 kill 掉。

  1. 检查一致性,如果一致了,Hot Standby 模式可以接受用户只读查询;更新共享内存中 XLogCtlData 的 apply 位点和时间线;如果恢复到时间点,时间线或者事务id需要检查是否恢复到当前目标;

  2. 回到步骤3,读取next WAL record 。

本文转自:http://mysql.taobao.org/monthly/2015/10/04/


欢迎关注我的微信公众号【数据库内核】:分享主流开源数据库和存储引擎相关技术。

标题网址
GitHubhttps://dbkernel.github.io
知乎https://www.zhihu.com/people/…
思否(SegmentFault)https://segmentfault.com/u/db…
掘金https://juejin.im/user/5e9d3e…
开源中国(oschina)https://my.oschina.net/dbkernel
博客园(cnblogs)https://www.cnblogs.com/dbkernel
四层冗余架构:RAID、DRBD、MySQL复制与PostgreSQL高可用选型实战 高可用(High Availability)本质是分层容错设计,而非单一技术堆砌。从存储层物理冗余(RAID)到块设备同步(DRBD),再到数据库服务级复制(MySQL/MariaDB主从与GTID),最终抵达原生高可用架构(PostgreSQL流复制+Patroni),每一层解决特定故障域——RAID应对磁盘损坏,DRBD覆盖主机单点失效,MySQL半同步保障事务级RPO,Patroni实现自治化故障转移。这种分层模型兼顾数据一致性、恢复时效性与运维可控性,广泛应用于金融账务、电商订单、政务云等对连续性要 阅读详情

相关推荐

PostgreSQL 12.16 架构与连接:深入解析 5 大核心进程与 C/S 模型

本文深入解析了PostgreSQL 12.16的架构与连接机制,重点介绍了其C/S模型和5大核心进程(Postmaster、Backend、Background Writer、Checkpointer和WAL Writer)的工作原理与协作方式。通过详细的配置示例和实战建议,帮助数据库管理员和开发者优化PostgreSQL性能,提升连接管理效率,确保数据一致性和系统稳定性。

weixin_30915951的博客 354

postgresql 高可用_谁说 PostgreSQL 没有靠谱的高可用(1)

最近问postgresql 那个高可用靠谱的人越来越多,其实我也试过几种postgresql 的高可用方案,而最近听到的声音是 PostgreSQL 没有靠谱的高可用方案。所以就有了这篇文字——————————————————————————————今天说的是另一种PG的高可用方案,这种方案的好的地方1 大厂支持2 配置简单靠谱,没有众多依赖包安装后,还出问题让你有想自杀的意愿,或者是相...

weixin_39631295的博客 327

Ubuntu 12.04 + PostgreSQL 9.3 主从复制实战指南

主从复制是数据库高可用架构的核心基础机制,其本质依赖于WAL(Write-Ahead Logging)日志的归档与重放原理。在资源受限或强兼容性要求的老旧系统中,如Ubuntu 12.04搭配PostgreSQL 9.3,无法使用现代工具链(如Patroni、pg_basebackup流式备份),必须回归底层WAL归档、rsync同步、recovery.conf配置等原始技术路径。这种实践不仅保障工业控制、金融终端等关键场景的数据零丢失,更深度揭示了物理复制的运行骨架——从archive_command执行

367

PostgreSQL 数据库的 primary、standby 架设

Standby技术基于PostgreSQL的预写入日志(wal)同步机制,建立服务器级别的数据同步节点。 在以前的版本中,我们通常使用PostgreSQL的配置项 archive_cmmand将 wal 存档于一个指定的路径, standby使用recovery 配置项 re

My life 2892

Azure PostgreSQL托管服务选型与高可用实战指南

PostgreSQL作为企业级开源关系数据库,其云上落地面临运维复杂、弹性模糊、安全合规等共性挑战。Azure Database for PostgreSQL通过Single Server、Flexible Server和Hyperscale(Citus)三类部署模型,分别对应轻量验证、生产可控与分布式扩展三大技术范式。其核心价值在于将数据库能力与基础设施解耦,以托管方式提供SLA保障的高可用、细粒度网络隔离、默认加密及AD集成等企业就绪特性。本文聚焦真实迁移项目中的架构决策逻辑,深入解析不同场景下部署模型

liudaoru - 悟 394

PostgreSQL流复制与pgpool-II高可用故障切换避坑

数据库高可用通常围绕主从复制、日志传输与故障切换展开。PostgreSQL流复制的核心不是拷贝数据页,而是主库通过walsender发送WAL,备库walreceiver接收后由startup进程持续重放,LSN用于精确衡量复制延迟;同步复制会等待备库落盘确认,异步复制则存在极小丢数据窗口。pgpool-II在此之上提供连接池、读写分离、健康检查与故障切换能力,可缓解PostgreSQL进程模型的连接压力,并通过watchdog与VIP提升切换可用性。对于读多写少、连接数高、要求秒级切换的业务,这类组合有现

weixin_32325225的博客 208

postgresql数据库primary key约束/not null约束/unique约束及default值的添加与删除、列的新增/删除/重命名/数据类型的更改...

如果在建表时没有加primary key约束、not null约束、unique约束、default值,而是创建完表之后在某个字段添加的话 1.primary key约束的添加与删除 给red_packet_refund表id字段添加primary key约束: alter tablered_packet_refundadd constraint pk_rpr_id primary ke...

weixin_33892359的博客 1458

2025年三级等保新规实战:从零开始搭建企业安全防护体系(附完整配置清单)

本文详细解析2025年三级等保新规的核心变化,提供从零开始搭建企业安全防护体系的实战指南。重点介绍动态防护能力、实战化攻防验证和全链路数据保护等关键要求,并附完整配置清单,帮助企业高效合规。

weixin_30836759的博客 469

postgresql Primary keys

一个表里面只能存在一个主键,但是可以有多个外键。在pg中建议每个表...

weixin_33964094的博客 2594

Ubuntu安装ToDesk远程控制软件

前几天有同学问我怎么在 Ubuntu 系统上安装 ToDesk 远程控制软件, 帮他安装完成后就 顺手整理了一下安装过程,所以就顺手有了这篇在 Ubuntu 系统上安装 todesk 的文章。

小白的博客 8660

ads传统功放设计笔记(3)

传统功放设计的流程一般包括以下这些步骤: 1、明确设计目标 2、选择功放管子 3、确定静态工作点 4、设计偏置电路 5、判断稳定性 6、负载与源牵引 7、输入输出阻抗匹配 8、原理图优化 9、大信号仿真 10、版图设计 11、版图联合仿真 12、pcb设计 第二节我们设计仿真了功放的原理图。之后我们需要对版图进行设计和仿真。 10、版图设计 首先将S参数控件都打叉,还要去掉电源、源负载阻抗、地、芯片、电容。在原先电容和芯片的位置加上gap,设置好长度和间隔。之后在电源引脚、输入输出引脚和隔离的两端加上端口。

qq_40995480的博客 6029

PGroonga分布式部署:构建高可用PostgreSQL搜索集群

PGroonga作为PostgreSQL的扩展,将Groonga的强大搜索能力与PostgreSQL的可靠性相结合,为多语言全文搜索提供了高效解决方案。在企业级应用中,构建高可用的分布式搜索集群是保障业务连续性的关键。本文将详细介绍如何通过流复制和PGroonga特有工具实现这一目标。 ## 核心概念:PostgreSQL流复制与PGroonga集成 PostgreSQL的流复制(Stream

gitblog_00563的博客 806

Benchmark系列——基本概念和分类

本文主要介绍了Benchmark的基本概念和分类情况。

Bluetangos的博客 8444

Patroni Standby Cluster 跨数据中心级联复制完全指南:架构、配置与实战要点

Standby cluster(备集群)是 Patroni 提供的一项跨数据中心(region)级联复制能力:在远端机房部署一个"standby leader",让它从主集群复制 WAL,再由本地的级联副本(cascade replicas)跟随它,从而在完全不共享 DCS 的前提下实现异地灾备。读完本文,你将掌握 standby cluster 的架构与选举机制、`standby_cluster

gitblog_00220的博客 365

Pixel 6 Pro升级Android 13变砖急救指南:Fastboot全分区修复实战

本文提供Pixel 6 Pro升级Android 13变砖后的Fastboot全分区修复实战指南,详细解析变砖原因、必备工具准备、Fastboot模式解锁、全分区擦除操作及手动刷入官方ROM的完整流程,帮助用户高效解决设备变砖问题。

weixin_28693447的博客 485

等保测评-达梦数据库

一般适用于等保测评

m0_54146694的博客 1300

3个关键验证维度:如何通过Patroni构建可靠的PostgreSQL灾备演练体系

在分布式数据库架构中,灾备演练不仅是合规要求,更是保障业务连续性的核心技术实践。Patroni作为PostgreSQL高可用解决方案,提供了完整的灾备恢复机制,但只有通过系统化的演练验证,才能确保这些机制在真实灾难场景下真正发挥作用。本文将深入探讨如何构建基于Patroni的灾备演练体系,从理论框架到实操验证,为技术决策者和运维工程师提供可落地的灾备演练方案。 ## 灾备演练的理论框架:理解Pa

gitblog_01159的博客 421

InVEST模型 | HAbitat quality模块计算生境质量

 本文详细介绍使用InVEST模型中HAbitat quality模块计算生境质量,包含各个参数的含义、所需数据、数据处理以及需要各个参数注意的地方等过程。

地理空间科学的博客 1万+

PostgreSQL高可用架构设计与故障转移技术实现

PostgreSQL高可用架构设计是企业级数据库部署的核心需求,通过合理的故障转移技术实现可以确保99.99%以上的业务连续性。本文深入探讨PostgreSQL高可用解决方案的技术选型、部署配置和性能优化策略,为中级技术人员提供实用的实战指南。 ## 技术架构概述 PostgreSQL高可用架构的核心在于构建冗余的数据库节点集群,通过复制机制确保数据一致性,并实现自动故障检测与切换。现代Pos

gitblog_01055的博客 756

基于STM32L4XX、HAL库的MP2672GD-0000-Z充电芯片驱动程序设计

CHG_STAT_GPIO_Port, CHG_STAT_Pin, // 这些宏应由 CubeMX 生成在 main.h。

zhusl6688的博客 497

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数据库PostrageSQL-后备服务器设置

27.3. 后备服务器设置 standby_mode (boolean) 指定是否将PostgreSQL服务器作为一个后备服务器启动。如果这个参数为on,当到达已归档 WAL 末尾时该服务器将不会停止恢复,但是将通过使用restore_command获得新的WAL 段以及/或者通过使用primary_conninfo设置连接到主服务器来尝试继续恢复。 primary_conninfo (string) 指定后备服务器用来连接主服务器的连接字符串。这个字符串的格式在Section 34.1.1中描述。如果在

逍遥云恋 624

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

技术深度解析:Patroni在PostgreSQL高可用场景下的架构演进与实践

在分布式数据库架构日益复杂的今天,企业级PostgreSQL集群的高可用性已成为业务连续性的核心保障。Patroni作为PostgreSQL的高可用解决方案,通过集成分布式配置存储(DCS)和自动化故障转移机制,为大规模生产环境提供了可靠的HA保障。本文将从架构演进、多数据中心部署、故障恢复机制三个维度,深入剖析Patroni在实际生产环境中的技术实现与最佳实践。 ## 微服务架构下的分布式协调

gitblog_00482的博客 457

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Patroni 迁移与升级实战:将独立 PostgreSQL 转化为 Patroni 集群并完成大版本升级

本指南以 [docs/existing_data.rst](https://link.gitcode.com/i/8b9a7b19ac4dd668b2af18c771d2ff1a) 为骨架,系统讲解两条 Patroni 生命周期中最关键的两条运维路径:一是将一台(或多台)已有 PostgreSQL 独立实例平滑纳入 Patroni 管理,二是对已由 Patroni 管理的集群执行 PostgreS

gitblog_00074的博客 599

19.6. Replication

19.6同步复制 这些设置影响内置的流复制特性(参见第26.2.5节)。数据库服务或为主节点,或为备节点。主节点发送数据,备节点接收并应用数据。若使用级联复制(参见第26.2.7节),备节点既可做主节点也可做备节点。 19.6.1数据发送服务 以下参数可用于发送数据到备端的服务,即主节点。 max_wal_senders(integer) 备节点最大并行连接数。默认为10。若为0则禁用同步。 max_replication_slots(integer) 指定支持的最大复制槽...

在路上 384

Patroni YAML 配置完全指南:从全局参数到 PostgreSQL 高可用集群的每一项配置详解

本文以 Patroni 官方 [YAML 配置文档](https://link.gitcode.com/i/c71629eaba7643a0bd5e1c1561631599) 为骨架,系统梳理 Patroni 配置文件中的全部核心参数:全局与日志、bootstrap 初始化、各 DCS(Consul/Etcd/Etcdv3/ZooKeeper/Exhibitor/Kubernetes/Raft)、

gitblog_01126的博客 981

如何科学评测 C2C?unified_evaluator 多基准统一评测框架完整使用教程

C2C(Cache-to-Cache)让大语言模型通过 KV-Cache 直接进行语义通信,实现"免文本"的模型协作。要验证这套机制是否真的有效,靠单一看板远远不够——你需要一套能同时跑多个基准、多卡并行、且输出可追溯的统一评测框架。本文带你从零掌握 C2C 官方评测工具 unified_evaluator:10 个基准数据集、generate 与 logits 双答题模式、多 GPU 并行、结构

gitblog_00367的博客 428
上一篇: 特性介绍 | PostgreSQL 的依赖约束详解 - 系统表 pg_depend & pg_constraint
下一篇: 实用工具 | PostgreSQL 数据库压力测试工具 pgbench 使用示例
dbkernel
博客等级 码龄4年 60粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值