PostgreSQL 16 流复制配置实战3步完成主从同步延迟低于10msPostgreSQL 16的流复制功能为企业级数据库高可用方案提供了更强大的支持。本文将带您快速搭建一个延迟低于10毫秒的主从同步环境并提供完整的配置脚本、性能监控SQL和常见错误排查清单。1. 环境准备与基础配置在开始配置前请确保您已准备好两台服务器一台作为主库Primary另一台作为备库Standby。以下是推荐的硬件配置CPU4核以上内存8GB以上磁盘SSD存储建议100GB以上空间网络主备服务器间延迟应低于1ms1.1 安装PostgreSQL 16在两台服务器上安装PostgreSQL 16# 添加PostgreSQL官方仓库 sudo sh -c echo deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main /etc/apt/sources.list.d/pgdg.list wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - # 安装PostgreSQL 16 sudo apt-get update sudo apt-get -y install postgresql-16 postgresql-client-161.2 主库基础配置在主库上修改postgresql.conf文件sudo nano /etc/postgresql/16/main/postgresql.conf确保包含以下关键参数listen_addresses * # 允许所有IP连接 wal_level replica # 启用WAL日志 max_wal_senders 10 # 最大WAL发送进程数 wal_keep_size 1024 # 保留的WAL段大小(MB) hot_standby on # 备库可读1.3 创建复制用户在主库上创建专用于复制的用户CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD securepassword;在pg_hba.conf中添加复制连接规则host replication replicator standby_ip/32 md5重新加载配置使更改生效sudo systemctl reload postgresql16-main2. 配置主从同步2.1 使用pg_basebackup初始化备库在备库服务器上执行以下命令获取主库的基础备份sudo -u postgres pg_basebackup -h primary_ip -U replicator -p 5432 -D /var/lib/postgresql/16/main -Fp -Xs -P -R注意此操作会覆盖备库数据目录确保执行前备库已停止服务2.2 验证备库配置检查备库生成的postgresql.auto.conf文件应包含类似内容primary_conninfo userreplicator passwordsecurepassword hostprimary_ip port5432 sslmodeprefer2.3 启动备库并验证状态启动备库服务sudo systemctl start postgresql16-main在主库上验证复制状态SELECT client_addr, state, sync_state, pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replication_lag_bytes, write_lag, flush_lag, replay_lag FROM pg_stat_replication;理想情况下replication_lag_bytes应小于1638416KBwrite_lag应低于10ms。3. 高级调优与监控3.1 同步复制配置可选如需零数据丢失保障可配置同步复制。在主库的postgresql.conf中添加synchronous_commit remote_write synchronous_standby_names standby1在备库的postgresql.auto.conf中添加应用名称primary_conninfo ... application_namestandby13.2 性能监控脚本主库监控脚本-- 查看复制状态概览 SELECT application_name, client_addr, state, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), sent_lsn)) AS unsent_lag, pg_size_pretty(pg_wal_lsn_diff(sent_lsn, write_lsn)) AS write_lag_bytes, pg_size_pretty(pg_wal_lsn_diff(write_lsn, flush_lsn)) AS flush_lag_bytes, pg_size_pretty(pg_wal_lsn_diff(flush_lsn, replay_lsn)) AS replay_lag_bytes, write_lag, flush_lag, replay_lag FROM pg_stat_replication;备库监控脚本-- 检查备库延迟 SELECT pg_last_wal_receive_lsn() AS received_lsn, pg_last_wal_replay_lsn() AS replayed_lsn, pg_last_xact_replay_timestamp() AS last_replay_time, pg_wal_lsn_diff(pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn()) AS replay_lag_bytes, now() - pg_last_xact_replay_timestamp() AS replay_time_lag;3.3 常见问题排查清单问题现象可能原因解决方案备库无法连接主库网络问题或pg_hba.conf配置错误检查网络连通性验证pg_hba.conf中的复制规则复制延迟持续增长备库I/O性能不足或网络带宽受限检查备库磁盘I/O考虑升级SSD或增加网络带宽主库WAL堆积备库长时间离线或复制中断检查备库状态必要时重建复制同步复制导致主库卡住备库响应超时调整synchronous_commit级别或增加wal_sender_timeout复制槽导致WAL膨胀备库长时间未同步且使用了复制槽监控pg_replication_slots必要时删除无效复制槽4. 自动化维护与故障转移4.1 使用systemd自动重启服务创建服务监控脚本/usr/local/bin/pg_monitor.sh#!/bin/bash PGPORT5432 PRIMARY_IPprimary_ip # 检查本地PostgreSQL是否运行 if ! pg_isready -q -t 1; then systemctl restart postgresql16-main exit 0 fi # 如果是备库检查复制状态 if [ -f /var/lib/postgresql/16/main/standby.signal ]; then lag$(psql -tAc SELECT pg_wal_lsn_diff(pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn())) if [ ${lag:-0} -gt 16777216 ]; then # 超过16MB延迟 systemctl restart postgresql16-main fi fi设置定时任务每分钟执行一次(crontab -l 2/dev/null; echo * * * * * /usr/local/bin/pg_monitor.sh) | crontab -4.2 手动故障转移步骤提升备库为主库sudo -u postgres pg_ctl promote -D /var/lib/postgresql/16/main原主库重新配置为备库sudo -u postgres pg_basebackup -h new_primary_ip -U replicator -p 5432 -D /var/lib/postgresql/16/main -Fp -Xs -P -R sudo systemctl start postgresql16-main更新应用连接字符串指向新的主库对于生产环境建议使用Patroni等专业工具管理自动故障转移而非手动操作。