PostgreSQL 18 中文参考文档(未翻译部分保留英文)🌐 切换到英文原版 →

26.2. 基于日志送达的备用服务器 #

26.2.1. 备用服务器规划
26.2.2. 准备主服务器
26.2.3. 配置备用服务器
26.2.4. 备用服务器运行模式
26.2.5. 流复制与复制槽
26.2.6. 物理复制槽
26.2.7. 级联复制
26.2.8. 同步复制
26.2.9. 备用服务器上的持续归档

通过持续将主库产生的 WAL 日志文件或数据流送达至备用服务器,能够构建随时准备接管主库的高可用集群。根据备库是否接纳只读连接,分别称为暖备(Warm Standby,仅同步日志不接纳外部查询连接)与热备(Hot Standby,在同步回放日志的同时对外提供只读查询能力)。

26.2.1. 备用服务器规划 #

在部署热备节点之前,需根据业务 RPO 与 RTO 要求规划硬件规格、网络带宽以及存储容量。

26.2.2. 准备主服务器 #

在主服务器上,需确保 wal_level 至少设置为 replica,且 max_wal_senders 足够满足所有并发流复制连接的需求。

26.2.3. 配置备用服务器 #

通过在备库数据目录根目录下创建特殊的 standby.signal 标记文件,并设置 primary_conninfo,即可指示系统在启动时以备用节点模式运行并持续拉取 WAL。

26.2.4. 备用服务器运行模式 #

当数据库在启动时检测到数据目录根目录下存在 standby.signal 标识文件时,实例会自动进入备用恢复模式。

在备用模式下,实例会首先通过 restore_command 从归档池中拉取 WAL 执行回放;当归档日志读取完毕后,若配置了网络流复制参数 primary_conninfo,备库会自动向主库建立 TCP 连接并开启实时物理流复制。

26.2.5. 流复制与复制槽 #

流复制(Streaming Replication)以极其微小的毫秒级延迟向备库推送增量变更。

为了防止主库因为执行检查点而过早删除或回收备库尚未完全同步的旧 WAL 日志段,必须在主库上创建专用的复制槽(Replication Slots):

SELECT pg_create_physical_replication_slot('standby_1');

并在备库的 postgresql.conf 中配置:

primary_conninfo = 'host=primary_host port=5432 user=replicator password=secret'
primary_slot_name = 'standby_1'

复制槽会强制锁定主库的日志保留进度,确保即便在网络中断数小时后,备库重连时依然能够无缝续传。

26.2.5.1. 流复制客户端身份认证 #

备库连接主库拉取 WAL 时需通过流复制协议建立网络通道。必须在主库的 pg_hba.conf 中配置类型为 replication 的连接规则,并为复制角色赋予 REPLICATION 属性。

26.2.5.2. 流复制监控 #

在主库上可以通过查询 pg_stat_replication 系统视图实时监控各备库的接收、写入与回放 LSN 进度及网络延迟。

26.2.6. 物理复制槽 #

物理复制槽能够可靠防止主库提前清理备库尚未接收的 WAL 段文件。

26.2.6.1. 复制槽管理 #

物理复制槽可以通过函数 pg_create_physical_replication_slot() 创建,并通过 pg_drop_replication_slot() 销毁。

26.2.6.2. 复制槽配置 #

在备库上通过设置 primary_slot_name 绑定主库上的物理复制槽。

26.2.7. 级联复制 #

级联复制允许备用服务器直接从另一个备用服务器拉取 WAL 数据流,从而减轻主服务器的网络带宽开销,非常适合构建跨地域只读副本集群。

26.2.8. 同步复制 #

通过配置参数 synchronous_commit 与 synchronous_standby_names,能够将流复制升级为强一致性同步模式。在同步模式下,主库必须等待至少指定数量的同步备库应答确认已将 WAL 写入磁盘后,才向业务客户端返回事务提交成功,实现 RPO=0 的零数据丢失强容灾。

26.2.8.1. 配置同步复制 #

在主库上设置 synchronous_standby_names 参数可声明一个或多个同步备库节点。

26.2.8.2. 多同步备库管理 #

支持指定 FIRST num (...) 或 ANY num (...) 语法,实现 N 选 K 仲裁提交策略。

26.2.8.3. 性能考量 #

同步复制保证零 RPO 数据强一致,但每次提交均需等待网络往返(RTT),吞吐量受网络时延影响显著。

26.2.8.4. 高可用考量 #

若同步备库发生网络孤岛或宕机,主库的写入事务将被阻塞等待,需合理规划容灾切换策略。

26.2.9. 备用服务器上的持续归档 #

备库同样可以通过启用 archive_mode(设为 always)执行 WAL 归档,从而卸载主库的归档 I/O 负担。