PostgreSQL主从复制部署

目录

一、环境准备

[1. 基础环境要求](#1. 基础环境要求)

[2. 前置操作(主从库均执行)](#2. 前置操作(主从库均执行))

二、主库(Master)配置

[1. 修改 PostgreSQL 主配置文件](#1. 修改 PostgreSQL 主配置文件)

[2. 修改客户端认证配置文件](#2. 修改客户端认证配置文件)

[3. 创建复制专用用户](#3. 创建复制专用用户)

[4. 重启主库使配置生效](#4. 重启主库使配置生效)

[5. 备份主库数据(供从库初始化)](#5. 备份主库数据(供从库初始化))

三、从库(Slave/Standby)配置

[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备份初始化即可。

相关推荐
l1t2 小时前
wsl docker安装达梦数据库的过程
数据库·docker·容器·达梦
白沙王2 小时前
c上传一个excle表格,获取表格的表头,将表头内容创建实体类,并将实体类创建数据库表
数据库
半路_出家ren2 小时前
Python操作MySQL(详细版)
运维·开发语言·数据库·python·mysql·网络安全·wireshark
共享家95272 小时前
MYSQL-内外连接
开发语言·数据库·mysql
古城小栈2 小时前
Go 语言 Flight Recorder:低开销性能分析工具实战
数据库·golang
weixin_446260852 小时前
Turso 数据库——以 Rust 编写的高效 SQL 数据库
数据库·sql·rust
前方一片光明9 小时前
SQL SERVER——生成sql:删除所有log表中,user_name是某用户的数据
数据库·sql·oracle
Gauss松鼠会10 小时前
【GaussDB】在duckdb中查询GaussDB的数据
数据库·sql·database·gaussdb
虹科网络安全10 小时前
艾体宝洞察 | Redis vs ElastiCache:哪个更具成本效益?
数据库·redis·缓存