You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何搭建本地PostgreSQL到AWS RDS PostgreSQL的物理复制同步链路

本地PostgreSQL到AWS RDS PostgreSQL物理复制(全量+实时同步)搭建方案

前置要求

  • 必须保证本地PostgreSQL和RDS PostgreSQL的大版本完全一致,小版本差异尽可能小,否则物理复制无法正常工作
  • 本地主库需可被RDS实例网络访问(可通过公网IP、VPC专线、VPN等方式打通网络)
  • 需持有AWS账户对应S3、RDS的操作权限,以及本地PostgreSQL的超级用户权限

步骤1:本地主库配置

  1. 修改postgresql.conf配置文件,调整以下参数:
    wal_level = replica # 物理复制最低要求
    max_wal_senders = 10 # 至少大于2,预留足够的并发复制连接数
    wal_keep_size = 16GB # 根据全量备份+同步追数据的时间窗口调整,保证同步期间WAL不被回收
    wal_log_hints = on # 建议开启,避免页损坏问题
    full_page_writes = on # 默认开启,需保留
    
  2. 执行命令重启PostgreSQL服务使配置生效:systemctl restart postgresql-你的版本号(例如postgresql-14)
  3. 修改pg_hba.conf配置文件,添加规则允许RDS实例访问复制端口:
    host  replication  repl_user  RDS实例的出口IP地址/32  scram-sha-256
    
    如果用MD5加密就把scram-sha-256换成md5,修改后执行pg_ctl reload重载配置无需重启
  4. 创建专属复制用户:
    连接本地PostgreSQL执行SQL:CREATE ROLE repl_user WITH REPLICATION LOGIN PASSWORD '自定义强密码';

步骤2:RDS端前置准备

  1. 进入AWS RDS控制台,创建和本地PG版本完全一致的自定义参数组,调整以下参数:
    • rds.allow_external_master = 1 允许RDS作为外部主库的备库
    • max_replication_slots = 10 至少大于1,预留足够复制槽位
    • hot_standby = on 默认开启,保证备库可读
  2. 将自定义参数组关联到目标RDS实例,重启RDS实例使参数生效
  3. 创建和RDS同区域的S3存储桶,给RDS服务关联的IAM角色添加S3桶的s3:ListBucket、s3:GetObject权限

步骤3:生成并上传全量基础备份

  1. 本地执行pg_basebackup生成一致的全量压缩备份:
    pg_basebackup -h 127.0.0.1 -U repl_user -D ./rds_pg_basebackup -Ft -z -P -Xs
    参数说明:-Ft输出tar格式,-z开启gzip压缩,-Xs同步包含备份期间产生的WAL段
  2. 将生成的所有备份压缩包上传到之前创建的S3存储桶中

步骤4:RDS从S3还原全量备份

  1. 进入RDS控制台,选择「从S3还原」功能:
    • 数据库引擎选择PostgreSQL,版本和本地主库完全一致
    • 备份来源选择你上传备份的S3桶路径
    • 实例配置和你提前规划的RDS实例配置保持一致
    • 完成实例创建,等待实例状态变为「可用」

如果之前已经创建了空RDS实例,需要先删除该实例,再通过S3备份还原创建新的RDS实例,因为空实例没有本地库的基础数据无法直接启动同步

步骤5:启动物理流复制

  1. 使用RDS的master账号连接到RDS PostgreSQL实例
  2. 执行内置存储过程配置外接主库信息:
    SELECT rds_set_external_master (
        host => '本地PostgreSQL的可访问地址',
        port => 5432,
        username => 'repl_user',
        password => '之前创建的复制用户密码',
        ssl_encryption => 1 -- 走公网同步建议开启SSL加密,私网可设为0
    );
    
  3. 执行命令启动同步:SELECT rds_start_replication();

步骤6:同步状态校验

  1. 登录本地主库执行SQL查看复制连接状态:
    SELECT usename, client_addr, state, sync_state FROM pg_stat_replication;
    返回结果中存在repl_user的连接,且state为streaming则表示同步链路正常
  2. 登录RDS实例执行SQL查看同步延迟:
    SELECT now() - pg_last_xact_replay_timestamp() AS replication_delay;
    正常状态下延迟在毫秒到秒级,随主库写入压力波动

切流操作(需要将业务流量切换到RDS时执行)

  1. 停止本地主库的所有业务写入
  2. 等待RDS同步延迟变为0,确认所有数据已同步完成
  3. 登录RDS实例执行SELECT rds_stop_replication();,RDS会自动提升为可写的主库
  4. 将业务流量切到RDS实例即可

注意事项

  • 物理复制为整实例级别同步,无法选择性同步部分库/表,如需部分同步需使用逻辑复制
  • 需定期监控本地主库的WAL保留情况,避免WAL被提前回收导致同步中断,需重新做全量备份恢复同步
  • 网络中断恢复后RDS会自动重连本地主库追数据,无需手动操作,只要WAL保留充足即可自动恢复同步

内容的提问来源于stack exchange,提问作者arshul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:39:01