当前位置: 首页 > news >正文

PostgreSQL13主从同步异步流复制

PostgreSQL13主从同步异步流复制

介绍

PostgreSQL早在9.0版本开始支持物理复制,也可称为流复制( Streaming Replication,通过流复制技术,可以从实例级复制出一个与主库一模一样的从库 (也称之为备库)。举个简单的例子,在主机pghost1上创建了一个PostgreSQL实例,并在实例上创建多个数据库,通过流复制技术可以在另外一台主机如pghost2上创建一个热备只读PosgreSQL实例,我们通常将pghost1上的数据库称为主库(Primary Database或Master), pghost2 上的数据库称为备库(Standby Database或Slave), pghostl1 称为主节点,pghost2 称为备节点。流复制同步方式有同步、异步两种,如果主节点和备节点不是很忙,通常异步模式下备库和主库的延迟时间能控制在毫秒级。

流复制根据同步方式分为异步流复制和同步流复制,异步流复制是指主库上提交事务时不需要等待备库接收WAL日志流并写入到备库WAL日志文件时便返回成功,而同步流复制相反。

接下来介绍的流复制是基于异步流复制的,使用pg_basebackup方式部署。

pg_basebackup工具是对数据库实例级进行的备份,因此这个工具通常作为备份工具对据库进行基准备份。

pg_basebackup工具发起备份需要超级用户权限或REPLICATION权限,注意max_wal_senders 参数配置,因为pg_basebackup工具将消耗至少一个WAL发送进程。如果从库之前有过数据库只要先停备库之后删除备库数据库数据文件即可。

操作

数据库备份

主库在操作前先将数据库备份,以免在操作过程中出现失误,误删数据库等

./pg_dump -p 11001 -U postgres  jssc_data_base  > /usr/local/data/pgdata/jssc_data_base.backup

主库创建流复制的用户

CREATE ROLE replica login replication encrypted password '123456';

image-20221007154319079

主库修改pg_hba.conf文件

允许备库IP通过复制用户访问数据库

[postgres@pgprimary data]$ vim pg_hba.conf

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
# IPv6 local connections:
host    all             all             ::1/128                 scram-sha-256
host    all             all             0.0.0.0/0                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     md5
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256
host    replication     all             0.0.0.0/0               scram-sha-256

最后一行,添加了replica用户可以从任意ip访问主库。

从库上执行对于主库的基础备份

创建数据目录

su postgres
mkdir /home/data/pgdata

进入postgres的bin目录下执行pg_basebackup命令

pg_basebackup -h 192.168.1.1 -p 5432 -U replica --password -X stream -Fp --progress -D /home/data/pgdata -R

注意,备份选项上带有-R选项。

image-20221007134600899

等待数据库文件同步完成,完成后可以看到文件以及文件夹全部同步过来了

image-20221007174106975

分析

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

  • -D:参数表示指定备节点用来接收主库数据的目标路径,可以和主库不一样。

  • -F:参数指定pg_basebackup命令生成的备份数据格式,支持两种格式,p(plain)格式和t(tar)格式,p(plain) 格式是指生成的备份数据和主库上的数据文件布局一样,也就是说类似于操作系统命令将数据库$PGDATA系统数据文件、表空间文件完全拷贝到备节点; t(tar) 格式是指将备份文件打个tar包并存储在指定目录里,系统文件被打包成base.tar。其他表空间文件被打包成oid.tar,其中OID为表空间的OID。

  • -X:参数设置在备份的过程中产生的WAL日志包含在备份中的方式,有两种可选方式,f(fetch) 和s(stream), f(fetch) 是指WAL日志在基准备份完成后被传送到备节点,这时主库上的wal_kee _segments参数需要设置得较大,以免备份过程中产生的WAL还没发送到备节点之前被主库覆盖掉,如果出现这种情况创建基准备份将会失败,f(fetch) 方式下主库将会启动一个基准备份WAL发送进程; s(stream) 方式中主库上除了启动一个基准备份WAL发送进程外还会额外启动一个WAL发送进程用于发送主库产生的WAL增量日志流,这种方式避免了ffetch) 方式过程中主库的WAL被覆盖掉的情况,生产环境流复制部署推荐这种方式,特别是比较繁忙的库或者是大库。

  • -v:参数表示启用verbose模式,命令执行过程中打印出各阶段的日志,建议启用此参数,了解命令执行到哪个阶段。

  • -P:参数显示数据文件、表空间文件近似传输百分比,由于执行Pg bascbackup 命令过程中主库数据文件会变化,因此这只是一个估算值: 建议启用此选项,了解数据复制的进度。

