PostgreSQL 流复制(Streaming Replication)深度解析

一、流复制的核心机制

1. 物理块复制
  • 功能:通过直接传输 二进制 WAL 日志,在从库上重放物理数据页的修改,保持主从数据库的 块级一致性
  • 实现方式
    • WAL 日志传输:主库的 walsender 进程实时发送 WAL 记录到从库的 walreceiver 进程。
    • 数据页重放:从库的 startup 进程将接收的 WAL 应用到本地数据文件,确保数据文件与主库完全一致。
2. 进程分工
角色进程/组件功能
主库walsender 进程读取 WAL 日志并通过 TCP 流式传输到从库。
从库walreceiver 进程接收 WAL 日志并写入本地 pg_wal 目录。
从库startup 进程解析 WAL 日志并应用到数据文件,实现物理页恢复。

二、WAL 传输与数据同步流程

1. 数据写入主库
  • 用户执行 DML
    
    

    SQL

    INSERT INTO orders (product, quantity) VALUES ('Laptop', 5);

  • WAL 日志生成
    • 主库将操作写入 WAL 缓冲区,最终刷盘到 pg_wal 目录下的 WAL 文件(如 0000000100000001000000AB)。
2. WAL 传输(主库侧)
  • walsender 进程启动
    当从库连接时,主库 fork 出 walsender 进程,负责从当前 WAL 位置开始流式传输。
  • 协议格式
    使用 PostgreSQL 专有的 物理复制协议,按 WAL 记录的物理顺序传输。
3. WAL 接收与重放(从库侧)
  • walreceiver 进程
    接收 WAL 数据并写入从库的 pg_wal 目录,确保日志持久化。
  • startup 进程
    解析 WAL 并修改数据文件,重放过程完全 物理一致,无 SQL 解析开销。
4. 同步模式
模式行为
异步复制主库提交事务后无需等待从库确认(默认模式,低延迟但可能丢数据)。
同步复制主库事务提交需等待至少一个从库确认(零数据丢失,但增加主库延迟)。

三、关键组件详解

1. 复制槽(Replication Slot)
  • 作用
    防止主库删除尚未传输到从库的 WAL 日志,避免因从库长时间断开导致数据丢失。
  • 类型
    物理复制槽(仅用于流复制)和逻辑复制槽(用于逻辑复制)。
  • 监控命令
    
    

    SQL

    SELECT slot_name, slot_type, active, restart_lsn FROM pg_replication_slots;

2. 检查点(Checkpoint)
  • 作用
    定期将脏页刷盘并生成新的 WAL 文件,控制 WAL 日志保留周期。
  • 触发条件
    基于 checkpoint_timeout(默认 5 分钟)或 WAL 大小阈值(max_wal_size)。
3. 数据一致性保障
  • 强一致性:同步复制模式下,主从数据完全一致。
  • 恢复点:支持通过 pg_rewind 工具修复因网络分区导致的从库数据分歧。

四、流复制的配置与操作

1. 主库配置(postgresql.conf

Bash

# 启用归档和流复制 wal_level = replica max_wal_senders = 10 # 最大 WAL 发送进程数 hot_standby = on # 从库可读 # 同步复制配置(可选) synchronous_standby_names = 'standby1'

2. 从库配置(recovery.conf 或 postgresql.auto.conf

Bash

# 从库恢复配置(PG12+) standby_mode = on primary_conninfo = 'host=192.168.1.10 port=5432 user=rep_user password=rep_pass'

3. 初始化从库

Bash

# 使用 pg_basebackup 克隆主库数据 pg_basebackup -h 192.168.1.10 -U rep_user -D /var/lib/postgresql/14/main -P -v

4. 启动从库

Bash

# 启动 PostgreSQL 服务 systemctl start postgresql

五、资源消耗与性能影响

1. 主库(发送端)
  • CPU/内存walsender 进程开销低(仅传输二进制日志,无需解析)。
  • 网络带宽:传输完整的 WAL 日志,网络带宽占用较高。
2. 从库(接收端)
  • 磁盘 I/O:持续写入 WAL 日志和应用物理页修改,可能成为瓶颈。
  • 只读查询:启用 hot_standby 后,从库可处理只读请求,但重放进程可能被查询阻塞。

六、监控与故障排查

1. 主库监控

SQL

-- 查看 WAL 发送进程状态 SELECT pid, state, sent_lsn, write_lsn, flush_lsn FROM pg_stat_replication;

输出示例:


pid | state | sent_lsn | write_lsn | flush_lsn ------+-----------+------------+------------+----------- 4567 | streaming | 0/15000000 | 0/15000000 | 0/15000000

2. 从库监控

SQL

-- 查看 WAL 接收状态 SELECT pid, status, receive_start_lsn, received_lsn FROM pg_stat_wal_receiver; -- 查看恢复进度 SELECT pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn();

3. 关键指标
  • 复制延迟
    
    

    SQL

    SELECT pg_wal_lsn_diff(pg_current_wal_lsn(), flush_lsn) AS replication_lag FROM pg_stat_replication;

  • WAL 文件保留
    检查未归档的 WAL 文件数量:
    
    

    Bash

    ls /var/lib/postgresql/14/main/pg_wal | wc -l

七、高级功能与场景

1. 级联复制(Cascading Replication)
  • 架构:主库 → 从库 A → 从库 B。
  • 配置:从库 A 同时作为主库和从库,需启用 wal_level = replica 和 max_wal_senders
2. 自动故障切换(HA)
  • 工具支持
    使用 Patroni、repmgr 或 pg_auto_failover 实现主从自动切换。
  • 触发条件
    主库不可达时,从库自动提升为新主库。
3. 延迟复制(Delayed Replication)
  • 配置
    在从库设置 recovery_min_apply_delay,延迟应用 WAL(用于防止人为错误扩散)。
    
    

    SQL

    ALTER SYSTEM SET recovery_min_apply_delay = '1h';

八、总结

流复制的核心价值
  • 高可用性:通过同步复制和自动故障切换保障业务连续性。
  • 灾备恢复:跨数据中心部署实现数据冗余。
  • 性能优化:只读从库分担查询负载,提升系统吞吐量。
适用场景
  • 核心交易系统:银行、电商等对数据一致性要求极高的场景。
  • 读写分离架构:将分析查询分流到从库,避免影响主库性能。
  • 跨地域容灾:通过级联复制实现多地数据同步。
注意事项
  • 版本兼容性:主从 PostgreSQL 版本需严格一致。
  • 存储规划:WAL 日志和数据库文件需分配充足磁盘空间。
  • 网络带宽:确保主从节点间网络延迟和带宽满足实时同步需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值