postgresql walsender源码分析

news2024/11/26 7:32:41

 

  • 专栏内容:postgresql内核源码分析
  • 个人主页:我的主页
  • 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

目录

前言

介绍

数据结构

WAL对端的状态

walsender进程

WALsender交互流程

在握手阶段,主要做了两件事情:

在握手交互后,开始真正开始wal传送,调用关系如下:

walsend进程流程

结尾


前言

本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。


介绍

walsender 看名字就知道,它是通过tcp协议发送write ahead log。

那么它是什么场景下使用呢?

以及如何获得wal产生的呢?

如何与对应协调呢?

下面我们就来看看。

数据结构

typedef struct WalSnd

{

pid_t                pid;                        /* this walsender's PID, or 0 if not active */



WalSndState state;                        /* this walsender's state */

XLogRecPtr        sentPtr;                /* WAL has been sent up to this point */

bool                needreload;                /* does currently-open file need to be

 * reloaded? */



/*

 * The xlog locations that have been written, flushed, and applied by

 * standby-side. These may be invalid if the standby-side has not offered

 * values yet.

 */

XLogRecPtr        write;

XLogRecPtr        flush;

XLogRecPtr        apply;



/* Measured lag times, or -1 for unknown/none. */

TimeOffset        writeLag;

TimeOffset        flushLag;

TimeOffset        applyLag;



/*

 * The priority order of the standby managed by this WALSender, as listed

 * in synchronous_standby_names, or 0 if not-listed.

 */

int                        sync_standby_priority;



/* Protects shared variables in this structure. */

slock_t                mutex;



/*

 * Pointer to the walsender's latch. Used by backends to wake up this

 * walsender when it has work to do. NULL if the walsender isn't active.

 */

Latch           *latch;



/*

 * Timestamp of the last message received from standby.

 */

TimestampTz replyTime;



ReplicationKind kind;

} WalSnd;

这是walsender上下文的记录,记录了walsender进程pid, 以及wal发送的记录位置等。

WAL对端的状态

WAL记录,有三种状态,记录了接收端的WAL处理情况;

writed, WAL已经接收被写入磁盘;

flush, WAL被刷到磁盘上;因为先是写到缓存中,接收一部分后统计调用flush。

apply, WAL日已经在备机被回放应用了;

walsender进程

启动方式与backend一样,在postmaster收到replication的连接后启动一个backend,这个backend不处理SQL,只处理replication相关的命令。

其中对于physicalreplication,也就是流复制,主要就是发送wal。几种场景下都会启动walsender,一是在pg_basebackup时,通过walsender发送数据拷贝和wal;二是在热备时,主节点向备节点发送wal;三是级联的备节点时,上级备节点向下级备节点wal;

WALsender交互流程

在walsender启动之后,walsender与walreceiver需要进行握手交互,交互流程如下:

(1)备->walsender  "IDENTIFY_SYSTEM"

walsender->备 回复

(2)备->walsender "START_REPLICATION 6/4A000000 TIMELINE 3" 

T_StartReplicationCmd

(3)walsender查找 historytimeline找到对应的切换lsn,如果请求的startlsn还在,就按请求的位置发送;

  • 在握手阶段,主要做了两件事情:

(1)确认主机版本;

(2)协商WAL发送的起始位置;备机请求的lsn,在主机上是否存在,如果是过期的,WAL已经不存在了或者还没产生,那就流复制失败;

  • 在握手交互后,开始真正开始wal传送,调用关系如下:

exec_replication_command

->IdentifySystem

->StartReplication

->WalSndLoop

  • walsend进程流程

walsender在流复制过程中,一直会在WalSndLoop循环,大概流程如下:

(1)发送WAL调用XLogSendPhysical,从wal文件里直接读取数据;

每次最大可以发送16倍的xlog block;

#define MAX_SEND_SIZE (XLOG_BLCKSZ * 16)

当然这个大小可以与walreceiver进行协商,来控制流量;

(2)当前没有可发的WAL时,调用WalSndWait进行等待;如果网络阻塞也会在此等待事件;

(3)空闲时会发送keepalive消息;

(4)事件等待,在XlogWrite时通过WalSndWakeupRequest()打开walsender通知开关,说明已经有WAL写入磁盘;当有WAL刷盘完成后,在XLogFlush中通过WalSndWakeupProcessRequests通知walsender进行发送;


结尾

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!

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

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

相关文章

【连续介质力学】张量分量的变换定律

张量分量的变换定律 张量的分量是依赖于坐标系的,所以当坐标系发生旋转,张量分量也会发生改变,张量分量与坐标系通过分量变换规律互相关联起来的。 考虑在正交基 ( e ^ 1 , e ^ 2 , e ^ 3 ) (\hat e_1, \hat e_2, \hat e_3) (e^1​,e^2​,…

【51单片机】串口通信使用串口通信控制LED灯

🎊专栏【51单片机】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【51单片机】 🥰大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 🍔串口通信 😎代码…

HTTP1.1(四)URI

一 URI的基本格式以及与URL的区别 ① URI直观感受 1)URI是HTTP协议的重要组成部分2)ABNF如何严格定义URI ② URL、URN、URI ③ URI细讲 ④ URI的组成 ⑤ ABNF关于URI定义 blob:http 地址的原理及生成方法 video 标签 src 带有blob:http data…

NetCore发布到Docker-单机

