目录
[1. 基础环境要求](#1. 基础环境要求)
[2. 前置操作(主从库均执行)](#2. 前置操作(主从库均执行))
[1. 修改 PostgreSQL 主配置文件](#1. 修改 PostgreSQL 主配置文件)
[2. 修改客户端认证配置文件](#2. 修改客户端认证配置文件)
[3. 创建复制专用用户](#3. 创建复制专用用户)
[4. 重启主库使配置生效](#4. 重启主库使配置生效)
[5. 备份主库数据(供从库初始化)](#5. 备份主库数据(供从库初始化))
[1. 停止从库 PostgreSQL 服务并清理原有数据目录](#1. 停止从库 PostgreSQL 服务并清理原有数据目录)
[2. 解压主库备份到从库数据目录](#2. 解压主库备份到从库数据目录)
[3. 验证 / 修改从库复制配置](#3. 验证 / 修改从库复制配置)
[4. 启动从库服务](#4. 启动从库服务)
[1. 主库验证复制状态](#1. 主库验证复制状态)
[2. 从库验证复制状态](#2. 从库验证复制状态)
[3. 故障排查(可选)](#3. 故障排查(可选))
[1. 切换主从(故障转移,简易版)](#1. 切换主从(故障转移,简易版))
[2. 监控复制延迟](#2. 监控复制延迟)
[3. 新增从库](#3. 新增从库)
一、环境准备
1. 基础环境要求
| 节点类型 | 服务器地址 | 系统版本 | PostgreSQL 版本 | 核心要求 |
|---|---|---|---|---|
| 主库(Master) | 192.168.1.100(示例) | CentOS 7/8/9 或 Ubuntu 20.04+ | 12/13/14/15(推荐一致版本) | 开启网络端口、关闭防火墙 / 放行 5432 端口 |
| 从库(Slave/Standby) | 192.168.1.101(示例) | 与主库一致 | 与主库完全一致 | 与主库网络互通、磁盘空间不小于主库 |
2. 前置操作(主从库均执行)
bash
# 1. 安装PostgreSQL(以CentOS 7为例,其他系统可参考官方文档)
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum install -y postgresql14 postgresql14-server
# 2. 初始化数据库(仅首次安装执行)
/usr/pgsql-14/bin/postgresql-14-setup initdb
# 3. 启动PostgreSQL并设置开机自启
systemctl start postgresql-14
systemctl enable postgresql-14
# 4. 关闭防火墙(或放行5432端口)
systemctl stop firewalld && systemctl disable firewalld
# 若需保留防火墙,执行:firewall-cmd --permanent --add-port=5432/tcp && firewall-cmd --reload
# 5. 关闭SELinux(临时+永久)
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
二、主库(Master)配置
1. 修改 PostgreSQL 主配置文件
主配置文件路径:/var/lib/pgsql/14/data/postgresql.conf
bash
# 编辑配置文件
vim /var/lib/pgsql/14/data/postgresql.conf
修改以下核心参数(取消注释并调整值):
bash
# 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级别(replica/archive/logical,replica足够)
wal_buffers = 16MB # 根据内存调整,默认通常足够
max_wal_senders = 10 # 最大并发复制连接数,大于从库数量即可
wal_keep_size = 1GB # 保留WAL日志的大小,防止从库同步滞后导致日志被清理
# 4. 同步模式(可选,按需配置)
# synchronous_commit = on # 默认同步提交,保证主从数据一致性;追求性能可设为off
# synchronous_standby_names = 'slave1' # 指定从库名称(需与从库recovery.conf对应)
# 5. 其他优化(可选)
max_connections = 1000 # 大于从库的max_connections
2. 修改客户端认证配置文件
文件路径:/var/lib/pgsql/14/data/pg_hba.conf
bash
vim /var/lib/pgsql/14/data/pg_hba.conf
添加从库的连接授权(允许从库 IP 通过复制用户连接):
bash
# 格式:类型 数据库 用户 地址 认证方式
host replication repl_user 192.168.1.101/32 md5 # 从库IP,repl_user为复制专用用户
host all all 192.168.1.0/24 md5 # 可选,允许内网其他机器连接
# 注意:原有本地连接配置保留,新增上述复制授权即可
3. 创建复制专用用户
切换到 postgres 用户,执行 SQL 命令创建用于主从复制的专用用户(需授予复制权限):
bash
su - postgres
psql
执行 SQL:
bash
-- 创建复制用户(密码自定义,示例:Repl@123456)
CREATE ROLE repl_user WITH REPLICATION LOGIN ENCRYPTED PASSWORD 'Repl@123456';
-- 验证用户(可选)
\du repl_user;
-- 退出psql
\q
4. 重启主库使配置生效
bash
systemctl restart postgresql-14
# 验证主库状态(确保正常运行)
systemctl status postgresql-14
psql -U postgres -c "SELECT pg_is_in_recovery();" # 主库返回f(非恢复模式)
5. 备份主库数据(供从库初始化)
使用pg_basebackup工具备份主库数据,该工具专门用于 PostgreSQL 复制环境的从库初始化:
bash
# 切换到postgres用户
su - postgres
# 执行备份(备份到临时目录,后续拷贝到从库)
pg_basebackup -h 192.168.1.100 -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 传输):
bash
# 主库上打包备份
tar -zcvf pg_master_backup.tar.gz /tmp/pg_master_backup
# 传输到从库(从库需提前创建目录)
scp pg_master_backup.tar.gz postgres@192.168.1.101:/var/lib/pgsql/14/
三、从库(Slave/Standby)配置
1. 停止从库 PostgreSQL 服务并清理原有数据目录
bash
# 停止从库服务
systemctl stop postgresql-14
# 清理原有数据目录(初始化后的空目录,需替换为主库备份)
mv /var/lib/pgsql/14/data /var/lib/pgsql/14/data_bak # 备份原有目录,防止误删
mkdir -p /var/lib/pgsql/14/data
2. 解压主库备份到从库数据目录
bash
# 切换到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. 验证 / 修改从库复制配置
由于主库备份时使用了-R参数,会自动生成standby.signal(标识从库身份)和postgresql.auto.conf(包含复制连接信息),无需手动创建:
bash
# 查看自动生成的复制配置
cat /var/lib/pgsql/14/data/postgresql.auto.conf
配置内容应包含:
bash
# 自动生成的复制连接参数
primary_conninfo = 'user=repl_user password=Repl@123456 host=192.168.1.100 port=5432 sslmode=prefer sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'
若未自动生成,可手动创建standby.signal并修改postgresql.conf:
bash
# 手动创建standby.signal(标识为从库)
touch /var/lib/pgsql/14/data/standby.signal
# 编辑postgresql.conf,添加复制配置
vim /var/lib/pgsql/14/data/postgresql.conf
添加以下参数:
bash
# 从库专属配置
hot_standby = on # 允许从库处于恢复模式时提供查询服务(只读)
max_connections = 500 # 小于主库的max_connections
primary_conninfo = 'user=repl_user password=Repl@123456 host=192.168.1.100 port=5432' # 主库连接信息
4. 启动从库服务
bash
# 启动从库
systemctl start postgresql-14
systemctl enable postgresql-14
# 验证从库状态
systemctl status postgresql-14
四、验证主从复制是否生效
1. 主库验证复制状态
bash
su - postgres
psql
# 查看复制连接状态(可看到从库的连接信息)
SELECT * FROM pg_stat_replication;
# 输出说明:
# - usename:repl_user(复制用户)
# - client_addr:192.168.1.101(从库IP)
# - state:streaming(表示正在流式复制)
# - sync_state:async(异步复制)或 sync(同步复制,需主库配置synchronous_commit=on)
# 查看WAL日志状态
SELECT pg_current_wal_lsn(); # 记录当前主库WAL日志位置
2. 从库验证复制状态
bash
su - postgres
psql
# 1. 验证是否处于恢复模式(从库返回t,主库返回f)
SELECT pg_is_in_recovery();
# 2. 查看从库同步状态(获取主库信息及同步进度)
SELECT
pg_is_in_recovery(),
pg_last_wal_receive_lsn(), # 从库接收的最新WAL位置
pg_last_wal_replay_lsn(), # 从库重放的最新WAL位置
pg_last_xact_replay_timestamp(); # 最后重放事务的时间戳
# 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; # 若能查询到数据,说明复制正常
3. 故障排查(可选)
若复制未生效,可查看日志排查问题:
bash
# 主库日志
tail -f /var/lib/pgsql/14/log/postgresql-*.log
# 从库日志
tail -f /var/lib/pgsql/14/log/postgresql-*.log
# 常见问题:
# 1. 连接拒绝:检查pg_hba.conf授权、防火墙端口、主从库网络互通
# 2. 权限不足:检查数据目录权限是否为postgres:postgres
# 3. WAL日志不足:调整主库wal_keep_size参数,或配置归档目录
# 4. 密码错误:验证repl_user密码是否一致
五、主从复制常用操作
1. 切换主从(故障转移,简易版)
当主库故障时,可将从库提升为主库:
bash
# 从库执行(停止恢复模式,提升为主库)
su - postgres
psql -c "SELECT pg_promote();"
# 验证:提升后从库pg_is_in_recovery()返回f
psql -c "SELECT pg_is_in_recovery();"
2. 监控复制延迟
bash
# 从库执行,查看复制延迟(单位:秒)
SELECT
now() - pg_last_xact_replay_timestamp() AS replication_delay;
3. 新增从库
只需重复 "从库配置" 步骤,使用主库(或现有从库,需开启级联复制)的pg_basebackup备份初始化即可。