📌 摘要:数据无价,高可用是底线。本文手把手教你搭建 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.gz3️⃣ 配置环境变量
编辑/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_profile4️⃣ 初始化与目录准备
# 创建归档目录 mkdir -p /home/postgres/opt/wal_archivedir chown -R postgres:postgres /home/postgres/opt/ # 初始化数据库 initdb -D /home/postgres/opt/data5️⃣ 核心配置文件修改
编辑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 md56️⃣ 启动并创建复制用户
# 启动数据库 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/data3️⃣ 配置免密认证
同样在 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实现自动故障切换。