流复制、逻辑复制与高可用

PostgreSQL 的高可用建立在 WAL(Write-Ahead Log) 之上。按复制粒度分为物理复制逻辑复制

WAL 回顾

所有修改先写 WAL 再改数据页,这带来三个能力:

  1. 崩溃恢复:重放 WAL 恢复到一致状态。
  2. 物理复制:把 WAL 原样传输到备库。
  3. 时间点恢复 PITR:基于基础备份 + WAL 归档恢复到任意时刻。

物理流复制

主库持续把 WAL 推送给备库,备库原样重放,得到字节级一致的副本(适合只读扩展与故障切换)。

wal_level = replica
max_wal_senders = 10
wal_keep_size = 1GB
# 允许备库复制连接
host replication repl 10.0.0.0/24 scram-sha-256
# 用 pg_basebackup 拉取基础备份
pg_basebackup -h 10.0.0.1 -U repl -D /var/lib/postgresql/data \
  -Fp -Xs -P -R     # -R 自动生成 standby.signal 与 primary_conninfo

# 启动备库即为只读副本
-- 主库查看已连接的备库与落后字节
SELECT client_addr, state, sent_lsn, write_lsn, replay_lsn
FROM pg_stat_replication;

-- 备库查看是否延迟
SELECT now() - pg_last_xact_replay_timestamp() AS replay_lag;

同步复制

默认异步复制在故障时可能丢少量数据。配置同步复制可让主库等待备库确认:

synchronous_commit = on
synchronous_standby_names = 'FIRST 1 (standby1, standby2)'
Warning

同步复制会增加事务延迟,且当所有同步备库不可用时主库写操作会阻塞。建议配置至少两个候选备库并使用 FIRST 1 (...) 语义,兼顾一致性与可用性。

逻辑复制

逻辑复制在逻辑层面(行变更)复制,而非物理字节,因而支持:

  • 只复制部分表、按行过滤。
  • 跨大版本升级、异构迁移。
  • 主库可读写(物理备库只读)。
-- 主库:wal_level = logical
CREATE PUBLICATION pub_orders FOR TABLE orders, users;

-- 订阅端
CREATE SUBSCRIPTION sub_orders
CONNECTION 'host=10.0.0.1 port=5432 dbname=demo user=repl password=***'
PUBLICATION pub_orders;
Tip

逻辑复制不复制 DDL(表结构变更需手动同步),也不复制序列。它更适合数据同步与迁移,而不是完整的灾备方案。

高可用与故障切换

方案说明
Patroni基于 etcd/Consul 的成熟 HA 编排,自动选主与切换
repmgr社区常用的复制管理工具
pg_auto_failover官方 Citus 团队方案,配置简单
云托管(RDS/Aurora)厂商代管,多可用区自动切换
        ┌─────────────┐
        │  etcd/Consul│  ← 分布式一致性存储(租约与选主)
        └──────┬──────┘
     ┌─────────┴─────────┐
     ▼                   ▼
 ┌────────┐  流复制  ┌────────┐
 │ 主库    │ ───────► │ 备库    │
 │ Patroni │         │ Patroni │
 └────────┘           └────────┘

     └── VIP / HAProxy / 客户端路由

备份与 PITR

# 连续归档模式
archive_mode = on
archive_command = 'cp %p /backup/wal/%f'

# 基础备份
pg_basebackup -D /backup/base -Ft -z -P

# 恢复到指定时间点(recovery.target_time)
restore_command = 'cp /backup/wal/%f %p'

小结

  • WAL 是崩溃恢复、物理复制与 PITR 的共同基础。
  • 物理流复制得到完整副本,用于只读扩展与切换;同步复制可降低丢数据风险但增加延迟。
  • 逻辑复制灵活(部分表、跨版本),但不含 DDL 与序列。
  • 生产高可用优先选用 Patroni 或云托管方案,并配套基础备份 + WAL 归档。