📌 摘要:数据无价,高可用是底线。本文手把手教你搭建 PostgreSQL 主从流复制环境,涵盖环境规划、主从配置、复制槽管理及同步模式切换,步骤详细,建议收藏!

在数据库运维中,高可用(HA数据安全 永远是第一要务。PostgreSQL 的流复制(Streaming Replication)机制是实现主从热备、读写分离的基础。

很多同学在搭建过程中容易在权限、配置文件或网络连通性上踩坑。今天,我们整理了一份**"保姆级"**的 PG 流复制搭建文档,基于两台 CentOS 主机,从 0 到 1 完成搭建。


📋 一、环境规划

在开始之前,请确保两台主机网络互通,并关闭防火墙或开放 5432 端口。

🖥️ 主机规划表

主机名

IP 地址

角色

说明

node1

192.168.171.43

Master (主)

提供写服务,同步 WAL 日志

node2

192.168.171.44

Standby (备)

提供读服务,实时回放日志

⚠️ 注意:本文演示使用二进制包安装(tar.gz),生产环境建议使用 yum/apt 或源码编译,并注意权限安全。


🛠️ 二、主节点 (node1) 配置

1️⃣ 创建系统用户

为了安全,数据库不应使用 root 运行。我们在 node1 上执行:

# 创建组和用户
getent group postgres || sudo groupadd postgres
id postgres &>/dev/null || sudo useradd -g postgres -m -d /home/postgres -s /bin/bash postgres

# 设置密码 (生产环境请修改!)
echo postgres:Rn#tU02021 | chpasswd

# 配置免密 sudo (方便运维,生产环境建议限制命令)
echo "postgres ALL=(ALL)NOPASSWD:ALL" >>/etc/sudoers

# 创建安装目录
su - postgres -c 'mkdir -p /home/postgres/opt'

2️⃣ 安装数据库

将安装包 PostgreSQL.tar.gz 上传至 /home/postgres/opt 并解压:

su - postgres cd /home/postgres/opt tar -xvf PostgreSQL.tar.gz

3️⃣ 配置环境变量

编辑 /home/postgres/.bash_profile

export PATH=/home/postgres/opt/PostgreSQL/bin:$PATH 
export LD_LIBRARY_PATH=/home/postgres/opt/PostgreSQL/lib

生效配置:

source /home/postgres/.bash_profile

4️⃣ 初始化与目录准备

# 创建归档目录 
mkdir -p /home/postgres/opt/wal_archivedir 
chown -R postgres:postgres /home/postgres/opt/

# 初始化数据库 
initdb -D /home/postgres/opt/data

5️⃣ 核心配置文件修改

编辑 vi /home/postgres/opt/data/postgresql.conf,重点关注以下参数:

listen_addresses = '*'
# 监听所有地址

port = 5432
# 端口

wal_level = replica
# 开启复制级别

archive_mode = on
# 开启归档

archive_command = 'test ! -f /home/postgres/opt/wal_archivedir/%f && cp %p /home/postgres/opt/wal_archivedir/%f'

max_wal_senders = 10
# 最大复制连接数

wal_keep_size = 200MB
# 保留 WAL 大小

hot_standby = on
# 允许备库查询

logging_collector = on
# 开启日志收集

编辑 vi /home/postgres/opt/data/pg_hba.conf,允许复制连接:

# 允许复制用户连接
host replication replicator 0.0.0.0/0 md5

# 允许所有业务连接
host all all 0.0.0.0/0 md5

6️⃣ 启动并创建复制用户

# 启动数据库
pg_ctl -D /home/postgres/opt/data start 

# 进入 psql 创建用户
psql -U postgres

在 SQL 提示符下执行:

CREATE USER replicator REPLICATION LOGIN CONNECTION LIMIT 5 ENCRYPTED PASSWORD '7$T|6as-dfojg10NBS3';

7️⃣ 配置免密认证 (.pgpass)

为了主备之间通信免密,在 postgres 家目录创建 .pgpass

vi /home/postgres/.pgpass

内容如下(注意格式:主机:端口:数据库:用户:密码):

192.168.171.43:5432:replication:replicator:7$T|6as-dfojg10NBS3
192.168.171.44:5432:replication:replicator:7$T|6as-dfojg10NBS3

🛑 重要: 必须修改权限为 600,否则无效!

chmod 0600 /home/postgres/.pgpass

📦 三、备节点 (node2) 配置

1️⃣ 基础环境准备

在 node2 上重复 主节点步骤 1、2、3(创建用户、解压安装包、配置环境变量)。

2️⃣ 创建数据目录

su - postgres
mkdir -p /home/postgres/opt/data
chmod 755 /home/postgres/opt/data

3️⃣ 配置免密认证

同样在 node2 的 postgres 家目录下创建 .pgpass,内容同主节点,权限设为 0600

4️⃣ 执行基备份 (关键步骤)

使用 pg_basebackup 从主节点拉取全量数据并自动配置复制参数。

pg_basebackup -h 192.168.171.43 -U replicator -F p -P -X stream -R -D /home/postgres/opt/data

📖 参数解析:

参数

说明

-h

主库 IP

-U

复制用户

-F p

纯文本格式

-P

显示进度

-X stream

流式传输 WAL

-R

自动生成 standby.signal 和配置连接信息

-D

数据目录

5️⃣ 启动备库

pg_ctl -D /home/postgres/opt/data start

此时,备库应处于只读模式,并开始同步主库数据。


🔍 四、验证复制状态

登录 主库 (node1) 的 psql,执行以下 SQL 查看复制状态:

select * from pg_stat_replication;

✅ 成功标志:

如果看到 state 字段为 streaming,且 client_addr 为备库 IP,说明流复制搭建成功!

-[ RECORD 1 ]----+------------------------------
usename          | replicator
client_addr      | 192.168.171.44
state            | streaming  ← 关键状态
sync_state       | async

🚀 五、进阶:复制槽与同步模式

1️⃣ 使用物理复制槽 (Replication Slot)

作用:防止主库在备库未接收时过早清理 WAL 日志,避免备库断连后无法追平。

主库创建槽:

select * from pg_create_physical_replication_slot('slave');

备库关联槽:

修改备库 postgresql.conf,添加:

primary_slot_name = 'slave'

重启备库生效。再次在主库查询 pg_replication_slots,可见 activet

2️⃣ 异步改同步 (Sync Replication)

默认是异步复制(主库提交不等待备库),数据安全性稍低。若需强一致性,可改为同步。

主库修改 postgresql.conf

synchronous_commit = on synchronous_standby_names = '*'

⚠️ 注意:重启主库后,主库事务提交将等待备库确认,安全性提高,但写入性能会有所下降


💡 六、避坑指南 & 总结

🔴 常见问题速查表

问题

解决方案

权限问题

.pgpass 文件权限必须是 0600,数据目录属主必须是 postgres

网络防火墙

确保 5432 端口在两台机器间互通

版本一致

主备节点的 PostgreSQL 大版本最好保持一致

安全警告

本文密码、sudo 配置仅用于测试,生产环境请强化安全策略

🎉 搭建成功!

现在你拥有了一个具备高可用基础的 PostgreSQL 集群。后续可以结合 KeepalivedPatroni 实现自动故障切换。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