PostgreSQL流复制(主从复制)详细教程

 更新时间:2025年11月06日 10:33:13   作者:裴东青  
本文详细介绍了PostgreSQL流复制技术,流复制通过WAL日志实时同步主从库数据,支持异步和同步两种模式,具有一定的参考价值,感兴趣的可以了解一下

一、流复制简介

在数据库业务中,为了防止单点故障的发生、提高数据库服务器的服务性能,一般都会采用「主从复制」集群来保障数据库中数据的高可用。

而在 PostgreSQL 中,主从复制有其特定的技术名称 ——流复制(Streaming Replication)。主从复制是所有数据库主从架构的统称,而流复制是 PostgreSQL 实现主从复制的核心技术,也是最常用的方式,特点是从库实时(流式)接收主库的 WAL 日志并应用,延迟较低。PostgreSQL 中更推荐用 “主库(Primary)” 和 “从库(Standby)” 替代 “Master/Slave” 的说法。

此外,PostgreSQL 的流复制还可细分:

  • 异步流复制(默认):主库写入数据后无需等待从库确认,性能高,可能有少量延迟。
  • 同步流复制:主库写入数据后,必须等待从库确认已接收 WAL 日志才返回成功,安全性高但性能略低。

二、流复制原理与步骤

PostgreSQL 流复制的核心依赖于其WAL(Write-Ahead Logging,预写日志)机制,这是PostgreSQL 保证数据一致性的基础,也是复制的 “数据源”。

1. WAL 日志的作用

  • 主库执行任何数据修改操作(增删改)时,会先将操作记录写入 WAL 日志(类似 “操作日志”,相当于MySQL中的binlog),再更新实际数据文件。
  • 即使主库突然崩溃,重启后可通过 WAL 日志恢复未完成的操作,保证数据一致性。
  • 对复制而言:WAL 日志是主从数据同步的 “桥梁”—— 从库通过获取并应用主库的 WAL 日志,即可复现主库的所有操作,保持数据一致。

2. 流复制的核心进程

主库(Primary)

wal_sender进程:当从库连接主库时,主库会启动wal_sender进程,负责将 WAL 日志实时发送给从库。

从库(Standby)

wal_receiver 进程:从库启动后,会启动 wal_receiver 进程,主动连接主库wal_sender,接收 WAL 日志并写入从库的 WAL 文件。

startup 进程:负责读取本地接收的 WAL 日志,并将日志中的操作应用到从库的数据文件中,最终实现数据同步。

3.流复制的同步步骤

1.主库每执行一次数据修改(如插入、更新),都会生成新的 WAL 记录并写入本地 WAL 文件。

2.从库启动后,wal_receiver 进程根据 postgresql.conf 中 primary_conninfo 的配置(主库 IP、复制用户、密码),主动连接主库的 5432 端口。

3.主库验证从库的连接(通过 pg_hba.conf 配置的权限)后,启动 wal_sender 进程,开始向从库实时流式传输新生成的 WAL 日志(从备份结束的位置开始,避免重复传输)。

4.从库的 wal_receiver 接收 WAL 日志后,写入本地的 WAL 文件。从库的 startup 进程读取本地 WAL 文件,将日志中的操作逐条应用到从库的数据文件中,最终实现与主库的数据一致。

三、流复制的实现

  • 操作系统:CentOS7
  • PostgreSQL版本:psql (PostgreSQL) 13.22
  • 主库IP:11.0.0.136
  • 从库IP:11.0.0.137

1、准备工作

# 1.关闭防火墙
     systemctl stop firewalld
     systemctl disable firewalld
# 或者开放5432端口
	 firewall-cmd --add-port=5432/tcp --permanent
	 firewall-cmd --reload
# 2.关闭SELINUX
     setenforce 0
     sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
# 3.同步时间
     ntpdate ntp.ntsc.ac.cn
# 4.确保你的YUM源可用

2、安装PostgreSQL(主从库都安装)

进入官网:https://www.postgresql.org/download/

选择相应操作系统和版本

