当前位置: 首页 > news >正文

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 流复制集群。

http://www.jsqmd.com/news/367772/

相关文章:

  • Java毕设项目推荐-基于springboot的农村康养院敬老院平台的设计与实现【附源码+文档,调试定制服务】
  • 屏幕录制器-Android studio软件源代码-java语言
  • 图片编辑器-Android studio软件源代码-java语言
  • Java 面向对象, Java 继承与多态专题题单
  • 赶due救急?8款AI降AIGC工具推荐!
  • PostgreSQL:Repmgr 管理工具,流复制的简易管理方案
  • Java毕设项目推荐-基于springboot课程排课管理系统基于springboot的教师排课管理系统【附源码+文档,调试定制服务】
  • 2026年车联网整体解决方案 - 全953页下载
  • C盘文件转移到D盘,快速复制文件
  • 彻底关闭Win11更新的6大方法【图文教程】
  • Java毕设选题推荐:基于springboot的教师排课管理系统基于springboot课程排课管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 实测8款AI工具降AIGC率,赶due急救必备!
  • Java毕设选题推荐:基于springboot的农村康养院敬老院平台的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 【毕业设计】基于springboot的教师排课管理系统(源码+文档+远程调试,全bao定制等)
  • Java毕设选题推荐:基于springboot的足球俱乐部青训管理系统基于Java的足球俱乐部训练中心管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 彼得林奇的“隐形冠军“在新兴行业的识别
  • 计算机Java毕设实战-基于springboot的教师排课管理系统基于SpringBoot的学校排课管理系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 【毕业设计】基于springboot的足球俱乐部青训管理系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • Android 开发 - 子线程到主线程的通信方式(使用 Handler、使用 View 的 post 方法、使用 Activity 的 runOnUiThread 方法等)
  • 【计算机毕业设计案例】基于Java+Vue+SpringBoot足球俱乐部管理系统的设计与实现基于springboot的足球俱乐部青训管理系统的设计与实现(程序+文档+讲解+定制)
  • 【SPIE、双刊号ISSNISBN、五届稳定EI检索】第六届数字信号与计算机通信国际学术会议(DSCC 2026)
  • 云存储集成:Python 驱动企微外部群多媒体资源的自动化分发
  • 如何评估企业的垂直整合价值
  • 【计算机毕业设计案例】基于springboot的农村康养院敬老院平台的设计与实现(程序+文档+讲解+定制)
  • Android Jetpack Compose - Switch(切换)、Slider(滑块)、RangeSlider(范围滑块)
  • 【预测模型】基于深度置信网络DBN锂电池寿命预测附Matlab代码
  • 一键部署科研环境:天翼云息壤科研助手解放科研生产力
  • 为什么需要RAG?推荐一个从零搭建RAG的项目,含教学视频
  • 2026/2/10
  • 刷机过程之安装FastBoot驱动 解决fastboot waiting for any device问题