news 2026/6/10 21:20:50

PostgreSQL:详解如何搭建流复制集群

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PostgreSQL:详解如何搭建流复制集群

文章目录

    • 一、前置知识
      • 1.1 流复制原理
      • 1.2 架构说明
    • 二、环境准备
      • 2.1 系统要求
      • 2.2 节点信息示例
    • 三、安装 PostgreSQL
    • 四、配置主节点(Primary)
      • 4.1 修改 postgresql.conf
      • 4.2 配置 pg_hba.conf
      • 4.3 创建复制用户
      • 4.4 重启主库
    • 五、配置备节点(Standby)
      • 5.1 清理原有数据目录(如有)
      • 5.2 使用 pg_basebackup 初始化备库
      • 5.3 验证生成的文件
      • 5.4 启动备库
    • 六、验证流复制状态
      • 6.1 在主库查看复制状态
      • 6.2 在备库查看是否只读
      • 6.3 检查延迟
    • 七、高级配置(可选)
      • 7.1 使用复制槽(Replication Slot)
      • 7.2 同步复制
      • 7.3 归档与 PITR(时间点恢复)
    • 八、故障处理与切换
      • 8.1 主库宕机:手动提升备库
      • 8.2 原主库恢复后重新加入(作为新备库)
    • 九、监控与维护

搭建 PostgreSQL 流复制(Streaming Replication)集群是实现高可用、读写分离和灾难恢复的关键技术之一。流复制基于主从架构,主节点(Primary)将 WAL(Write-Ahead Logging)日志实时传输到一个或多个备节点(Standby),备节点重放这些日志以保持与主节点的数据同步。


一、前置知识

1.1 流复制原理

  • PostgreSQL 使用 WAL 日志记录所有数据变更。
  • 主库将 WAL 日志通过网络实时发送给备库(物理复制)。
  • 备库以只读模式运行,可提供查询服务(Hot Standby)。
  • 支持同步复制(synchronous_commit = on)和异步复制(默认)。

1.2 架构说明

  • 主节点(Primary):接受写操作,生成 WAL。
  • 备节点(Standby):接收并应用 WAL,只读。
  • 可扩展为一主多从架构。
  • 配合 pg_rewind、repmgr 或 Patroni 可实现自动故障切换(本篇聚焦基础流复制,不涉及 HA 工具)。

二、环境准备

2.1 系统要求

  • 操作系统:Linux(如 CentOS 7/8、Ubuntu 20.04+)
  • PostgreSQL 版本:建议 12+(本文以 14 为例)
  • 主备节点时间同步(NTP)
  • 主备节点网络互通(开放 PostgreSQL 端口,默认 5432)

2.2 节点信息示例

角色主机名IP 地址数据目录
Primarypg-primary192.168.1.10/var/lib/pgsql/14/data
- Standbypg-standby192.168.1.11/var/lib/pgsql/14/data

注意:主备节点 PostgreSQL 版本必须一致。


三、安装 PostgreSQL

在主备节点上分别安装相同版本的 PostgreSQL。

以 CentOS 为例:

# 添加官方仓库sudoyuminstall-y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装 PostgreSQL 14sudoyuminstall-y postgresql14-server postgresql14-contrib# 初始化数据库(仅在主节点执行一次)sudo/usr/pgsql-14/bin/postgresql-14-setup initdb

Ubuntu 用户可使用 apt 安装,流程类似。


四、配置主节点(Primary)

4.1 修改 postgresql.conf

编辑/var/lib/pgsql/14/data/postgresql.conf

# 监听地址(允许远程连接) listen_addresses = '*' # WAL 相关设置 wal_level = replica # 必须为 replica 或 logical max_wal_senders = 10 # 允许的最大 WAL 发送进程数 wal_keep_size = 1GB # 保留的 WAL 文件大小(PostgreSQL 13+) # 对于旧版本(<13),使用 wal_keep_segments = 32 # 启用 Hot Standby 支持(虽在主库设置,但影响备库行为) hot_standby = on # 可选:启用同步复制(需配合 synchronous_standby_names) # synchronous_commit = on # synchronous_standby_names = 'pg-standby'