一.git安装 1.下载 https://github.com/git/git/releases/tag/v2.40.1 2.将本地的安装包上传到 linux 服务器上,我这里放在 /opt/git/ 目录下 3.解压压缩包,得到目录 git-2.40.1,位置在 /opt/git/git-2.40.1 tar -zxvf git-2.40.1.tar.gz 4.…

【刷题之路】LeetCode 225. 用队列实现栈

【刷题之路】LeetCode 225. 用队列实现栈 一、题目描述二、解题1、主要思路解析2、先实现栈3、实现各个接口3.1、初始化接口3.2、push接口3.3、pop接口3.4、myStackTop接口3.5、myStackEmpty接口3.6、myStackFree接口 一、题目描述 原题连接: 225. 用队列实现栈 题…

如何选择合适的自动化测试工具? 我教你

目录 前言 选择最佳自动化测试工具的重要性 自动化测试工具的种类 选择自动化测试工具时要考虑的因素 自动化测试工具的选择标准 前言 自动化测试是高质量软件交付领域中最重要的实践之一。在今天的敏捷开发方法中,几乎任一软件开发过程都需要在开发阶段的某个…

测试工具-JIRA

软件测试工具—JIRA使用 1.创建 项目:一般为业务线名称 问题类型:任务、故事、缺陷等 概要:bug的简要描述,一般写出定位地方和目前现状 Sprint:一般为业务线迭代简称 测试阶段:按照各公司的测试流程对应标…

vlc搭建rtsp直播Demo

文章目录 学习链接本地视频文件作为数据源推流步骤拉流步骤 本地摄像头作为数据源拉流步骤 学习链接 ffmpeg 使用VLC亲手搭建RTSP直播点播 本地视频文件作为数据源 推流步骤 点击媒体->流 点击添加,选择视频文件,后点击串流 点击串流后&#xf…

linux异步通知实验

一、异步通知简介 中断是处理器提供的一种异步机制,配置好中断后就可以让处理器去处理其他的事情,当中断发生以后会执行中断服务函数,在中断服务函数中做具体的处理。 Linux 应用程序可以通过阻塞或者非阻塞两种方式来访问驱动设备&#xff0…

04:mysql--DCL

目录 1:介绍 2:语法 3:DCL的使用 4:权限 1:介绍 DCL英文全称是Data ControlLanguage(数据控制语言),用来管理数据库 用户、控制数据库的访问 权限。 2:语法 DCL-管理用户 查询用户 use mysql; select * from user; 创建用户 create user "用户名&quo…

缓存服务器概述

一、概述 主要功能:应用解耦,异步消息,流量削锋等问题 架构设计:实现高性能,高可用,可伸缩和最终一致性架构 常用消息队列:ActiveMQ,RabbitMQ,ZeroMQ,Kafka…

谷歌chrome浏览器升级新版后字体显示不清楚解决方案

谷歌chrome浏览器升级新版后字体显示不清楚解决方案 参考图片: Chrome更新至版本Chrome 109.0.5414.120 字体看不清 浏览器症状与表现 Chrome更新至版本Chrome 109.0.5414.120 字体看不清;会很细,在设置中选择自定义的字体,仍无法…

MySQL数据库笔记-基础篇

文章目录 MySQL概述数据库相关概念小总结 MySQL数据库版本:启动与停止客户端连接关系型数据库数据模型小总结 SQLSQL通用语法SQL分类DDL数据库操作查询创建数据类型数据类型的使用练习 修改删除小总结 DML添加数据修改数据删除数据小总结 DQLDCL MySQL概述 数据库相…

BI技巧丨矩阵甘特图

BOSS:白茶,我们最近有很多项目,能不能做个甘特图? 白茶:没问题!(应用市场上随便找个甘特图就OK了嘛!) BOSS:对了,不要那种点进来会有点卡&#xf…

二、数据结构1:单链表 模板题+算法模板(单链表)

文章目录 算法模板单链表题目模板 模板题单链表原题链接题目思路题解 算法模板 单链表题目模板 // head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点 int head, e[N], ne[N], idx;// 初始化 void init() …

【001】C++的第一个程序Hello World

C的第一个应用程序(Hello World程序) 引言一、代码二、代码解释三、注意事项四、注释语句总结 引言 💡 作者简介:专注于C/C高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。 👉…

《JavaEE》网络编程套接字

文章目录 Socket我们来解释一下上面叫做有无连接我们再来理解一下上面是可靠传输和不可靠传输面向字节流与面向数据报的区别(后期会具体分析这个)全双工 单双工 UDPDatagramSocketDatagramPacket我们来尝试写一下UDP版本的代码 TCPServerSocketSocket我们…

什么年代了?不会还有人不会插件化吧?

一.到底什么是插件化开发 插件化开发是将整个app拆分成很多模块,这些模块包括一个宿主和多个插件,每个模块都是一个apk,最终打包的时候将宿主apk和插件apk分开或者联合打包。 为什么要将一定要使用插件化开发呢? 宿…

【Linux】一文带你掌握Linux权限!

Linux权限 问题一:Linux下的用户分类有哪些?问题二:什么叫做权限?问题三:见一见没有权限是什么现象(看看就好了)问题四:权限的修改问题。chmodchownchgrp 问题五:其他问题(三个小问题)文件的初始…

51单片机(十五)直流电机驱动(PWM)

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…