GPDB - 高可用 - FTS机制(一):探测成功

news2024/11/25 16:35:44

GPDB - 高可用 - FTS机制(一):探测成功

作为GreenPlum高可用的核心功能,FTS(Fault Tolerance Server)进程负责故障检测。该进程是master上的一个子进程,可以快速检测到primary或者mirror是否宕机,并及时让primary/mirror进行故障切换。如果fts挂掉了,master还会再重新fork出一个。本文说说FTS的工作机制。

1、gp_segment_configuration

说起FTS,就不得不提下系统表gp_segment_configuration。该系统表存有集群segment的相关信息。

dbid

唯一标识segment。Master为1,然后primary节点按照content递增;接着是mirror按照content递增;最后是standby master

content

数据库节点的标识ID,segment的primary和mirror相同。Master节点为-1,数据节点:0-N

role

节点当前的角色,primary或者mirror。p:表示primary,m:表示mirror

preferred_role

节点被定义的角色,primary或者mirror

mode

主备同步状态。s:表示已同步;n:表示不同步

Master总是n,standby master segment总是s,但并不表示他们之间的同步状态,使用gp_stat_replication来看他们之间是否同步

status

u:表示正常,d:表示节点down掉

port

子节点的端口

hostname

子节点所在机器的hostname

address

子节点所在机器的IP

datadir

实例的data目录

FTS probe进程,即master端探测进程探测集群状态时,向primary发送探测消息,消息内容格式为:"%s dbid=%d contid=%d",分别为:message_type、dbid、content。其中message_type为:

/* Queries for FTS messages */
#define  FTS_MSG_PROBE "PROBE"
#define FTS_MSG_SYNCREP_OFF "SYNCREP_OFF"
#define FTS_MSG_PROMOTE "PROMOTE"

2、FTS_PROBE_SUCCESS

FtsWalRepMessageSegments->FtsWalRepInitProbeContext在一个探测周期前初始化Probe内存上下文时将ftsInfo->state设置为FTS_PROBE_SEGMENT;当探测周期中ftsReceive接收到primary发来的探测信息后,表示探测成功,然后将状态改为FTS_PROBE_SUCCESS。然后processRetry根据反馈的信息决定是否进行重试。

3、primary接收到PROBE消息后的动作

57c2ce15714b38897fb0b2c35ed1bfc2.png

FTS进程向primary的ftshandler进程发送PROBE探测消息,fts进程接收到消息后,由HandleFtsMessage进行处理:

1)进行校验,确保接收到正确的探测消息和本segment匹配以确定探测的primary就是它

2)通过HandleFtsWalRepProbe函数处理PROBE消息

3)HandleFtsWalRepProbe函数得到primary和mirror状态后,通过SendFtsResponse将状态FtsResponse发送给master端的fts进程

3.1 FtsResponse响应消息

typedef struct FtsResponse
{
  bool IsMirrorUp;//mirror是否在线
  bool IsInSync;//primary和mirror状态是否是流复制(sync)状态
  bool IsSyncRepEnabled;//是否开启同步复制
  bool IsRoleMirror;//角色是否是mirror
  bool RequestRetry;//是否需要重试
} FtsResponse;

3.2 FtsResponse响应消息的获取

a3d2ac846a8d542499e5fe303d29417b.png

1)GetMirrorStatus获取mirror状态,即获取response的IsMirrorUp、IsInSync和RequestRetry的状态:

    IsMirrorUp:sender进程在线,并且处于streaming状态或者catchup状态(接收到mirror回复已write的lsn位置)

    IsInSync:IsMirrorUp并且处于streaming状态

    RequestRetry:3.3节

    IsSyncRepEnabled:是否定义了同步复制

2)IsMirrorUp并且sender处于streaming状态或caughtup_within_range状态,则HandleFtsWalRepProbe函数定义synchronous_standby_names为*即开启同步

3.3 FTSReplicationStatus

gp_replication.c在共享内存维护一个全局变量FTSRepStatusCtl来记录mirror是否一直处于crash重启状态,用于判断mirror状态为down时是否需要重试:

