初学者的PostgreSQL主从流复制指南

发表时间: 2023-04-07 10:35

一 PostgreSQL主从流复制基础

1.1 物理复制和逻辑复制

物理复制也称为流复制,是实例级别的复制。

流复制同步方式有同步、异步两种,如果主节点和备节点不是很忙,通常异步模式下备库和主库的延迟时间能控制在毫秒级。

逻辑复制也称之为选择性复制,可以做到基于表级别的复制。

WAL:Write-Ahead Logging 日志记录数据库的变化,格式为二进制格式,当主机异常断电时,如果WAL文件已经写入成功,但还没来得及刷新数据文件,当数据库再次启动时会根据WAL日志文件信息进行事务前回滚,从而恢复数据库到一致性状态。

流复制是基于WAL物理复制,逻辑复制是基于WAL逻辑解析,将WAL解析成一种清晰、易于理解的格式。

1.2 流复制和逻辑复制的差异

  • 流复制是物理复制,其核心原理是主库将预写日志WAL日志流发送给备库,备库接收到WAL日志流后进行重做,因此流复制是基于WAL日志文件的物理复制。
  • 逻辑复制的核心原理也是基于WAL,逻辑复制会根据预先设置好的规则解析WAL日志,将WAL二进制文件解析成一定格式的逻辑变化信息。
  • 流复制只能对PostgreSQL实例级进行复制,而逻辑复制能够对数据库表级进行复制。
  • 流复制能对DDL操作进行复制,而逻辑复制主库上的DDL操作不会复制到备库。
  • 流复制主库可读写,但从库只允许查询不允许读写,而逻辑复制的从库可读写。
  • 流复制要求PostgreSQL大版本必须一致,而逻辑复制支持跨PostgreSQL大版本。

二 PostgreSQL主从流复制安装

注意:由于PG12版本开始不再支持通过recovery.conf的方式进行主备切换,如果数据目录中存在recovery.conf,则数据库无法启动。

2.1 服务器规划

192.168.0.99 db01 主库

192.168.0.100 db02 从库

2.2 准备数据库环境

安装PostgreSQL 15.2,之前的文章已分享PG15.2的安装方法,此处不再赘述。

2.3 修改配置文件

主库操作

cd /web/data_5432

vim postgres.conf

listen_addresses = '*'

port = 5432

max_connections = 100

wal_level = hot_standby

hot_standby = on

archive_mode = on

max_wal_senders = 10

wal_sender_timeout = 180s


vim pg_hba.conf

host all all 192.168.0.0/24 md5

host replication rep 192.168.0.100/32 md5

启动数据库

su - postgres

/web/pgsql/bin/pg_ctl -D /web/data_5432 -l /web/data_5432/logfile start

登录数据库

/web/pgsql/bin/psql

创建用于复制的用户

create user rep replication login encrypted password 'test123!@#';

从库操作

切换到root用户

ctrl +d

删除data_5432目录下所有数据(保留data_5432目录)

cd /web/data_5432

rm -fr *

备份主库数据库

cd /web/pgsql/bin

./pg_basebackup -R -D /web/data_5432/ -Fp -Xs -v -P -h 192.168.0.99 -U rep -p 5432

chown -R postgres.postgres /web/data_5432/

启动数据库

su - postgres

/web/pgsql/bin/pg_ctl -D /web/data_5432 -l /web/data_5432/logfile start

查看流复制同步效果

select pg_is_in_recovery();

查看主从信息

cd /web/pgsql/bin

./pg_controldata /web/data_5432/

2.4 验证主从流复制

主库操作

创建测试库并建表插入数据,并验证主从复制性

create database test with template = template0 owner = postgres;

\c test;

create table test(id int primary key,name varchar(20),salary real);

\d test;

insert into test values(10,'hf qgutech',10000.00);

insert into test values(2,'wang jie',12000.00);

至此,PostgreSQL主从流复制安装完成。