4.2 配置 pg_hba.conf

编辑/var/lib/pgsql/14/data/pg_hba.conf,添加复制用户访问权限:

# TYPE DATABASE USER ADDRESS METHOD host replication repuser 192.168.1.11/32 md5 host all all 0.0.0.0/0 md5 # 根据安全策略调整

replication是一个虚拟数据库名,专用于流复制连接。

4.3 创建复制用户

登录主库,创建专用复制用户:

CREATEUSERrepuserWITHREPLICATIONENCRYPTED PASSWORD'StrongPass123!';

4.4 重启主库

sudosystemctl restart postgresql-14

验证监听状态:

ss -tulnp|grep5432

五、配置备节点(Standby)

5.1 清理原有数据目录(如有)

sudosystemctl stop postgresql-14sudorm-rf /var/lib/pgsql/14/data/*

5.2 使用 pg_basebackup 初始化备库

从主库拉取基础备份:

sudo-u postgres pg_basebackup\-h192.168.1.10\-U repuser\-D /var/lib/pgsql/14/data\-P\-v\-R\-X stream\-C\-S standby_slot_1

参数说明:

  • -h:主库 IP
  • -U:复制用户
  • -D:目标数据目录
  • -P:显示进度
  • -v:详细输出
  • -R:自动生成 recovery.conf(PG 12+ 会生成 standby.signal 和 postgresql.auto.conf)
  • -X stream:以流方式传输 WAL
  • -C:在主库创建复制槽(replication slot)
  • -S:指定复制槽名称(可选)

注意:PostgreSQL 12 起不再使用recovery.conf,而是使用standby.signal文件和postgresql.auto.conf中的primary_conninfo

5.3 验证生成的文件

执行后,应看到:

  • /var/lib/pgsql/14/data/standby.signal(空文件,标识为备库)
  • postgresql.auto.conf中包含primary_conninfo = '...'

若未自动生成,可手动创建:

# 创建 standby.signalsudo-u postgrestouch/var/lib/pgsql/14/data/standby.signal# 编辑 postgresql.auto.conf(或直接在 postgresql.conf 中添加)primary_conninfo='host=192.168.1.10 port=5432 user=repuser password=StrongPass123! application_name=pg-standby'

5.4 启动备库

sudosystemctl start postgresql-14

六、验证流复制状态

6.1 在主库查看复制状态

SELECT*FROMpg_stat_replication;

关键字段:

  • application_name:应为pg-standby
  • state:应为streaming
  • sync_state:异步为async,同步为sync

6.2 在备库查看是否只读

SHOWhot_standby;-- 应为 onSELECTpg_is_in_recovery();-- 应返回 true

尝试写入应报错:

INSERTINTOtestVALUES(1);-- ERROR: cannot execute INSERT in a read-only transaction

6.3 检查延迟

主库执行:

SELECTapplication_name,pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn)ASbytes_lagFROMpg_stat_replication;

bytes_lag接近 0,说明同步良好。


七、高级配置(可选)

7.1 使用复制槽(Replication Slot)

复制槽可防止主库过早清理 WAL,避免备库因断连导致无法追平。

已在pg_basebackup -C -S中创建。也可手动创建:

-- 在主库执行SELECT*FROMpg_create_physical_replication_slot('standby_slot_1');

并在备库primary_conninfo中添加:

primary_conninfo = '... slot=standby_slot_1'

7.2 同步复制

若需强一致性,配置同步复制:

主库postgresql.conf

synchronous_commit = on synchronous_standby_names = 'FIRST 1 (pg-standby)'

重启主库。此时主库事务需等待至少一个同步备库确认后才提交。

7.3 归档与 PITR(时间点恢复)

可结合 WAL 归档实现更完整的备份策略:

# postgresql.conf archive_mode = on archive_command = 'cp %p /path/to/archive/%f'

八、故障处理与切换

8.1 主库宕机:手动提升备库

在备库执行:

sudo-u postgres pg_ctl promote -D /var/lib/pgsql/14/data

或创建promote.trigger文件(PG 12+):

sudo-u postgrestouch/var/lib/pgsql/14/data/promote.trigger

备库将变为新主库。

8.2 原主库恢复后重新加入(作为新备库)

原主库需重建数据目录(或使用 pg_rewind):

# 停止原主库sudosystemctl stop postgresql-14# 使用 pg_rewind(需在原主库配置中启用 wal_log_hints=on 或 data checksums)pg_rewind\--target-pgdata=/var/lib/pgsql/14/data\--source-server='host=192.168.1.11 port=5432 user=repuser password=StrongPass123!'# 清理旧配置,创建 standby.signalrm-f /var/lib/pgsql/14/data/postmaster.pidtouch/var/lib/pgsql/14/data/standby.signal# 启动sudosystemctl start postgresql-14

若未启用 checksums 或 wal_log_hints,则只能通过pg_basebackup重新初始化。


九、监控与维护

  • 定期检查pg_stat_replication延迟
  • 监控磁盘空间(WAL 积累可能导致主库磁盘满)
  • 使用pg_controldata查看数据库状态
  • 设置日志归档和定期逻辑备份(pg_dump)

总结:PostgreSQL 流复制搭建核心步骤:

  1. 主库配置 WAL 和复制权限;
  2. 创建复制用户;
  3. 使用pg_basebackup初始化备库;
  4. 启动备库并验证同步状态。

虽然流复制本身不提供自动故障转移,但它是构建高可用架构的基础。生产环境中建议结合 Patroni + etcd/ZooKeeper 或 repmgr 实现自动化管理。


注意事项:

  • 主备 OS、PostgreSQL 版本、编译选项必须一致;
  • 时间必须同步(NTP);
  • 网络稳定性和带宽影响复制性能;
  • 避免在备库执行 DDL(即使只读,某些操作可能阻塞 WAL 应用)。

通过以上步骤,即可成功搭建一个稳定可靠的 PostgreSQL 流复制集群。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:59:06

【预测模型】基于深度置信网络DBN锂电池寿命预测附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…

作者头像 李华
网站建设 2026/6/10 13:59:32

CAN FD总线协议深度解析:技术特点与应用优势

&#x1f4e1; 核心背景与协议演进技术背景经典CAN局限&#xff1a;CAN 2.0A/2.0B协议&#xff08;1Mbps传输速率、8字节数据位宽&#xff09;已无法满足现代汽车电子系统对通信数据量和实时性的需求。协议推出&#xff1a;2012年由博世公司推出CAN FD&#xff08;Controller A…

作者头像 李华
网站建设 2026/6/10 13:56:37

刷机过程之安装FastBoot驱动 解决fastboot waiting for any device问题

安装google的usb devices驱动即可 下载地址:https://developer.android.com/studio/run/win-usb?hl=zh-cn 安装教程:https://zhuanlan.zhihu.com/p/366904302 核心步骤 设备管理器 其他设备 -> 感叹号设备 -> 右键 -> 更新驱动程序 -> 浏览我的计算机以查找驱动…

作者头像 李华
网站建设 2026/6/10 13:59:23

计算机毕业设计springboot高校学业导师工作管理系统 基于微服务架构的大学生学业指导与师生互动平台 高校本科生导师制数字化管理与学业辅导系统

计算机毕业设计springboot高校学业导师工作管理系统h22i2693 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。在高等教育内涵式发展的背景下&#xff0c;学业导师制度已成为高校落…

作者头像 李华
网站建设 2026/6/10 13:55:30

ADC 中的抗体:核心性能要求、功能机制与片段优化方向

抗体作为抗体偶联药物&#xff08;ADC&#xff09;的 “靶向导航核心”&#xff0c;其性能直接决定 ADC 的肿瘤靶向精度、富集效率与治疗安全性。优质的 ADC 抗体需满足高亲和力、高特异性等核心要求&#xff0c;同时通过功能机制介导肿瘤细胞内吞与载荷释放&#xff1b;而原生…

作者头像 李华