PostgreSQL主从复制–物理复制

1、复制类型

PostgreSQL支持物理复制(流复制)及逻辑复制2种。通过流复制技术,可以从实例级复制出一个与主库一模一样的实例级的从库。流复制同步方式有同步、异步两种。

另一种复制方式为逻辑复制,区别于物理复制的是物理复制是基于实例级的复制,只能复制整个PostgreSQL实例,而不能基于部分库及表。从PostgreSQL10开始,出现了基于表级别的复制,即逻辑复制。

2、流复制

主库安装及从库编译此处就省略了,直接进入主从复制的安装环节。

(1) 修改主库配置文件postgresql.conf

/*  除了基础参数,搭建备库至少需要配置如下参数 */
listen_address='*'
wal_level=replica
archive_mode=on
archive_command='cp %p /data/postgresql/archive/%f '
max_wal_senders=10
wal_keep_segments=1024
hot_standby=on

参数简要说明:

  • listen_address: 按需设置,本次测试配置为所有主机均可以访问,生产环境可以按需配置网段或IP等。
  • wal_level: 设置流复制模式至少设置为replica。
  • archive_mode: 本次启用归档。
  • archive_command:WAL日志归档命令,生产环境可以将归档拷贝到对应目录或其他机器上,本次测试配置为归档到本机的另一个目录下。
  • max_wal_senders:最大WAL发送进程数,此数量需大于等于从库个数且比max_connections小。
  • wal_keep_segments:pg_wal目录下保留WAL日志的个数,每个WAL文件默认16M,为保障从库能在应用归档落后时依旧能追上主库,此值建议设置较大一点。
  • hot_standby:此参数控制在恢复归档期间是否支持只读操作,设置为ON后从库为只读模式。

注意:上述参数中有涉及归档日志的路径,需手动创建

mkdir-p/data/postgresql/archive/

(2)创建复制账号

为了数据安全及便于权限控制,创建一个复制专用的数据库账号。

postgres=#createuserreplREPLICATIONLOGINENCRYPTEDPASSWORD'repl123';
CREATEROLE

(3)修改配置文件pg_hba.conf

添加复制账号的权限,因可能会主从切换,因此 主从机器的IP均添加。也可以设置网段,以便于后期添加从库。

#replicationprivilege.
localreplicationalltrust
hostreplicationall127.0.0.1/32trust
hostreplicationall ::1/128trust
hostreplicationrepl192.168.56.33/24md5
hostreplicationrepl192.168.56.32/24md5

(4)备份数据

从机上在线备份主库数据,并将数据放在指定路径,此路径建议与主库路径一致。可以使用pg_basebackup。

命令在线热备份,具体命令如下:

pg_basebackup-h192.168.56.32-Urepl-p5432-Fp-Xs-v-P-R-D/data/postgresql/data/-lpostgres32

pg_basebackup命令中的参数说明:

  • -h 指定连接的数据库的主机名或IP地址,这里就是主库的ip。
  • -U 指定连接的用户名,此处是我们刚才创建的专门负责流复制的repl用户。
  • -F 指定生成备份的数据格式,支持p(plain原样输出)或者t(tar格式输出)。
  • -X 表示备份开始后,启动另一个流复制连接从主库接收WAL日志,有 f(fetch)和s (stream)两种方式,建议使用s方式。
  • -P 表示显示数据文件、表空间传输的近似百分比 允许在备份过程中实时的打印备份的进度。
  • -v 表示启用verbose模式,命令执行过程中会打印各阶段日志,建议启用。
  • -R 表示会在备份结束后自动生成recovery.conf文件,这样也就避免了手动创建。
  • -D 指定把备份写到哪个目录,这里尤其要注意一点就是做基础备份之前从库的数据目录(/data/postgresql/data)目录需要手动清空。
  • -l 表示指定个备份的标识,运行命令后可以看到进度提示。

以上备份命令输出过程如下:

[postgres@PG33data]$pg_basebackup-h192.168.56.32-Urepl-p5432-Fp-Xs-v-P-R-D/data/postgresql/data/-lpostgres32
Password:
pg_basebackup: initiatingbasebackup, waitingforcheckpointtocomplete
pg_basebackup: checkpointcompleted
pg_basebackup: write-aheadlogstartpoint: 0/2000028ontimeline1
pg_basebackup: startingbackgroundWALreceiver
pg_basebackup: createdtemporaryreplicationslot"pg_basebackup_17737"
56041/56041kB (100%), 1/1tablespace
pg_basebackup: write-aheadlogendpoint: 0/20000F8
pg_basebackup: waitingforbackgroundprocesstofinishstreaming ...
pg_basebackup: basebackupcompleted

从以上日志信息看出pg_basebackup命令首先对数据库做一次checkpoint,之后基于时间点做一个全库基准备份,全备过程中会拷贝$PGDATA数据文件和表空间文件到备库节点对应目录。

(5)修改recovery.conf

