Ubuntu 系统部署 PostgreSQL 主从复制 + 流复制(Streaming Replication)完整操作指南
PostgreSQL 集群是通过网络连接的多个 PostgreSQL 服务器实例协同工作,以提供高可用性、性能优化和数据安全保障的解决方案。
PostgreSQL 集群核心组件与角色
- Primary Node(主节点)
- 功能:处理所有写操作(INSERT/UPDATE/DELETE),维护最新数据状态,是集群的核心数据源。
- 特点:唯一写入入口,数据变更通过复制机制同步至备节点。
- Standby Node(备节点)
- 功能:通过复制主节点数据保持一致性,可处理读操作(SELECT)实现读写分离。
- 扩展性:支持一主多备架构,备节点数量可按需扩展。
- Failover(故障转移)
- 机制:主节点故障时,系统自动将服务切换至备节点,确保业务连续性。
- 触发条件:通过心跳检测或第三方工具(如Patroni)监控节点健康状态。
- Switchover(手动切换)
- 场景:计划内维护时,管理员手动触发主备角色切换,实现零停机升级或配置调整。
高可用性实现原理
1. 数据冗余机制
- WAL(Write-Ahead Logging)
- 作用:所有数据修改先写入日志文件,故障时可恢复至一致状态。
- 应用:流复制、逻辑复制均依赖WAL传输数据变更。
- Replication Slots(复制槽)
- 作用:防止主节点过早回收未同步的WAL日志,避免备节点数据缺失。
- 适用场景:异步复制中确保数据完整性。
- Heartbeat 检测
- 机制:通过定期通信(如TCP保活包)监控节点状态,快速发现故障并触发切换。
2. 复制模式
- 同步复制(Synchronous Replication)
- 特点:主节点等待备节点确认数据写入后才返回成功,确保零数据丢失。
- 代价:性能开销较高,延迟增加。
- 异步复制(Asynchronous Replication)
- 特点:主节点不等待备节点确认,性能更高。
- 风险:极端情况下可能丢失少量数据。
PostgreSQL 主流集群方案
1. 原生流复制(Streaming Replication)
- 原理:主节点通过流式传输WAL日志至备节点,备节点重放日志保持数据一致。
- 特点:
- 支持同步/异步复制,配置简单。
- 原生支持,无需额外工具。
- 适用场景:高可用性、读写分离(如Web应用、数据分析)。
2. 逻辑复制(Logical Replication)
- 原理:将数据变更解析为SQL或特定格式事件,发送至备节点重放。
- 特点:
- 支持表级复制,灵活选择复制对象。
- 允许跨版本/跨数据库复制,但延迟可能较高。
- 适用场景:数据迁移、跨库同步、细粒度控制需求。
3. 第三方工具方案
| 工具 | 原理 | 特点 | 适用场景 |
|---|---|---|---|
| Patroni | 基于etcd/ZooKeeper实现自动化故障切换和配置管理。 | 提供自动检测、切换、丰富的API和监控接口。 | 高度自动化、灵活的高可用集群。 |
| Pgpool-II | 作为中间件提供连接池、负载均衡、高可用性功能。 | 支持多种负载策略、并行查询、查询缓存。 | 连接池、负载均衡、高并发场景。 |
| Repmgr | 管理基于流复制的集群,提供命令行工具和守护进程。 | 支持故障检测、自动转移、日志通知。 | 简化流复制集群的管理和监控。 |
4. 分布式数据库解决方案
| 方案 | 原理 | 特点 | 适用场景 |
|---|---|---|---|
| Postgres-XC/XL | 分离SQL解析层和数据存取层,实现分布式架构。 | 支持水平扩展、全局事务管理(GTM)、复制/分片模式。 | 大规模数据、高并发OLTP系统。 |
| Citus | 以插件形式扩展PostgreSQL,实现自动分片和复制。 | 提供透明数据分布、查询处理机制,支持多租户。 |
✅ 部署目标
- 主节点(Primary):
192.168.22.131 - 备节点(Standby):
192.168.22.215 - PostgreSQL 版本:14(Ubuntu 官方仓库)
- 复制用户:
replicator,密码:StrongPass123 - 数据目录:
/var/lib/postgresql/14/main - 配置目录:
/etc/postgresql/14/main
一、两台机器都安装 PostgreSQL 14
# 更新系统
sudo apt update# 安装 PostgreSQL 14
sudo apt install -y postgresql-14 postgresql-client-14# 确保服务运行(主库需要,备库后续会重建数据)
sudo systemctl start postgresql@14-main
sudo systemctl enable postgresql@14-main
二、配置主节点(192.168.22.131)
1. 创建复制用户
sudo -u postgres psql -c "CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'StrongPass123';"
2. 修改 postgresql.conf
sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/g" /etc/postgresql/14/main/postgresql.conf
sudo sed -i "s/wal_level = minimal/wal_level = replica/g" /etc/postgresql/14/main/postgresql.conf# 添加或确保以下参数(追加到文件末尾)
cat <<EOF | sudo tee -a /etc/postgresql/14/main/postgresql.conf# Replication settings
max_wal_senders = 10
wal_keep_size = 1GB
hot_standby = on
EOF
3. 配置 pg_hba.conf 允许备库复制
echo "host replication replicator 192.168.22.215/32 md5" | sudo tee -a /etc/postgresql/14/main/pg_hba.conf
4. 重启主库
sudo systemctl restart postgresql@14-main
三、配置备节点(192.168.22.215)
1. 停止 PostgreSQL 并清空数据目录
sudo systemctl stop postgresql@14-main
sudo rm -rf /var/lib/postgresql/14/main/*
2. 删除原有目录并设置目录权限
sudo rm -rf /var/lib/postgresql/14/main
sudo mkdir -pv /var/lib/postgresql/14/main
sudo chown postgres:postgres /var/lib/postgresql/14/main
sudo chmod 0755 /var/lib/postgresql/14/main
3. 使用 pg_basebackup 拉取备份
sudo -u postgres pg_basebackup \-h 192.168.22.131 \-U replicator \-D /var/lib/postgresql/14/main \-P -v -R -W
参数说明:
-h:主库 IP-U:复制用户名-D:本地数据目录-P:显示进度-v:详细输出-R:关键! 自动生成standby.signal并在postgresql.auto.conf中写入 primary_conninfo-W:提示输入密码
执行后会提示输入 replicator 的密码,输入密码:StrongPass123
-R 参数会自动生成 standby.signal 和连接信息。

4. 确认关键文件存在
ls /var/lib/postgresql/14/main/standby.signal # 应存在
![]()
5. 修改目录权限(关键!)
sudo chmod 0700 /var/lib/postgresql/14/main
5. 启动备库
sudo systemctl start postgresql@14-main
四、验证复制是否成功
在主库插入测试数据:
sudo -u postgres psql -c "CREATE TABLE IF NOT EXISTS test_sr (id SERIAL, msg TEXT);"
sudo -u postgres psql -c "INSERT INTO test_sr (msg) VALUES ('Replication works');"
在备库查询(只读):
sudo -u postgres psql -c "SELECT * FROM test_sr;"
✅ 如果看到数据,说明 流复制部署成功!

五、查看复制状态
在主库执行:
SELECT * FROM pg_stat_replication;
在备库执行:
SELECT * FROM pg_stat_wal_receiver;

通过本文的逐步操作,我们成功在 Ubuntu 系统上搭建了一套稳定、安全的 PostgreSQL 14 主从流复制架构。整个过程涵盖了主库配置、复制用户创建、备库初始化、权限修正以及状态验证等关键环节,并特别规避了常见的陷阱——如 wal_keep_size 单位格式错误、数据目录权限不合规、Bash 特殊字符解析冲突等问题。