/*
 * Each GPDB primary-mirror pair has a FTSReplicationStatus in shared memory.
 *
 * Mainly used to track replication process for FTS purpose.
 *
 * This struct is protected by its 'mutex' spinlock field. The walsender
 * and FTS probe process will access this struct.
 */
typedef struct FTSReplicationStatus
{
  NameData    name;      /* The slot's identifier, ie. the replicaton application name */
  slock_t    mutex;      /* lock, on same cacheline as effective_xmin */
  bool    in_use;      /* is this slot defined */


  /*
   * For GPDB FTS purpose, if the the primary, mirror replication keeps crash
   * continuously and attempt to create replication connection too many times,
   * FTS should mark the mirror down.
   * If the connection established, clear the attempt count to 0.
   * See more details in FTSGetReplicationDisconnectTime.
   */
  uint32      con_attempt_count;


  /*
   * Records time, either during initialization or due to disconnection.
   * This helps to detect time passed since mirror didn't connect.
   */
  pg_time_t   replica_disconnected_at;
} FTSReplicationStatus;


typedef struct FTSReplicationStatusCtlData
{
  /*
   * This array should be declared [FLEXIBLE_ARRAY_MEMBER], but for some
   * reason you can't do that in an otherwise-empty struct.
   */
  FTSReplicationStatus   replications[1];
} FTSReplicationStatusCtlData;
extern FTSReplicationStatusCtlData *FTSRepStatusCtl;

con_attempt_count和replica_disconnected_at的意义:

1)sender进程退出时标记con_attempt_count+1,replica_disconnected_at当前时间

WalSndKill:sender进程退出时标记
  if (MyWalSnd->is_for_gp_walreceiver)
    FTSReplicationStatusMarkDisconnectForReplication(application_name);
    |--  replication_status = RetrieveFTSReplicationStatus(app_name, true);
    |--  FTSReplicationStatusMarkDisconnect(replication_status);
      |--  replication_status->con_attempt_count += 1;
      |--  replication_status->replica_disconnected_at = (pg_time_t) time(NULL);

2)FTSReplicationStatusUpdateForWalState更新状态时

ab2d1d91cc2581f05403b050a0f22a7c.png

1)Sender进程退出时con_attempt_count+1,replica_disconnected_at为退出时时间;

2)再次构建复制连接后,mirror起来了,将replica_disconnected_at置为0,但此时还未到达streaming状态,此时sender进程又挂掉了:con_attempt_count再+1

3)多次没有到达streaming状态就又挂掉了,持续处于重启状态,那么con_attempt_count值就会大于1,也就是说conn_attempt_count表示在达到streaming状态前,建立复制连接的次数;replica_disconnected_at表示最近一次断开连接时的时间,到streaming状态后就置为0了。

4a9c4f2eea667a985d55dee70daf4891.png

正常情况deta不可能为负数,因为is_probe_retry_needed函数执行时的时间是实时获取,此时断开时间:要么已断开得到时间,要么还没断开。为负数只能是deta1或者deta2太久远了,导致数据类型溢出,那么此时可能是超过gp_fts_mark_mirror_down_grace_period值的。

bcb5f7f7650f9d8484a330650c613368.png

Primary端is_probe_retry_needed判断:

1)到达streaming状态前重启次数<=gp_fts_replication_attempt_count时,此时距上次断开的时间deta1 <= gp_fts_mark_mirror_down_grace_period则需要重试;否则不重试,反馈master后标记mirror down。

2)到达streaming状态前重启次数>gp_fts_replication_attempt_count时(重启次数太多了,需要看此时距离最开始的时间),此时距离接收连接时过了deta2时间 <= gp_fts_mark_mirror_down_grace_period则需要重试;否则不重试,反馈master后标记mirror down

3)Master端fts进程接收探测反馈后:若不在重试,则更新gp_segment_configuration系统表,标记mirror down

23102e603e2419eeb2628c54a65456c3.png

3.4 repl_catchup_within_range

