GPDB - 高可用特性 - 同步复制与异步复制

GPDB - 高可用特性 - 同步复制与异步复制

GreenPlum是基于PostgreSQL的分布式数据库,master用于接收用户请求并生成执行计划与分发,当然也可以参与计算;而segment则用于存储数据,将计算的结果传递给master。Segment本身具有高可用特性,即分为primary和mirror,通过主从复制构建高可用关系。默认使用同步复制,若FTS检测到mirror发生异常,则修改为异步复制。本文关注如何从同步复制切换到异步复制。

1、几个重要配置项

1)synchronous_commit

当数据库提交事务时是否需要等待WAL日志写入磁盘才向客户端返回。该参数可选值为on、off、local、remote_apply、remote_write。参数值说明如下图所示:

4bbb12f05dca3dffb39f5b11825a3499.png

根据synchronous_commit参数,对应的同步复制可以分为3种模式:WRITE、FLUSH、APPLY。复制过程中,每个备机都有自己的复制模式,主机根据不同的备机模式决定事务提交是否需要等待备机。GPDB中该参数默认是on,也就是primary要等待mirror将接收到的WAL持久化到磁盘才可以提交

2)synchronous_standby_names

该参数是PG带过来的,用于设定需要支持同步复制的备节点服务器名称列表。必须与备机的application_name一样。有3种语法格式,如下:

[FIRST] num_sync (standby_name [,...])
ANY num_sync (standby_name [,...])
standby_name [,...]

其中

1)num_sync表示事务需要等待响应的同步备节点个数

2)standby_name表示同步复制备节点服务器名字,这里指备节点连接配置信息中的application_name,对于流复制,可以查看recovery.conf配置文件(PG12开始,在postgresql.conf)中的primary_conninfo配置项,缺省值是walreceiver。对于逻辑复制可以在订阅连接信息中设置,缺省值是订阅名本身

3)FIRST和ANY指定从列表中选择同步备节点的方法。大小写不敏感。FIRST表示基于优先级的同步复制,ANY表示基于法定人数的同步复制

4)第3种格式在PG9.6版本之前使用,现在仍然支持,等价于FIRST 1(...)。比如FIRST 1(s1,s2)与s1,s2等价。

例1:FIRST 2(s1,s2,s3,s4):规定每个事务必须等待优先级最高的2个备节点确认才能提交,该列表排的越靠前的名字优先级越高。本例中s1>s2>s3>s4。没排在前2位的备节点都属于潜在的同步备节点。

例2:ANY 2(s1,s2,s3):规定每个事务必须等待至少任意2个节点确认后才能提交。

在GPDB中,对于异步复制,该参数配置为空;对于同步复制,配置为“*”,表示匹配任意备名称这里需要注意,GPDB中segment对于该值默认为空,通过fts将其更改为“*”,然后保存到postgresql.auto.conf文件中,以此达到同步复制的目的

2、同步复制情况下的提交

关于WaitEventSet及Latch的唤醒,参考前文:

https://mp.weixin.qq.com/s?__biz=MzU1OTgxMjA4OA==&mid=2247485254&idx=1&sn=c4e84024a01dbb27b5c449e7658cbacd&chksm=fc10dbd1cb6752c702b7df959d7b233c72bf9971e34006461c5a815f623b2af1a9b15e6fc40b&token=2029515501&lang=zh_CN#rd

https://mp.weixin.qq.com/s?__biz=MzU1OTgxMjA4OA==&mid=2247485259&idx=1&sn=62332c14bf4a4cd5c01fcf49455b3ed4&chksm=fc10dbdccb6752ca94325ff9124b576bde5db0d953ac5a736745a91d2f37799307f67ed4a8ef&token=2029515501&lang=zh_CN#rd

下图为同步复制正常场景下,commit流程被唤醒的逻辑:

2429a8a0cf348f59e1ca24d4e963c52a.png

1、事务提交

1)事务提交时RecordTransactionCommit->SyncRepWaitForLSN进入同步复制等待。上图所示,会将等待进程MyProc插入WalSndCtl->SyncRepQueue[mode]队列中,以供sender进程向mirror发送WAL接收到mirror落盘回复后,唤醒等待;

2)WaitLatch进入同步复制等待,mirror回复唤醒WaitLatch后,进入MyProc->syncRepState判断,同步复制完成,break退出循环,事务提交流程可继续下去。

2、WaitLatch

epoll_create -- epoll_ctl -- epoll_wait进入等待,通过监控管道上EPOLLIN事件进行等待与唤醒。

3、WalSndLoop sender进程主函数

Sender进程接收到mirror的回复后,通过SyncRepReleaseWaiters来唤醒等待进程。分为3种同步模式的队列,若mirror回复wal已接收到了,则通过SyncRepWakeQueue处理等待队列

4、SyncRepWakeQueue

