一、流复制与逻辑复制的基本概念

在PostgreSQL的世界里,复制技术是保障数据高可用和业务连续性的重要手段。流复制(Streaming Replication)和逻辑复制(Logical Replication)是两种核心机制,虽然目标都是数据同步,但实现方式和适用场景却大不相同。

流复制像是给数据库装了个"实时传真机",它基于WAL(Write-Ahead Logging)物理层同步,主库的任何数据变化都会以二进制形式传输到备库。这种方式的优点是延迟极低,适合需要高可用和灾难恢复的场景。例如:

-- 在主库配置流复制(PostgreSQL 13+示例)
ALTER SYSTEM SET wal_level = replica;  -- 设置WAL级别
ALTER SYSTEM SET max_wal_senders = 10; -- 允许最多10个WAL发送进程
ALTER SYSTEM SET synchronous_commit = on; -- 启用同步提交

-- 在备库配置恢复模式
cat > recovery.conf << EOF
standby_mode = 'on'
primary_conninfo = 'host=primary.example.com port=5432 user=repl_user password=secret'
EOF

逻辑复制则更像是"选择性快递",它在逻辑层面解析WAL日志,只传输特定的表或数据变更。这种机制允许跨版本复制、表级同步,甚至可以向其他数据库系统转发数据。比如我们要同步inventory表:

-- 在主库创建发布(PostgreSQL 13+)
CREATE PUBLICATION inventory_pub FOR TABLE products, warehouses;

-- 在订阅端配置
CREATE SUBSCRIPTION inventory_sub 
CONNECTION 'host=primary.example.com dbname=shop user=repuser password=secret' 
PUBLICATION inventory_pub;

二、典型迁移方案设计

当我们需要将旧系统迁移到PostgreSQL时,这两种复制技术可以组合出精妙的迁移策略。

案例:从零开始搭建电商数据库
假设现有MySQL的订单系统需要迁移,我们可以分阶段实施:

-- 阶段1:使用逻辑复制同步基础数据
CREATE PUBLICATION initial_data_pub FOR TABLE users, products;

-- 阶段2:在PostgreSQL创建订阅
CREATE SUBSCRIPTION initial_data_sub 
CONNECTION 'host=mysql-gateway dbname=legacy' 
PUBLICATION initial_data_pub 
WITH (copy_data = true);

-- 阶段3:切换时启用流复制保障零丢失
-- 配置同步级流复制(关键事务不丢失)
ALTER SYSTEM SET synchronous_standby_names = 'standby1';

这种混合方案的优势在于:初期用逻辑复制保证异构系统迁移的灵活性,切换时通过流复制确保关键数据不丢失。需要注意的是,逻辑复制对DDL操作不敏感,表结构变更需要额外处理。

三、生产环境共存运维策略

两种复制机制长期共存时,运维复杂度会指数级上升。这里分享几个实战技巧:

监控方案示例

-- 监控流复制延迟
SELECT client_addr, 
       pg_wal_lsn_diff(pg_current_wal_lsn(), sent_lsn) AS send_lag,
       pg_wal_lsn_diff(sent_lsn, write_lsn) AS write_lag
FROM pg_stat_replication;

-- 监控逻辑复制槽
SELECT slot_name, active, confirmed_flush_lsn 
FROM pg_replication_slots WHERE plugin = 'pgoutput';

常见故障处理场景

  1. 当逻辑复制冲突时,可以跳过特定事务:
-- 查看冲突
SELECT * FROM pg_stat_subscription;

-- 跳过冲突事务(谨慎操作)
ALTER SUBSCRIPTION inventory_sub SKIP (lsn '0/XXXXXXX');
  1. 流复制网络中断后的自动恢复:
# 在备库自动重试脚本
while ! pg_isready -h primary; do
  sleep 10
done
pg_ctl promote -D $PGDATA

四、技术选型与场景适配

经过多个生产项目验证,我们总结出这样的决策矩阵:

需求特征 推荐方案 典型场景
亚秒级RPO 同步流复制 金融交易系统
跨版本升级 逻辑复制 大版本迁移
部分表同步 逻辑复制 数据分片
异构数据库同步 逻辑解码+外部工具 MySQL到PostgreSQL迁移

性能对比测试数据(基于TPC-C基准):

  • 纯流复制集群:写入延迟<5ms,吞吐量降低约8%
  • 逻辑复制附加开销:单表同步增加15% CPU负载
  • 混合模式运维成本比单一模式高30-40%

五、避坑指南与最佳实践

  1. WAL磁盘风暴预防
-- 限制WAL保留量
ALTER SYSTEM SET wal_keep_size = '10GB';
-- 定期清理旧复制槽
SELECT pg_drop_replication_slot('abandoned_slot');
  1. 连接管理黄金法则
# 在postgresql.conf中优化连接池
max_connections = 200
max_wal_senders = 20
max_logical_replication_workers = 10
  1. 密码轮换策略
-- 定期更新复制凭证
ALTER SYSTEM SET primary_conninfo = 'host=new.primary...';
SELECT pg_reload_conf();

对于大型互联网应用,建议采用"逻辑复制处理业务数据+流复制保障元数据安全"的混合架构。某电商平台实施该方案后,跨数据中心同步时间从分钟级降至秒级,年度故障时间减少92%。