默认1。对于Greenplum数据库主镜像,控制活跃从节点的更新。 如果walsender尚未处理的WAL段文件数超过此值,Greenplum数据库将更新活跃从节点。如果段文件的数量不超过该值,则Greenplum数据库会阻止更新,以允许walsender处理文件。 如果已处理所有WAL段,则更新活动主站

951a0d8bdf5fad66e56a28e1dff6ef47.png

1)XLogSendPhysical发送WAL日志发送后WalSndIsCatchupWithinRange判断是否追上:若当前已sync到磁盘的WAL所在文件号 - 当前已发送的WAL所在段文件号 > repl_catchup_within_range,则WalSndCaughtUpWithinRange为false,否则为true。

2)发送完,若WalSndCaughtUpWithinRange为true(认为在这个范围上追上),WalSndSetCaughtupWithinRange将walsnd->caughtup_within_range设置为true

3)如何做到段文件的数量不超过该值(范围内追上),则Greenplum数据库会阻止更新?返回第3.2节开头的图示:ready_for_syncrep为true,定义为同步复制,那么就需要mirror同步到mirror返回primary后才可更新。也就是说,repl_catchup_within_range变量和primary和mirror的同步复制有关

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyTorch深度学习快速入门教程 - 【小土堆学习笔记】

小土堆Pytorch视频教程链接 声明&#xff1a; 博主本人技术力不高&#xff0c;这篇博客可能会因为个人水平问题出现一些错误&#xff0c;但作为小白&#xff0c;还是希望能写下一些碰到的坑&#xff0c;尽力帮到其他小白 1 环境配置 1.1 pycharm pycharm建议使用2020的&…

【C语言】指针的进阶篇,深入理解指针和数组,函数之间的关系

欢迎来CILMY23的博客喔&#xff0c;本期系列为【C语言】指针的进阶篇&#xff0c;深入理解指针和数组&#xff0c;函数之间的关系&#xff0c;图文讲解其他指针类型以及指针和数组&#xff0c;函数之间的关系&#xff0c;带大家更深刻理解指针&#xff0c;以及数组指针&#xf…

LeetCode Python - 16.最接近的三数之和

目录 题目答案运行结果 题目 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&#xff1a;nums [-1,2,1,-4],…

Vulnhub靶场 DC-6

目录 一、环境搭建 二、主机发现 三、漏洞复现 1、wpscan工具 2、后台识别 dirsearch 3、爆破密码 4、rce漏洞利用 activity monitor 5、rce写shell 6、新线索 账户 7、提权 8、拿取flag 四、总结 一、环境搭建 Vulnhub靶机下载&#xff1a; 官网地址&#xff1a…

凭证获取:Linux凭证获取

目录 shadow文件详解 1.Shadow文件的组成与作用 2.破解Shadow文件内容 利用strace记录密码 shadow文件 1.Shadow文件的组成与作用 在Linux中&#xff0c;/etc/shadow文件又被称为“影子文件”&#xff0c;主要用于存储Linux文件系统中的用户凭据信息。该文件只能由root权…

【日常聊聊】新年新征程:迎接学习的挑战

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 结语 我的其他博客 前言 随着新的一年的到来&#xff0c;程序员们站在了全新的起点。这是一个充满机遇和挑战的时刻&#xff0…

【C++初阶:类和对象(下篇)】初始化列表 | static成员 | 友元

目录 一、构造函数构造函数体赋值&#x1f43e;初始化列表&#x1f43e;&#x1f4a6; explicit关键字 二、static成员&#x1f43e;概念**&#x1f4a6; 关于静态的特性** 三、友元&#x1f4a6; **友元函数**&#x1f4a6; **友元类** **四、内部类** 一、构造函数 构造函数…

Spring 事务原理总结四

作为一名认知有限的中国人&#xff0c;我对年的喜爱&#xff0c;胜过其他一切&#xff0c;因为它给了我拒绝一切的合理理由。每到这个时候&#xff0c;我都会用各种理由来为自己的不作为开脱&#xff0c;今年亦是如此。看着频频发出警报的假期余额&#xff0c;我内心的焦躁变得…

