如何搭建本地PostgreSQL到AWS RDS PostgreSQL的物理复制同步链路
本地PostgreSQL到AWS RDS PostgreSQL物理复制(全量+实时同步)搭建方案
前置要求
- 必须保证本地PostgreSQL和RDS PostgreSQL的大版本完全一致,小版本差异尽可能小,否则物理复制无法正常工作
- 本地主库需可被RDS实例网络访问(可通过公网IP、VPC专线、VPN等方式打通网络)
- 需持有AWS账户对应S3、RDS的操作权限,以及本地PostgreSQL的超级用户权限
步骤1:本地主库配置
- 修改
postgresql.conf配置文件,调整以下参数:wal_level = replica # 物理复制最低要求 max_wal_senders = 10 # 至少大于2,预留足够的并发复制连接数 wal_keep_size = 16GB # 根据全量备份+同步追数据的时间窗口调整,保证同步期间WAL不被回收 wal_log_hints = on # 建议开启,避免页损坏问题 full_page_writes = on # 默认开启,需保留 - 执行命令重启PostgreSQL服务使配置生效:
systemctl restart postgresql-你的版本号(例如postgresql-14) - 修改
pg_hba.conf配置文件,添加规则允许RDS实例访问复制端口:
如果用MD5加密就把host replication repl_user RDS实例的出口IP地址/32 scram-sha-256scram-sha-256换成md5,修改后执行pg_ctl reload重载配置无需重启 - 创建专属复制用户:
连接本地PostgreSQL执行SQL:CREATE ROLE repl_user WITH REPLICATION LOGIN PASSWORD '自定义强密码';
步骤2:RDS端前置准备
- 进入AWS RDS控制台,创建和本地PG版本完全一致的自定义参数组,调整以下参数:
rds.allow_external_master = 1允许RDS作为外部主库的备库max_replication_slots = 10至少大于1,预留足够复制槽位hot_standby = on默认开启,保证备库可读
- 将自定义参数组关联到目标RDS实例,重启RDS实例使参数生效
- 创建和RDS同区域的S3存储桶,给RDS服务关联的IAM角色添加S3桶的
s3:ListBucket、s3:GetObject权限
步骤3:生成并上传全量基础备份
- 本地执行
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段 - 将生成的所有备份压缩包上传到之前创建的S3存储桶中
步骤4:RDS从S3还原全量备份
- 进入RDS控制台,选择「从S3还原」功能:
- 数据库引擎选择PostgreSQL,版本和本地主库完全一致
- 备份来源选择你上传备份的S3桶路径
- 实例配置和你提前规划的RDS实例配置保持一致
- 完成实例创建,等待实例状态变为「可用」
如果之前已经创建了空RDS实例,需要先删除该实例,再通过S3备份还原创建新的RDS实例,因为空实例没有本地库的基础数据无法直接启动同步
步骤5:启动物理流复制
- 使用RDS的master账号连接到RDS PostgreSQL实例
- 执行内置存储过程配置外接主库信息:
SELECT rds_set_external_master ( host => '本地PostgreSQL的可访问地址', port => 5432, username => 'repl_user', password => '之前创建的复制用户密码', ssl_encryption => 1 -- 走公网同步建议开启SSL加密,私网可设为0 ); - 执行命令启动同步:
SELECT rds_start_replication();
步骤6:同步状态校验
- 登录本地主库执行SQL查看复制连接状态:
SELECT usename, client_addr, state, sync_state FROM pg_stat_replication;
返回结果中存在repl_user的连接,且state为streaming则表示同步链路正常 - 登录RDS实例执行SQL查看同步延迟:
SELECT now() - pg_last_xact_replay_timestamp() AS replication_delay;
正常状态下延迟在毫秒到秒级,随主库写入压力波动
切流操作(需要将业务流量切换到RDS时执行)
- 停止本地主库的所有业务写入
- 等待RDS同步延迟变为0,确认所有数据已同步完成
- 登录RDS实例执行
SELECT rds_stop_replication();,RDS会自动提升为可写的主库 - 将业务流量切到RDS实例即可
注意事项
- 物理复制为整实例级别同步,无法选择性同步部分库/表,如需部分同步需使用逻辑复制
- 需定期监控本地主库的WAL保留情况,避免WAL被提前回收导致同步中断,需重新做全量备份恢复同步
- 网络中断恢复后RDS会自动重连本地主库追数据,无需手动操作,只要WAL保留充足即可自动恢复同步
内容的提问来源于stack exchange,提问作者arshul
相关产品推荐
相关产品推荐