# 1、安装 PostgreSQL 官方的 YUM 源配置包
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 2、安装 PostgreSQL 的服务器端程序
yum install -y postgresql13-server
# 3、初始化 PostgreSQL 的数据库集群
/usr/pgsql-13/bin/postgresql-13-setup initdb
# 4、启动 PostgreSQL 并设置开机自启
systemctl enable postgresql-13
systemctl start postgresql-13
# 5、验证安装
psql --version

3、主库配置

1、修改主库核心配置

vim /var/lib/pgsql/13/data/postgresql.conf 
# 添加以下内容
-----------------------------------------------------------------------------------------
# 允许所有IP连接(生产环境可指定从库IP)
listen_addresses = '*'
# WAL日志级别(至少为replica才能支持流复制)
wal_level = replica
# 允许的最大复制连接数(至少1,建议3-5)
max_wal_senders = 3
# 保留的WAL日志大小(防止从库同步时WAL被删除,建议1GB)
wal_keep_size = 1GB
# 开启归档模式(流复制依赖归档)
archive_mode = on
# 归档命令(暂时用/bin/true表示不实际归档,仅开启模式)
archive_command = '/bin/true'
-----------------------------------------------------------------------------------------

2、配置主库访问控制

vim /var/lib/pgsql/13/data/pg_hba.conf
# 添加以下内容
-----------------------------------------------------------------------------------------
# 允许从库(11.0.0.137)通过 replica 用户进行复制(md5 密码验证)
# host  数据库 / 功能     用户名  	       从库IP  				 认证方式
host    replication     replica         11.0.0.137/32           md5
-----------------------------------------------------------------------------------------

3、创建复制专用用户(replica)

# 1、切换到postgres用户
su - postgres
# 2、进入数据库
psql
# 3、创建复制专用用户,设置密码
CREATE ROLE replica REPLICATION LOGIN ENCRYPTED PASSWORD 'peidongqing@123';
# 4、 退出psql
\q
# 5、退出postgres用户
exit
# 6、重启主库
systemctl restart postgresql-13

4、从库配置

1、停止从库服务并清空默认数据

从库需使用主库的备份数据初始化,因此先删除默认数据