分布式文件系统 SpringBoot+FastDFS+Vue.js【一】

分布式文件系统 SpringBootFastDFSVue.js【一】 一、分布式文件系统1.1.文件系统1.2.什么是分布式文件系统1.3.分布式文件系统的出现1.3.主流的分布式文件系统1.4.分布式文件服务提供商1.4.1.阿里OSS1.4.2.七牛云存储1.4.3.百度云存储 二、fastDFS2.1.fastDSF介绍2.2.为什么要使…

详解CC++内存管理(new和delete)

文章目录 写在前面1. C&C内存分布2. C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free3. C内存管理方式&#xff08;语法&#xff09;3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4. new和delete的实现原理4.1 operator new与operator delete…

【MySQL】学习外键约束处理员工数据

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-g4glZPIY0IKhiTfe {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

STM32—DHT11温湿度传感器

文章目录 一.温湿度原理1.1 时序图 二.代码 一.温湿度原理 1.1 时序图 (1).下图一是DHT11总的时序图。 (2).图二对应图一的左边黑色部分&#xff0c;图三对应图一的绿色部分&#xff0c;图四的左部分图对应图一的红色部分&#xff0c;图四的右部分对应图一的黄色部分。 (3)…

计算机组成原理(1)----主存储器

目录 1.基本半导体元件及原理 2.寻址 1.基本半导体元件及原理 一个主存储器可以分为存储器&#xff0c;MAR&#xff08;地址寄存器&#xff09;和MDR&#xff08;数据寄存器&#xff09;&#xff0c;这三个部件由在时序控制逻辑的控制下工作 其中存储体用来存放二进制数据0和…

[BIZ-缓存] - 3.金融交易系统缓存架构设计

1. 前置文章 [BIZ] - 1.金融交易系统特点https://blog.csdn.net/besthezhaowen/article/details/136118133 [缓存] - 1.缓存共性问题https://blog.csdn.net/besthezhaowen/article/details/136111466 [缓存] - 2.分布式缓存重磅中间件 Redis-CSDN博客文章浏览阅读1.4k次&…

docker (一)-简介

1.什么是docker Docker 是一个开源的应用容器引擎&#xff0c;由于docker影响巨大&#xff0c;今天也用"Docker" 指代容器化技术。 2.docker的优势 一键部署&#xff0c;开箱即用 容器使用基于image镜像的部署模式&#xff0c;image中包含了运行应用程序所需的一…

【Java程序员面试专栏 分布式中间件】ElasticSearch 核心面试指引

关于ElasticSearch 部分的核心知识进行一网打尽,包括ElasticSearch 的基本概念,基本架构,工作流程,存储机制等,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 基础概念 从数据分类入手,考察全文索引的基本概念 现实世界中数据有哪…

【教程】Kotlin语言学习笔记(二)——数据类型(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 第二章 《数据类型》 文章目录 【Kotlin语言学习】系列文章一、基本数据…

机器学习和统计学的区别?

1、本质区别&#xff1a; 目标&#xff1a;机器学习的核心目标是建立一个可以自动学习和改进的模型&#xff0c;以预测未知数据。它更关注结果的准确性和模型的泛化能力&#xff0c;通常不关心模型是否可以解释。而统计学的目标是探究变量之间的关系&#xff0c;理解数据的内在…

Python数据科学:Scikit-Learn机器学习

4.1Scikit-Learn机器学习 Scikit-Learn使用的数据表示&#xff1a;二维网格数据表 实例1&#xff1a;通过Seaborn导入数据 def skLearn():scikit Learn基本介绍:return:import seaborn as sns#导入Iris数据集#注&#xff1a;一般网络访问不了iris sns.load_dataset(iris)ir…

Spring Boot 笔记 020 redis集成

1.1 安装redis Windows 下 Redis 安装与配置 教程_redis windows-CSDN博客 2.1 引入redis坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 2.2 配置…