postgresql主从架构搭建

基本概念

  • 流复制类型
    • 物理复制 (Physical replication):复制 WAL(redo log),完全同步数据库页
    • 逻辑复制 (Logical replication):按表、按行复制,依赖逻辑解码插件(wal2json、pgoutput)
  • 核心机制
    • 主库产生 WAL(物理日志)
    • 流复制从库通过 TCP 拉取 WAL 并应用
    • 可结合归档(archive_command)或复制槽(replication slot)保证从库断线时 WAL 不丢失
  • 主要参与角色
    • 主库 (Primary/Master):生成 WAL,提供 replication 连接
    • 从库 (Standby/Replica):接收并应用 WAL
    • 复制槽 (Replication Slot):确保主库保留 WAL,避免从库断开导致 WAL 丢失

PG流复制推荐使用12以后的版本,12版本后参数有明显的变动与以往版本不一样,现在一般推荐使用wal_keep_size+复制槽来实现短期的主从中断WAL冗余,使用standby.signal指示从库。以往依赖restore_command && recovery.conf的方式可以废弃了。

https://www.postgresql.org/docs/17/warm-standby.html#STREAMING-REPLICATION

1.主库配置

编辑 postgresql.conf

# 开启复制相关
wal_level = replica             # 物理复制;logical 可做逻辑复制
max_wal_senders = 5             # 最多允许多少复制连接
wal_keep_size = 8GB             # 保留 WAL,防止短期从库丢失,对启用了replication slot的复制没有意义,但是对那些未开启slot的复制有用
archive_mode = on               # 可选,开启 WAL 归档
archive_command = 'cp %p /path/to/archive/%f'  # 归档命令

创建复制用户:

CREATE ROLE repl WITH REPLICATION LOGIN PASSWORD 'xxx';

2.从库配置

# 在从库节点直接拉取主库做初始化并自动在主库创建replication slot,目标目录必须为空
su - postgres -c "pg_basebackup -h primary_ip -p primary_port -D /data/pgdata -U repl --wal-method=stream --create-slot --slot=slot_xxx"
# 你也可以提前在主库手动创建replication slot: SELECT pg_create_physical_replication_slot('slot_xxx');
# standby.signal为pg 12之后的从库标识,有此标识时PG启动时自动通过下述primary_conninfo连接主库开启流复制,被提升为主库时会自动删除此文件
su - postgres -c "touch /data/pgdata/standby.signal"
# 配置主库连接信息,为了避免额外启动一次实例,我们直接写入postgresql.auto.conf,相当于启动后执行了alter system
su - postgres
echo "primary_conninfo = 'host=primary_ip port=primary_port user=repl password=xxx'" >> $PGDATA/postgresql.auto.conf
echo "primary_slot_name = 'slot_xxx'" >> $PGDATA/postgresql.auto.conf
systemctl start postgres@xxx.service
# 主库查看复制状态:
SELECT pid, application_name, state, sent_lsn, write_lsn, flush_lsn, replay_lsn FROM pg_stat_replication;
# 从库查看延迟:
SELECT pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn();
SELECT pg_wal_lsn_diff(pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn());
# 查看replication slot
SELECT slot_name, slot_type, active FROM pg_replication_slots;

3. 其他

默认的,PG的流复制模式为异步,但是也支持同步模式,事务在commit时会要求同步standby返回确认消息,相关配置可以参考:https://www.postgresql.org/docs/17/warm-standby.html#SYNCHRONOUS-REPLICATION

同步复制对网络要求较高,对性能影响较大,建议至少1主多从的场景下再开启同步模式,可以参考文档通过设置synchronous_standby_names的ANY关键字实现Quorum-based synchronous replication,以便承受更高的网络波动避免主库提交收到较大影响。

posted @ 2025-12-17 18:07  realcp1018  阅读(0)  评论(0)    收藏  举报