首页 > 数据库 >POSTGRESQL PG_REWIND 从源代码看功能

POSTGRESQL PG_REWIND 从源代码看功能

时间:2023-06-19 17:04:12浏览次数:42  
标签:文件 POSTGRESQL 数据库 复制 PG REWIND 源代码 pg


POSTGRESQL  PG_REWIND  从源代码看功能_大数据

PG_REWIND 是PG 9.6 开始提供的功能,主要的作用在于通过PG_REWIND 让PG 复制中的数据库快速的与预定的“主库”进行数据同步,而复制的方式是是文件块的方式,并且可以避过重复的数据块。所以复制的速度是快的,在不少的高可用方式中都被作为主库失败后的快速的将主库加入原有集群并作为从库继续工作的方案。

POSTGRESQL  PG_REWIND  从源代码看功能_大数据_02

从PG_ REWIND 的源代码就中的可以看到引用了 pg_control.h,  controldata_utils.h 等文件。那我们就从这里说起。

POSTGRESQL  PG_REWIND  从源代码看功能_大数据_03

首先PG 的复制初始时基于文件复制的方式进行的, system identifier是系统在 initdb 初始化时生成的,此后这个system identifier 是不会被改变的,也就是说,pg_rewind 如果想进行数据的复制,则前提的条件是这两个PG的数据库的 system identifier  是要一致的,否则PG_REWIND 是无法进行工作的。

POSTGRESQL  PG_REWIND  从源代码看功能_python_04

我们通过上面的源代码可以证实,PG_REWIND 进行数据的复制的基础的确是要判断,源和目的的的 system_identified 一定是要一致的。同时还要判断两个数据库服务器的数据库版本和系统文件的版本。这也就坐实了,如果你的数据库的版本不一致那也是无法使用PG_REWIND

总结1 :通过源代码PG_REWIND的基础是, 两个数据库服务器的 SI 必须一致,同时数据库的版本必须一致。

POSTGRESQL  PG_REWIND  从源代码看功能_大数据_05

在两个数据库确认之间早就已经是有关系的基础上, 那么在执行命令的时候,就需要保证目标库的状态应该是确认被关闭的。从上面的源代码看从命令行中给出的目标的数据库的状态,并确认是关闭的。

POSTGRESQL  PG_REWIND  从源代码看功能_大数据_06

总结2:  在PG_REWIND 工作中,需要判断目标库的状态应是关闭的。

POSTGRESQL  PG_REWIND  从源代码看功能_数据库_07

在做完这些工作后,就需要判断目的与源数据库中checkpoint的 timeline ,如果两个服务器一致,说明根本没有必要使用PG_REWIND 来进行工作,如果不是则需要,进行下面的工作。

POSTGRESQL  PG_REWIND  从源代码看功能_linux_08

上面的代码需要获得目的机器在启动后需要到的 最小的recovery 的位置,并且将这些位置与目标机器中的位置进行对比,如果源的位置大于目标库的位置,则说明需要进行数据的复制,如果否,pg_rewind 就不需要了。

POSTGRESQL  PG_REWIND  从源代码看功能_linux_09

POSTGRESQL  PG_REWIND  从源代码看功能_数据库_10

如果需要进行pg_rewind的情况下, 收集目的与源数据库之间文件信息,通过hash 的方式来判断文件之间是否有差异。

POSTGRESQL  PG_REWIND  从源代码看功能_linux_11

下面的代码是一个调用数据复制的代码, 其中在获得有多少需要进行数据复制的文件后,开始循环进行数据复制,通过hash table 中记录的数据文件进行one by one 的 数据复制

POSTGRESQL  PG_REWIND  从源代码看功能_python_12

这里还有一个细节,在对比控制文件的时候,需要将内存中的存储信息,刷新到磁盘的文件中。

POSTGRESQL  PG_REWIND  从源代码看功能_python_13

下面总结pg_rewind整体的工作过程

1  对源于目的主机的状态进行判断,符合要求则进行工作

2  通过控制文件来判断源与目的主机的是否曾经是复制的关系

3  通过在源与目的之间的checkpoint 来判断两个节点之间的数据的异同

    在checkpoint 点中最后一次相同的点后的数据为要复制的数据

4  通过HASH TABLE将数据文件不同的进行复制,相同的不会复制

5  在目的机上建立backup label 文件,准备在目的机启动后,开始进入recovery 的状态,进行数据的recovery应用pg_wal文件

6  从库开机进行数据的追偿,达到与源库一致的状态

7  建立数据复制,功能完成

这里需要注意的是,

1  full_page_writes 需要打开

2  wal_log_hints  需要打开