以上备份命令中生成了recovery.conf 文件,因此简单修改即可。

standby_mode='on'
primary_conninfo='user=repl password=repl123 host=192.168.56.32 port=5432 sslmode=disable sslcompression=0 target_session_attrs=any'
##添加如下信息
recovery_target_timeline='latest'

参数说明:

  • standby_mode:设置是否启用数据库为备库,如果设置成on,备库会不停地从主库上获取WAL日志流,直到获取主库上最新的WAL日志流
  • primary_conninfo:设置主库的连接信息,这里设置了主库IP、端口、用户名信息等,此处是明文密码,生产环境建议配置非明文密码,而是将密码配置在另一个隐藏文件中
  • covery_target_timeline:设置恢复的时间线(timeline),默认情况下是恢复到基准备份生成时的时间线,设置成latest表示从备份中恢复到最近的时间线,通常流复制环境设置此参数为latest,复杂的恢复场景可将此参数设置成其他值

(6)启动从库

直接使用pg_ctl或配置服务启动从库即可。

pg_ctl  -D /data/postgresql/data/  -l pg33.log  start

如果启动过程中出现如下错误。

waitingforservertostart....2019-09-2610:40:54.327CST [10267] FATAL:  datadirectory"/data/postgresql/data"hasinvalidpermissions
2019-09-2610:40:54.327CST [10267] DETAIL: Permissionsshouldbeu=rwx (0700) oru=rwx,g=rx (0750).
stoppedwaiting
pg_ctl: couldnotstartserve
Examinethelogoutput.

则需要先修改权限,再启动即可。

[postgres@PG33data]$chmod0750/data/postgresql/data/
[postgres@PG33data]$pg_ctl-D/data/postgresql/data/-lpg33.logstart
waitingforservertostart.... done
serverstarted

(7)测试主从同步

在主库创建表并新增数据。

[postgres@PG32~]$psql
psql (11.4)
Type"help"forhelp.
postgres=#createtabletest2(idintprimarykey, namevarchar(20));
CREATETABLE
postgres=#insertintotest2values(1,'aaa'),(2,'abc');
INSERT02

在从库查看。

[postgres@PG33data]$psql
psql (11.4)
Type"help"forhelp.
postgres=#select*fromtest2;
id|name
----+------
1|aaa
2|abc

数据已正常同步。

(8)查看复制状态

通过pg_stat_replication视图可以查看复制状态

postgres=#selectpid ,usesysid,usename,client_addr,state,sync_statefrompg_stat_replication;
pid|usesysid|usename|client_addr|state|sync_state
-------+----------+---------+----------------+-----------+------------
25123|16797|repl|192.168.56.33|streaming|async
(1row)

以上查询结果sync_state字段值为async,表示主备数据复制使用异步方式;state值为streaming,表示流复制方式。

(9)调整为同步复制

前面的步骤部署的为异步复制,如想配置为同步复制,则调整recovery.conf配置文件里的 synchronous_commit及synchronous_standby_names 后重启或reload即可。

synchronous_commit=remote_write
synchronous_standby_names='PG33'

之后再查看结果如下:

postgres=#selectpid ,usesysid,usename,client_addr,state,sync_statefrompg_stat_replication;
pid|usesysid|usename|client_addr|state|sync_state
-------+----------+---------+----------------+-----------+------------
16265|16797|repl|192.168.56.33|streaming|sync
(1row)

此时状态已变为同步复制了。

注:synchronous_commit 有多种方式,在流复制模式下,主要设置情况如下:

  • remote_write: 当流复制主库提交事务时,需等待备库接收主库发送的WAL日志流并写入备节点操作系统缓存中,之后向客户端返回成功,这种情况下备库实例出现异常关闭时不会有已传送的WAL日志丢失风险,但备库操作系统异常宕机就有已传送的WAL丢失风险了,此时WAL可能还没完全写入备节点WAL文件中,简单地说remote_write表示本地WAL已落盘,备库的WAL还在备库操作系统缓存中,也就是说只有一份持久化的WAL,这个选项带来的事务响应时间较低
  • on: 设置成on表示流复制主库提交事务时,需等待备库接收主库发送的WAL日志流并写入WAL文件,之后才向客户端返回成功,简单地说on表示本地WAL已落盘,备库的WAL也已落盘,也就是说有两份持久化的WAL,但备库此时还没有完成重做,这个选项带来的事务响应时间较高
  • remote_apply: 表示表示流复制主库提交事务时,需等待备库接收主库发送的WAL并写入WAL文件,同时备库已经完成重做,之后才向客户端返回成功,简单地说remote_apply表示本地WAL已落盘,备库WAL已落盘并且已完成重做,这个设置保证了拥有两份持久化的WAL,同时备库也完成了重做,这个选项带来的事务响应时间最高,即性能最差。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/305568.html<

(0)
运维的头像运维
上一篇2025-05-26 06:20
下一篇 2025-05-26 06:21

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注