# 停止从库PostgreSQL服务
systemctl stop postgresql-13
# 清空从库数据目录(默认路径)
rm -rf /var/lib/pgsql/13/data/*

2、从主库同步基础数据

# 切换到postgres用户(确保权限正确)
su - postgres
# 执行基础备份(从主库11.0.0.136同步数据到从库)
pg_basebackup -h 11.0.0.136 -U replica -D /var/lib/pgsql/13/data/ -Fp -Xs -P

执行后会提示输入密码,输入设置的replica用户密码peidongqing@123,等待备份完成

  • -h 11.0.0.136:主库 IP
  • -U replica:复制用户
  • -D:从库数据目录(需与主库一致)
  • -Fp:输出格式为原始文件(非压缩)
  • -Xs:备份时自动复制 WAL 日志(确保数据一致性)
  • -P:显示进度

3、配置从库连接主库

# 切换到root用户,编辑从库配置文件
vim /var/lib/pgsql/13/data/postgresql.conf
-----------------------------------------------------------------------------------------
# 从库连接主库的信息
primary_conninfo = 'host=11.0.0.136 port=5432 user=replica password=peidongqing@123'
# 允许从库只读查询
hot_standby = on
-----------------------------------------------------------------------------------------

4、创建standby.signal文件,启用从库模式

# 切换到postgres用户,创建信号文件
su - postgres
touch /var/lib/pgsql/13/data/standby.signal
# 退出postgres用户
exit
# 启动从库服务
systemctl start postgresql-13
systemctl enable postgresql-13

5、验证主从复制

主从验证均是通过postgres用户登录数据库验证

# 切换 postgres 用户
su - postgres
# 进入数据库
psql

1、连接状态验证

主库

SELECT client_addr, state FROM pg_stat_replication;

# 成功输出
 client_addr |   state   
-------------+-----------
 11.0.0.137  | streaming
(1 行记录)

从库

SELECT status FROM pg_stat_wal_receiver;

# 成功输出
  status   
-----------
 streaming
(1 行记录)

2、数据同步验证

主库

# 创建数据表
CREATE TABLE test_replica (id int);
# 插入数据
INSERT INTO test_replica VALUES (11111);

从库

SELECT * FROM test_replica;

# 成功输出
    id 
---------
  111111
(1 行记录)

总结

通过以上步骤,PostgreSQL 13 一主一从流复制架构已搭建完成:

  • 主库(11.0.0.136)负责写入数据,并通过 WAL 日志同步到从库。
  • 从库(11.0.0.137)实时接收主库日志,保持数据一致,支持只读查询。
  • 若主库故障,可手动将从库提升为主库。

到此这篇关于PostgreSQL流复制(主从复制)详细教程的文章就介绍到这了,更多相关PostgreSQL流复制(主从复制)内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 常用 PostgreSQL 数据恢复方案及使用示例

    常用 PostgreSQL 数据恢复方案及使用示例

    这篇文章主要介绍了常用 PostgreSQL 数据恢复方案概览,数据丢失通常是由 DDL 与 DML 两种操作引起,由于在操作系统中表文件已经不存在,所以只能采用恢复磁盘的方法进行数据恢复,需要的朋友可以参考下
    2022-01-01
  • PostgreSQL 对IN,EXISTS,ANY/ALL,JOIN的sql优化方案

    PostgreSQL 对IN,EXISTS,ANY/ALL,JOIN的sql优化方案

    这篇文章主要介绍了PostgreSQL 对IN,EXISTS,ANY/ALL,JOIN的sql优化方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL数据库时间类型相加减操作

    PostgreSQL数据库时间类型相加减操作

    PostgreSQL提供了许多函数,这些函数返回与当前日期和时间相关的值,下面这篇文章主要给大家介绍了关于PostgreSQL数据库时间类型相加减操作的相关资料,需要的朋友可以参考下
    2023-10-10
  • 关于PostgreSQL JSONB的匹配和交集问题

    关于PostgreSQL JSONB的匹配和交集问题

    这篇文章主要介绍了PostgreSQL JSONB的匹配和交集问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • postgresql pg_hba.conf 简介及配置详解

    postgresql pg_hba.conf 简介及配置详解

    配置文件之pg_hba.conf该文件用于控制访问安全性,管理客户端对于PostgreSQL服务器的访问权限,本文给大家介绍postgresql pg_hba.conf 简介及配置,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • postgresql数据库设置id自增的基本方法举例例子解析

    postgresql数据库设置id自增的基本方法举例例子解析

    这篇文章主要给大家介绍了关于postgresql数据库设置id自增的基本方法举例,文章介绍了在PostgreSQL中实现自增ID的两种方法,分别是使用序列和触发器,序列方法简单直接,而触发器和函数方法则提供了更大的灵活性,需要的朋友可以参考下
    2024-11-11
  • PostgreSQL表分区的三种方式和操作方法

    PostgreSQL表分区的三种方式和操作方法

    在 PostgreSQL 中,处理数据的分区表的分区数量和大小的平衡是一个非常重要的问题,这篇文章主要介绍了PostgreSQL表分区的三种方式和操作方法,需要的朋友可以参考下
    2025-10-10
  • SQL Server数据迁移至PostgreSQL出错的解释以及解决方案

    SQL Server数据迁移至PostgreSQL出错的解释以及解决方案

    最近对SQL Server到PostgreSQL的数据迁移时出现了问题,返回的错误为:invalid byte sequence for encoding "UTF8": 0x00。经查证pg源代码,该问题引起的原因是sql server的字符类型字段中含有空字符\0,该字符在pg中不支持。
    2014-09-09
  • PostgreSQL 允许远程访问设置的操作

    PostgreSQL 允许远程访问设置的操作

    这篇文章主要介绍了PostgreSQL 允许远程访问设置的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • postgresql 计算两点距离的2种方法小结

    postgresql 计算两点距离的2种方法小结

    这篇文章主要介绍了postgresql 计算两点距离的2种方法小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01

最新评论