PostgreSQL

关注公众号 jb51net

关闭
首页 > 数据库 > PostgreSQL > PostgreSQL流复制(主从复制)

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

作者:裴东青

本文详细介绍了PostgreSQL流复制技术,流复制通过WAL日志实时同步主从库数据,支持异步和同步两种模式,具有一定的参考价值,感兴趣的可以了解一下

一、流复制简介

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

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

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

二、流复制原理与步骤

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

1. 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 文件,将日志中的操作逐条应用到从库的数据文件中,最终实现与主库的数据一致。

三、流复制的实现

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,等待备份完成

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 一主一从流复制架构已搭建完成:

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

您可能感兴趣的文章:
阅读全文