作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。
MySQL
PostgreSQL(本章节)
Redis
Etcd
前面一个小节我们介绍了PostgreSQL的主从原理,并且里面还涉及到两种不同的主从模式:物理复制和逻辑复制。今天这个小节我们就来先来介绍物理复制,有点类似MySQL的主从(全量的复制)。
一.机器准备
IP地址 | 系统 | 角色 |
|---|---|---|
192.168.31.188 | centos 7.9 + pg14 | Master |
192.168.31.189 | centos 7.9 + pg14 | Slave |
二.环境初始化
1.关闭防火墙
2.关闭selinux
3.时间同步
4.修改主机名,如果有要求
#当然这些其实很多软件都会有类似的要求 三.安装PostgreSQL
主库复用前面的的我们部署的版本,下面是从库的部署。
#1.配置yum源
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
#2.安装pg
yum install -y postgresql14-server四.主从配置
Master配置
#创建pg备份账号,需要先用psql进入控制台。
CREATE ROLE replica login replication encrypted password 'replica';
#创建了一个角色:replica 并设置了登录和复制权限,密码是:replica
#编辑配置文件
vi /var/lib/pgsql/14/data/postgresql.conf
listen_addresses = '*' #默认是localhost,改成监听本机所有网卡,然后把注释取消。
wal_level = replica #默认就是这个配置,删除注释即可
#编辑配置文件,添加这样一行
vi /var/lib/pgsql/14/data/pg_hba.conf
host replication replica 192.168.31.0/24 md5 #配置上面定义的用户名
#启动pg
systemctl enable postgresql-14
systemctl start postgresql-14 注意:PostgreSQL的允许客户端ip配置并不在账号里面,而是在这里指定。
Slave配置
数据库安装完成以后,不需要初始化,也不需要启动。如果已经初始化可先删除数据目录,再停止服务再来一次,这里的密码是主从的密码,而非操作系统密码。
历史数据同步
pg_basebackup \
-D /var/lib/pgsql/14/data \
-h 192.168.31.188 \
-p 5432 \
-U replica \
-X stream \
-P \
-v备份数据的目标目录
从服务器配置
vi /var/lib/pgsql/14/data/postgresql.conf
primary_conninfo = 'host=192.168.0.130 port=5432 user=replica password=replica'
recovery_target_timeline = 'latest'recovery_target_timeline = 'latest'
作用:指定从库应该追随哪个时间线进行恢复。'latest':自动追随最新的时间线(推荐用于流复制)。
vi /var/lib/pgsql/14/data/standby.signal
standby_mode = onstandby.signal 文件的存在告诉 PostgreSQL:这个实例是一个备用服务器,启动时应该进入恢复模式并连接到主库进行流复制。
五.启动从服务器
#由于我们在root下复制的文件所以需要手工设置数据目录权限
chown postgres.postgres /var/lib/pgsql/14/data/*
systemctl enable postgresql-14
systemctl start postgresql-14 六.检查主从状态
主节点执行
postgres=# select application_name, state, sync_priority, sync_state from pg_stat_replication;
application_name | state | sync_priority | sync_state
------------------+-----------+---------------+------------
walreceiver | streaming | 0 | async
(1 row)
postgres=# select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication;
pid | state | client_addr | sync_priority | sync_state
------+-----------+----------------+---------------+------------
1227 | streaming | 192.168.31.189 | 0 | async
(1 row)
postgres=#
字段 | 值 | 含义 |
|---|---|---|
application_name | walreceiver | 从库的连接标识符(默认名称) |
state | streaming | 复制状态正常,正在流式传输数据 |
sync_priority | 0 | 同步优先级为0,表示异步复制 |
sync_state | async | 异步复制模式 |
pid | 1227 | 主库上 WAL Sender 进程的PID |
client_addr | 192.168.31.189 | 从库的IP地址 |
从节点执行
postgres=# SELECT * FROM pg_stat_wal_receiver;
pid | status | receive_start_lsn | receive_start_tli | written_lsn | flushed_lsn | received_tli | last_msg_send_time | last_msg_receipt_time | latest_end_lsn | latest_end_time | slot_name | sender_host | sender_port |
conninfo
------+-----------+-------------------+-------------------+-------------+-------------+--------------+-------------------------------+-------------------------------+----------------+-------------------------------+-----------+----------------+-------------+-------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1352 | streaming | 0/3000000 | 1 | 0/3000148 | 0/3000148 | 1 | 2025-11-05 00:03:17.281153+08 | 2025-11-05 00:03:17.291268+08 | 0/3000148 | 2025-11-04 23:59:16.673189+08 | | 192.168.31.188 | 5432 | user=replica password=******** channel_binding=prefer dbname=replication host=192.168.31.188 port=5432
fallback_application_name=walreceiver sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any
(1 row)
字段 | 值 | 含义 |
|---|---|---|
pid | 1352 | WAL 接收器进程的 PID |
status | streaming | 状态正常,正在流式接收数据 |
receive_start_lsn | 0/3000000 | 开始接收 WAL 的起始位置 |
receive_start_tli | 1 | 开始接收时的时间线 ID |
written_lsn | 0/3000148 | 已写入磁盘的 WAL 位置 |
flushed_lsn | 0/3000148 | 已刷盘确认的 WAL 位置 |
received_tli | 1 | 当前接收的时间线 ID |
sender_host | 192.168.31.188 | 主库 IP 地址 |
sender_port | 5432 | 主库端口 |
这样我们的主从复制就打算完成。