将可唤醒的进程从队列种删除,然后SetLatch设置latch的is_set为true,并通过kill命令向事务提交进程(等待进程)发送SIGUSR1信号。

为什么还要发送信号呢?

因为sender进程和commit进程属于不同进程,sender进程置位后,commit进程是看不见的,所以还需要发送信号给commit进程.

Commit进程使用的是MyLatch,而这里队列中的是MyProc->procLatch,是否同一个?

6688eeb4aed663d8b6f2bde1ac067fcd.png

进程初始化的时候,可看到MyLatch就是MyProc->procLatch.

5、SyncRepWakeQueue

Commit进程在InitPostgres前就注册了SIGUSR1信号处理函数procsignal_sigusr1_handler:由于MyLatch->is_set还是false,所以将其值置为true,然后sendSelfPipeByte向selfpipe_writefd管道写一个字节。因为epoll_wait监控的是管道上的EPOLLIN事件,写入一个字节后,commit进程的epoll_wait就被唤醒了。

3、切换异步复制

切换异步复制的流程如下图所示:

ee869ca636e63b298ae4326a7716f61f.png

1)事务提交时RecordTransactionCommit->SyncRepWaitForLSN进入同步复制等待。上图所示,会将等待进程MyProc插入WalSndCtl->SyncRepQueue[mode]队列中,以供sender进程向mirror发送WAL接收到mirror落盘回复后,唤醒等待;

3)这里关注for循环,WaitLatch何时被唤醒。FTS进程探测到mirror异常,需要关闭同步:UnsetSyncStandbysDefined会修改synchronous_standby_names为空,即改为异步,然后持久化到postgresql.auto.conf中,最好通过pg_reload_conf函数(通知所有进程更新配置)向Postmaster(主进程)进程发送SIGHUP信号

4)主进程处理SIGHUP信号的函数为SIGHUP_handler,该函数会向所有子进程包括后台进程发送SIGHUP信号。这里关注checkpoint进程

5)checkpoint进程接收到SIGHUP信号后,ChkptSigHupHandler将got_SIGHUP变量置为true,然后checkpoint进程轮一圈后,会判断该参数,若为true则调用UpdateSharedMemoryConfig函数

6)UpdateSharedMemoryConfig->SyncRepUpdateSyncStandbyDefined函数会根据synchronous_standby_names是否为空判断同步异步情况,若为异步,则会调用SyncRepWakeQueue处理所有同步等待的进程

7)SyncRepWakeQueue将进程的syncRepState标记为SYNC_REP_WAIT_COMPLETE,然后向该进程发送SIGUSR1信号

8)事务等待进程通过procsignal_sigusr1_handler处理SIGUSR1信号,通过管道唤醒等待进程的epoll_wait

9)SyncRepWaitForLSN的WaitLatch被唤醒后,继续for循环,此时MyProc->syncRepState已在7)标记为了SYNC_REP_WAIT_COMPLETE,所以会退出循环,不再等WAL的LSN确认了。至此,完成异步复制的切换。

注意:主进程SIGHUP_handler会向所有子进程发送SIGHUP信号,也就是事务等待进程也会接收到SIGHUP信号,它处理SIGHUP信号的函数是PostgresSigHupHandler,会SetLatch MyLatch。那么上图的SyncRepWaitForLSN的WaitLatch也会被唤醒,然后继续循环,但是MyProc->syncRepState还未更改为SYNC_REP_WAIT_COMPLETE,仍旧会进入WaitLatch等待。当然,这还得checkpoint进程来唤醒让同步复制不在等待而赶紧走掉:

PostgresMain
  pqsignal(SIGHUP, PostgresSigHupHandler);
  |--  {
  |    ConfigReloadPending = true;
  |    SetLatch(MyLatch);
  |--  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/248161.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5.4 Linux KickStart 无人值守安装

1、概念介绍 搭建无人执行安装服务器需要从装网络引导安装操作系统,这样我们就可以不必走到机器那里插入CD-ROM光盘或者U盘手动一台一台安装操作系统,使用网络引导批量部署服务器操作系统。 服务架构:PXE DHCP TFTP Kickstar…

dockerfite创建镜像---INMP+wordpress

目录 搭建dockerfile---lnmp 创建nginx镜像 运行 创建数据库镜像 运行 ​编辑 创建php镜像 运行 搭建dockerfile---lnmp 在192.168.10.201 服务IP地址nginx 172.111.0.10 dockernginxmysql172.111.0.20dockermysqlphp172.111.0.30dockerphp 创建nginx镜像 路径 vim /…

python基本数据类型(一)-字符串

1.字符串 字符串就是一系列字符,在Python中,用引号括起的都是字符串,其中的引号可以是单引号,也可以是双引号,如下所示: "This is a string." This is also a string.这种灵活性让你能够在字符…

【产品经理】产品增效项目落地,项目反哺产品成长

产品和项目是相辅相成的关系,产品的规范、成熟,为项目的快速落地提供支撑,项目的落地反哺产品,促进产品的成长成熟。 软件工程的初期是,我们需要什么,就立项项目,通过项目实现需要。 随着项目的…

用实例域代替序数

在Java中,枚举类型的ordinal()方法返回枚举常量的序数(即其在枚举声明中的位置)。在某些情况下,使用实例域(instance field)代替序数可能更加安全和易读。以下是一个示例,演示如何使用实例域代替…

低代码开发如何快速构建AI应用

随着人工智能(AI)的快速发展,越来越多的企业和开发者开始意识到AI在业务和应用中的重要性。然而,AI应用的开发通常被认为是复杂和耗时的过程,需要大量的编码和数据科学知识。为了解决这个问题,低代码开发平…

图片转HTML-screenshot-to-code

Github地址 https://github.com/abi/screenshot-to-code 在线站 Screenshot to Code 简介 这是一个基于GPT4开发的一个工具站,它可以基于截图生成站点代码,生成速度快且准确。

Linux-----2、虚拟机安装Linux

# 虚拟机安装Linux # 一、学习环境介绍 # 1、虚拟机概述 1、什么是虚拟机软件? 虚拟机软件,有些时候想模拟出一个真实的电脑环境,碍于使用真机安装代价太大,因此而诞生的一款可以模拟操作系统运行的软件。 虚拟机软件目前有2…

DSP定时器0笔记

首先了解开发板TMS320f28335是150Mhz的频率 定时器结构图和概要 定时器0对应的中断是TINT0 大概是这样,时钟sysclkout 进入和TCR控制时钟进入 ,经过标定计数器(stm32的预分频),标定器挂这自动装载寄存器&#xff0c…

Unity中实现ShaderToy卡通火(移植篇)

文章目录 前言一、准备好我们的后处理基础脚本1、C#:2、Shader: 二、开始逐语句对ShaderToy进行转化1、首先,找到我们的主函数 mainImage2、其余的方法全部都是在 mainImage 函数中调用的方法3、替换后的代码(已经没报错了,但是效…

基于ssm旅游网站的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本旅游网站就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&#x…

rocketmq window测试小Demo 解决找不到或无法加载主类的问题

文章目录 rocketMQ启动1.下在相关的二进制文件2.配置环境变量3.启动NameServer4.启动broker5. MQ 启动!5.1 测试发送数据 6.关闭服务 rocketMQ启动 1.下在相关的二进制文件 下载地址,点击即达 2.配置环境变量 3.启动NameServer 在文件夹下执行cmd进…

嵌入式奇妙之旅:Python与树莓派编程深度探索

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 在这个数字化的时代,嵌入式系统的应…

如何理解 RPC 远程服务调用?

本文主要讲解 RPC 远程服务调用相关的知识。 RPC 远程服务调用是分布式服务架构的基础,无论微服务设计上层如何发展,讨论服务治理都绕不开远程服务调用,那么如何理解 RPC、有哪些常见的 RPC 框架、实现一款 RPC 框架需要哪些技术呢&#xff…

3D点云广义零样本分类的递归循环对比生成网络笔记

1 Title Contrastive Generative Network with Recursive-Loop for 3D point cloud generalized zero-shot classification(Yun Hao, Yukun Su, Guosheng Lin, Hanjing Su, Qingyao Wu)【Pattern Recognition】 2 Conclusion This work aims to facilitate research on 3D poi…

web微服务规划

一、背景 通过微服务来搭建web系统,就要对微服务进行规划,包括服务的划分,每个服务和数据库的命名规则,服务用到的端口等。 二、微服务划分 1、根据业务进行拆分 如: 一个购物系统可以将微服务拆分为基础中心、会员…

卸载Postman?这款IDEA插件真可以!

Postman是大家最常用的API调试工具,那么有没有一种方法可以不用手动写入接口到Postman,即可进行接口调试操作?今天给大家推荐一款IDEA插件:Apipost Helper,写完代码就可以调试接口并一键生成接口文档!而且还…

群晖7.2使用Docker安装容器魔方结合内网穿透实现远程访问

最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念,而且内容风趣幽默。我觉得它对大家可能会有所帮助,所以我在此分享。点击这里跳转到网站。 文章目录 1. 拉取容器魔方镜像2. 运行容器魔方3. 本地访问容器魔…

注意std::shared_ptr的循环引用

指针智能是RAII的思想的具体体现。利用对象生命周期来管理资源。 在C11中,引入shared_ptr、weak_ptr和unique_ptr。 share_ptr是一个能有效解决赋值和拷贝构造的引用技术。 std::shared_ptr通过引用计数的方式来管理对象的生命周期,但是如果两个对象互…

老卫带你学---leetcode刷题(29. 两数相除)

29. 两数相除 问题 给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 &…