启动数据库

修改初始化数据路径

这里使用systemctl :

systemctl edit postgresql-13.service

在新空白页覆盖原服务配置

[Service]
Environment=PGDATA=/home/data/pgdata

初始化

/usr/pgsql-13/bin/postgresql-13-setup initdb

启动

systemctl start postgresql-13

如果出现以下权限问题

systemctl status postgresql-13.service

image-20221007173836070

解决方法

chmod 700 -R /home/data/pgdata
# 设置用户
chown -R postgres pgdata

查看配置文件

可以看到备库服务器上自动生成了standby.signal文件。同时,也看到在$PGDATA路径下,数据库自动帮我们配置了关于流复制的主库的信息:

cat postgresql.auto.conf

image-20221007175434260

如果我们没有使用-R来备份主库的话。我们完全可以在备库上手工创建standby.signal文件,然后手工编辑postgresql.auto.conf,并在其内容中配置主库的信息。

primary_conninfo = 'user=replica password=123456 channel_binding=disable host=192.168.1.1 port=5432 sslmode=disable sslcompression=0 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres target_session_attrs=any' 

查看相关进程

查看从库进程信息

ps -ef|grep postgres

image-20221007180042586

备库上,可以看到walreceiver进程,正在读取日志streaming 0/230454C0,执行恢复recovering 000000010000000000000023。

查看主库进程信息

ps -ef|grep postgres

image-20221007180501744

主库上看到,后台进程walsender,正在向replica 1180.110.177.72(19333) streaming 0/230454C0推送日志信息。

查看流复制同步方式

异步流复制部署完成后,可通过pg_statZ_replication系统视图的sync_state字段查看流复制同步方式

SELECT usename,application_name,client_addr,sync_state FROM pg_stat_replication;

image-20221007224015955

pg_stat_replication视图显示主库上WAL发送进程信息,主库上有多少个WAL发送进程,此视图就对应多少条记录,这里主要看sync_state 字段,syne_state 字段的可选项包括:

  • async:表示备库为异步同步方式。

  • potential: 表示备库当前为异步同步方式,如果当前的同步备库宕机后,异步备库可升级成为同步备库。

  • sync: 当前备库为同步方式。

  • quorum:此特性为PostgreSQL10版本新增特性,表示备库为quorum standbys的候选。

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

测试

使用pgadmin查看从库可以发现,数据库结构和主库是一样的

在主库某个数据库表中插入一条数据,从库中对应的表也会生成一条记录

参考

参考文档

相关文章:

  • HDFS读写流程+NameNode和DataNode工作机制
  • 百战c++(数据库2)
  • GO语法学习
  • 【国庆活动】Tomcat 的优化方式
  • Vue3 reactive响应式原理详解
  • 基于HAL库的STM32的串口DMA发送数据(解决只发送一次数据)及DMA+空闲中断接受数据
  • 【图灵MySQL】SQL底层执行原理详解
  • 【电磁】基于Matlab求解瞬变电磁TEM层状介质正演
  • Unity使用新输入系统InputSystem制作飞机大战Demo(敌人生成管理器UI场景跳转)
  • Python 文件存储:pickle 和 json 库的使用
  • 【推荐收藏】matplotlib 制作的动态条形图其实很好看
  • 计算机组成原理 ------ 存储系统(1)
  • Open3D (C++) 基于投影点密度的建筑物立面提取
  • SpringCloud Alibaba系列 Nacos(一)
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • JS 中的深拷贝与浅拷贝
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 2017 前端面试准备 - 收藏集 - 掘金
  • es6(二):字符串的扩展
  • HTML-表单
  • Java Agent 学习笔记
  • Js基础知识(四) - js运行原理与机制
  • maya建模与骨骼动画快速实现人工鱼
  • Object.assign方法不能实现深复制
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 前端学习笔记之观察者模式
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 使用Swoole加速Laravel(正式环境中)
  • 用element的upload组件实现多图片上传和压缩
  • 【干货分享】dos命令大全
  • 通过调用文摘列表API获取文摘
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • (145)光线追踪距离场柔和阴影
  • (26)4.7 字符函数和字符串函数
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (4.10~4.16)
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (转)fock函数详解
  • (转)LINQ之路
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转)为C# Windows服务添加安装程序
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .aanva
  • .NET Reactor简单使用教程
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET中的Exception处理(C#)
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标
  • [BZOJ3223]文艺平衡树
  • [C]整形提升(转载)