[特殊字符] 干货 | PostgreSQL 流复制搭建保姆级教程,生产环境可直接用!
📌 摘要:数据无价,高可用是底线。本文手把手教你搭建 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
📖 参数解析:
|
参数 |
说明 |
|
|
主库 IP |
|
|
复制用户 |
|
|
纯文本格式 |
|
|
显示进度 |
|
|
流式传输 WAL |
|
|
自动生成 standby.signal 和配置连接信息 |
|
|
数据目录 |
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,可见 active 为 t。
2️⃣ 异步改同步 (Sync Replication)
默认是异步复制(主库提交不等待备库),数据安全性稍低。若需强一致性,可改为同步。
主库修改 postgresql.conf:
synchronous_commit = on synchronous_standby_names = '*'
⚠️ 注意:重启主库后,主库事务提交将等待备库确认,安全性提高,但写入性能会有所下降。
💡 六、避坑指南 & 总结
🔴 常见问题速查表
|
问题 |
解决方案 |
|
权限问题 |
|
|
网络防火墙 |
确保 5432 端口在两台机器间互通 |
|
版本一致 |
主备节点的 PostgreSQL 大版本最好保持一致 |
|
安全警告 |
本文密码、sudo 配置仅用于测试,生产环境请强化安全策略 |
🎉 搭建成功!
现在你拥有了一个具备高可用基础的 PostgreSQL 集群。后续可以结合 Keepalived 或 Patroni 实现自动故障切换。
更多推荐




所有评论(0)