作为数据库开发者,单点故障导致的业务停摆是常见风险。PostgreSQL 原生流复制功能强大,通过合理配置即可低成本实现高可用。
本文将基于 CentOS/Ubuntu 环境下的 PostgreSQL 14,介绍从零搭建、配置调优到故障演练的完整流程。
1. 环境准备
1.1 基础环境要求
| 节点类型 | 服务器地址 | 系统版本 | PostgreSQL 版本 | 核心要求 |
|---|---|---|---|---|
| 主库(Master) | 192.168.42.140(示例) | CentOS 7/8/9 或 Ubuntu 20.04+ | 14 | 开启网络端口、关闭防火墙 / 放行 5432 端口 |
| 从库(Slave/Standby) | 192.168.42.145(示例) | 与主库一致 | 与主库完全一致 | 与主库网络互通、磁盘空间不小于主库 |
1.2 安装 PostgreSQL
确保两台服务器均安装相同版本的 PostgreSQL。
2. 主库配置
2.1 修改 PostgreSQL 主配置文件
主配置文件路径:/var/lib/pgsql/14/data/postgresql.conf
vim /var/lib/pgsql/14/data/postgresql.conf
修改以下核心参数(取消注释并调整值):
# 1. 监听地址(允许从库连接,可指定从库 IP 或 0.0.0.0 允许所有)
listen_addresses = '*'
# 2. 开启归档模式(主从复制依赖)
archive_mode = on
archive_command = 'cp %p /var/lib/pgsql/14/archive/%f'
# %p=归档文件路径,%f=归档文件名
# 提前创建归档目录
mkdir -p /var/lib/pgsql/14/archive && chown -R postgres:postgres /var/lib/pgsql/14/archive
# 3. WAL 日志配置(保证复制可靠性)
wal_level = replica
wal_buffers = 16MB
max_wal_senders = 10
wal_keep_size = 1GB
# 4. 同步模式(可选,按需配置)
# synchronous_commit = on
# synchronous_standby_names = 'slave1'
# 5. 其他优化(可选)
max_connections = 1000
2.2 修改客户端认证配置文件
文件路径:/var/lib/pgsql/14/data/pg_hba.conf
vim /var/lib/pgsql/14/data/pg_hba.conf
添加从库的连接授权(允许从库 IP 通过复制用户连接):
host replication repl_user 192.168.42.145/32 md5
host all all 192.168.42.0/24 md5
2.3 创建复制专用用户
切换到 postgres 用户,执行 SQL 命令创建用于主从复制的专用用户(需授予复制权限):
su - postgres psql
执行 SQL:
-- 创建复制用户(密码自定义,示例:Repl@123456)
CREATE ROLE repl_user WITH REPLICATION LOGIN ENCRYPTED PASSWORD '********';
-- 验证用户(可选)
\du repl_user;
-- 退出 psql
\q
2.4 重启主库使配置生效
systemctl restart postgresql-14
systemctl status postgresql-14
sudo -u postgres psql -c "SELECT pg_is_in_recovery();"
# 主库返回 f(非恢复模式)
2.5 备份主库数据(供从库初始化)
使用 pg_basebackup 工具备份主库数据,该工具专门用于 PostgreSQL 复制环境的从库初始化:
# 切换到 postgres 用户
su - postgres
# 执行备份(备份到临时目录,后续拷贝到从库)
pg_basebackup -h 192.168.42.140 -U repl_user -p 5432 -D /tmp/pg_master_backup -F p -X s -P -R
# 参数说明:
# -h:主库地址
# -U:复制用户
# -p:主库端口
# -D:备份目录
# -F p:输出格式为普通文件(与主库数据目录结构一致)
# -X s:备份过程中同步复制 WAL 日志,保证备份一致性
# -P:显示备份进度
# -R:自动生成复制所需的 standby.signal 文件和 postgresql.auto.conf 配置,简化从库配置
备份完成后,将备份目录打包拷贝到从库的 /var/lib/pgsql/14/ 目录下(可通过 scp 传输):
tar -zcvf pg_master_backup.tar.gz /tmp/pg_master_backup
scp pg_master_backup.tar.gz [email protected]:/var/lib/pgsql/14
3. 从库配置
3.1 停止从库 PostgreSQL 服务并清理原有数据目录
# 停止从库服务
systemctl stop postgresql-14
# 清理原有数据目录(初始化后的空目录,需替换为主库备份)
mv /var/lib/pgsql/14/data /var/lib/pgsql/14/data_bak
# 备份原有目录,防止误删
mkdir -p /var/lib/pgsql/14/data
3.2 解压主库备份到从库数据目录
# 切换到 postgres 用户
su - postgres
# 解压备份包
tar -zxvf /var/lib/pgsql/14/pg_master_backup.tar.gz -C /var/lib/pgsql/14/
# 移动备份数据到 data 目录
mv /var/lib/pgsql/14/tmp/pg_master_backup/* /var/lib/pgsql/14/data/
# 修改目录权限(必须为 postgres 用户和组)
chown -R postgres:postgres /var/lib/pgsql/14/data
chmod 700 /var/lib/pgsql/14/data
3.3 验证 / 修改从库复制配置
由于主库备份时使用了 -R 参数,会自动生成 standby.signal(标识从库身份)和 postgresql.auto.conf(包含复制连接信息),无需手动创建:
# 查看自动生成的复制配置
cat /var/lib/pgsql/14/data/postgresql.auto.conf
ls /var/lib/pgsql/14/data/
若没有,则手动创建 standby.signal 并修改 postgresql.conf:
# 手动创建 standby.signal(标识为从库)
touch /var/lib/pgsql/14/data/standby.signal
# 编辑 postgresql.conf,添加复制配置
vim /var/lib/pgsql/14/data/postgresql.conf
# 从库专属配置
hot_standby = on
max_connections = 500
primary_conninfo = 'user=repl_user password=Repl@123456 host=192.168.42.140 port=5432'
3.4 启动从库服务
# 启动从库
systemctl start postgresql-14
systemctl enable postgresql-14
# 验证从库状态
systemctl status postgresql-14
4. 验证主从复制是否生效
4.1 主库验证复制状态
su - postgres psql
# 查看复制连接状态(可看到从库的连接信息)
SELECT * FROM pg_stat_replication;
# 输出说明:
# - usename:repl_user(复制用户)
# - client_addr:192.168.42.145(从库 IP)
# - state:streaming(表示正在流式复制)
# - sync_state:async(异步复制)或 sync(同步复制,需主库配置 synchronous_commit=on)
4.2 从库验证复制状态
su - postgres psql
# 1. 验证是否处于恢复模式(从库返回 t,主库返回 f)
SELECT pg_is_in_recovery();
4.3 验证主从数据一致性
# 主库创建测试表并插入数据
# 主库执行:
CREATE DATABASE test_repl;
\c test_repl;
CREATE TABLE user_info (id int, name varchar(50));
INSERT INTO user_info VALUES (1, 'test_replication');
# 从库执行(查看是否同步到数据)
\c test_repl;
SELECT * FROM user_info;
5. 主从复制常用操作
5.1 切换主从(故障转移,简易版)
当主库故障时,可将从库提升为主库:
# 从库执行(停止恢复模式,提升为主库)
su - postgres psql -c "SELECT pg_promote();"
# 验证:提升后从库 pg_is_in_recovery() 返回 f
psql -c "SELECT pg_is_in_recovery();"
5.2 监控复制延迟
# 从库执行,查看复制延迟(单位:秒)
SELECT now() - pg_last_xact_replay_timestamp() AS replication_delay;
5.3 新增从库
只需重复'从库配置'步骤,使用主库(或现有从库,需开启级联复制)的 pg_basebackup 备份初始化即可。
总结
这套 PostgreSQL 主从架构方案,通过原生流复制实现数据库容灾,既能扛住日常的业务压力,又能应对突发的主库故障。关键是做好基础配置、监控和切换流程。


