首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >PostgreSQL-主从复制(Replication)部署

PostgreSQL-主从复制(Replication)部署

作者头像
运维小路
发布2026-01-26 12:31:15
发布2026-01-26 12:31:15
1480
举报
文章被收录于专栏:运维小路运维小路

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

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。

MySQL

PostgreSQL(本章节)

MongoDB

Redis

Etcd

前面一个小节我们介绍了PostgreSQL的主从原理,并且里面还涉及到两种不同的主从模式:物理复制和逻辑复制。今天这个小节我们就来先来介绍物理复制,有点类似MySQL的主从(全量的复制)。

一.机器准备

IP地址

系统

角色

192.168.31.188

centos 7.9 + pg14

Master

192.168.31.189

centos 7.9 + pg14

Slave

二.环境初始化

代码语言:javascript
复制
1.关闭防火墙
2.关闭selinux
3.时间同步
4.修改主机名,如果有要求
#当然这些其实很多软件都会有类似的要求 

三.安装PostgreSQL

主库复用前面的的我们部署的版本,下面是从库的部署。

代码语言:javascript
复制
#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配置

代码语言:javascript
复制
#创建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  
  • host:表示这条记录用于TCP/IP连接,可以是IPv4或IPv6。
  • replication:表示这条记录用于复制连接(流复制)。all表示允许所有数据库。在复制上下文中,这里写all或者replication都可以,但通常我们使用replication来指定复制连接。
  • replica:表示主从账号,或者其他连接数据库的账号。
  • 192.168.31.0/24:表示允许来自这个IP网段的连接。即IP地址在192.168.31.1到192.168.31.254之间的主机。
  • md5:表示连接需要使用MD5加密的密码认证。

注意:PostgreSQL的允许客户端ip配置并不在账号里面,而是在这里指定。

Slave配置

数据库安装完成以后,不需要初始化,也不需要启动。如果已经初始化可先删除数据目录,再停止服务再来一次,这里的密码是主从的密码,而非操作系统密码。

历史数据同步

代码语言:javascript
复制
pg_basebackup \
  -D /var/lib/pgsql/14/data \
  -h 192.168.31.188 \
  -p 5432 \
  -U replica \
  -X stream \
  -P \
  -v
代码语言:javascript
复制
备份数据的目标目录

从服务器配置

代码语言:javascript
复制
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':自动追随最新的时间线(推荐用于流复制)。

代码语言:javascript
复制
vi /var/lib/pgsql/14/data/standby.signal
standby_mode = on

standby.signal 文件的存在告诉 PostgreSQL:这个实例是一个备用服务器,启动时应该进入恢复模式并连接到主库进行流复制。

五.启动从服务器

代码语言:javascript
复制
#由于我们在root下复制的文件所以需要手工设置数据目录权限
chown postgres.postgres /var/lib/pgsql/14/data/*
systemctl enable postgresql-14
systemctl start postgresql-14  

六.检查主从状态

主节点执行

代码语言:javascript
复制
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地址

从节点执行

代码语言:javascript
复制
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

主库端口

这样我们的主从复制就打算完成。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-11-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MongoDB
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档