3  保证PG control 文件正常没有被损坏

POSTGRESQL  PG_REWIND  从源代码看功能_java_14

标签:文件,POSTGRESQL,数据库,复制,PG,REWIND,源代码,pg
From: https://blog.51cto.com/u_14150796/6516006

相关文章

  • 分布式两大流派 POSTGRESQL -XC 了解一下
    分布式数据库有两大流派,NEWSQLVS POSTGRESQL-XC,NEWSQL的分布式主流的理论来源自GOOGLE的分布式数据库spanner,以及相关理论的白皮书,而令一派的分布式数据库来自于POSTGRESQL-XC,今天我们看看到底POSTGRESQL-XC这个流派的方式是什么,有什么特点,当下那些分布式数据库采用了......
  • POSTGRESQL Postgres-XL 了解一下
    上次分析的POSTGRES-XC的结构, 实际上POSTGRES-X系列一直在发展, POSTGRES除了XC还有XL的高可用的结构.Postgres-XL是一款Postgres-XC升级的产品,如果说PGXC是在PG添加了集群的功能主打OLTP的功能为卖点,PGXL是一款基于PGXC添加了OLAP功能的支持MPP架构的,但不是简单的PO......
  • POSTGRESQL 创建一个表到底有什么说的? 可说的挺多的
    创建一张表,到底有什么说的, 下面是POSTGRESQL创建数据表的官方文档的内容截图. 那我们就往下看,到底我们可以说点什么建表的开头是关于临时表的问题,其中临时表的global和local,在目前的V12的版本中并没有具体的含义,问题1,POSTGRESQL怎么创建一个看似global的temparytab......
  • POSTGRESQL 主节点失败后, 在多变的情况下重新让他融入复制中
    POSTGRESQL 在主从流复制中,在主库失败切换后,从库变为主库后,如果主库不是因为硬件的原因,想继续拉起来,并且加入到新的复制关系中,一般都会通过pg_rewind的程序来进行拉起来.但不少问题反馈对pg_rewind在重新拉起旧主库出现问题,到底有什么情况下pg_rewind对你的数据库重新建立......
  • POSTGRESQL 设置hugepage 可以让系统使用内存更有效率,防止OOM
    https://www.percona.com/blog/why-linux-hugepages-are-super-important-for-database-servers-a-case-with-postgresql/https://bbs.huaweicloud.com/blogs/detail/156799Hugepage是什么,基于LINUX系统,大页面对虚拟内存管理是有必要的。除标准的4KB页面之外,还进行内存中的大页面......
  • POSTGRESQL 怎么通过explain 来分析SQL查询性能
    Explain命令是大多数数据库常用的一种展示SQL执行计划和cost的一种方式。在POSTGRESQL中EXPLAIN命令展示的信息比较详细,并且附带explain有不少的附加的命令来进行更多的展示。从命令来命令和功能来划分explainselecta.first_name,a.last_name,a.last_update,fa.film_idfrom......
  • POSTGRESQL 高可用 Patroni VS Repmgr 到底哪家强(1)
    在众多postgresql高可用模式中,主要的参与者有两位,PatroniVSrepmgr基于这二者的功能优点以及缺点相信大部分人都不是太明确,下面将根据两篇翻译的文字合并,来对两个高可用的程序来做一个比较,consandpros。 1 Repmgr是一款开源的基于postgres复制基础上的高可用软件,他基于2......
  • POSTGRESQL 14 功能有啥吸引人的
    好多人还在用postgresql10 ,12这些版本的时候,POSTGRESQL已经开启了POSTGRESQL14的旅程。那么到底Postgresql14有什么吸引人的,那就需要了解一下。 https://sql-info.de/postgresql/postgresql-14/articles-about-new-features-in-postgresql-14.html想详细了解了可以到这个......
  • POSTGRESQL openGaussDB 体系架构
    Today听了一下墨天轮举办的OpenGaussDB的专题的训练营,下面是此次线上的OpenGaussDB的体系结构的介绍。这里根据介绍快速总结出此次介绍中OpenGaussDB的特点:1 OpenGaussDB针对国产的硬件系统,如鲲鹏等硬件系统有特殊的支持和性能调试,真多国产的硬件系统有优势。2OpenGaussDB主......
  • POSTGRESQL 事务控制(二) 事务开启 (写着费力,看着费劲系列)
    今天接着上回书,事务如果在处理中没有子事务,则实现和控制是十分容易的,但如果有子事务的情况下,子事务通过transactionState结构体来实现,(上次已经提到了),每一个transactionState都指向父事务的结构体的指针.在继续往下说之前,我们的提到clog, 这是理解后面要提到的一些事情的......