数据库修仙炼气篇六——walsender

【AntDB数据库 问答日日新】8.25(2)walsender进程的作用 哪一项是对maintenance_work_mem参数的描述。B、把WAL日志文件通过网络传输到。A、数据库的维护操作使用的内存大小。.AntDB的目录的权限要求是什么。.walsender进程的作用?D、wal log 保留最小大小。send receiver节点。.下列哪一项不是内存相关参数。B、系统支持的最大连接数。 阅读详情

walsender

交互接口

全局变量

/* global state */
extern PGDLLIMPORT bool am_walsender; // 是否是walsender进程
extern PGDLLIMPORT bool am_cascading_walsender; // 是否是级联walsender
extern PGDLLIMPORT bool am_db_walsender; // 是否连接到数据库
extern PGDLLIMPORT bool wake_wal_senders; 

/* user-settable parameters */
extern PGDLLIMPORT int max_wal_senders; // 最大walsender进程数
extern PGDLLIMPORT int wal_sender_timeout; // wal消息发送超时时间
extern PGDLLIMPORT bool log_replication_commands;
  • am_walsender和am_db_walsender

    解析启动参数replication的值进行赋值,如果replication的值是database或者true就设置这两个值为true。

    				if (strcmp(valptr, "database") == 0)
    				{
    					am_walsender = true;
    					am_db_walsender = true;
    				}
    				else if (!parse_bool(valptr, &am_walsender)) {
                        
                    }
    
  • am_cascading_walsender

    am_cascading_walsender在初始化walSnd的时候赋值。

    am_cascading_walsender = RecoveryInProgress();
    

    值呢主要来自于全局的LocalRecoveryInProgress,LocalRecoveryInProgress=false时就是false,否则的话就从xlogctl->SharedRecoveryState取值。

    LocalRecoveryInProgress = (xlogctl->SharedRecoveryState != RECOVERY_STATE_DONE);
    

对外接口

extern void InitWalSender(void);
extern bool exec_replication_command(const char *query_string);
extern void WalSndErrorCleanup(void);
extern void WalSndResourceCleanup(bool isCommit);
extern void WalSndSignals(void);
extern Size WalSndShmemSize(void);
extern void WalSndShmemInit(void);
extern void WalSndWakeup(void);
extern void WalSndInitStopping(void);
extern void WalSndWaitStopping(void);
extern void HandleWalSndInitStopping(void);
extern void WalSndRqstFileReload(void);
  • InitWalSender

    初始化一个walSnd。当am_walsender为true的时候,porstgres启动的时候就会初始化一个walSnd。

    初始化walSnd
    InitWalSender
    InitWalSenderSlot
    MarkPostmasterChildWalSender
    SendPostmasterSignal
    MemoryContextAllocZero

    初始化slot的时候会将全局的WalSndCtl的walsnds初始化,walsnds是一个变长数组,会根据max_wal_senders进行内存分配和初始化。每个创建的walSnd都会保存到全局的WalSndCtl的数组中。

    根据walSnd的pid是否为0来判断是否需要初始化,每个初始化的walSnd的状态为WALSNDSTATE_STARTUP。

对内接口

extern void WalSndSetState(WalSndState state);

/*
 * Internal functions for parsing the replication grammar, in repl_gram.y and
 * repl_scanner.l
 */
extern int	replication_yyparse(void);
extern int	replication_yylex(void);
extern void replication_yyerror(const char *str) pg_attribute_noreturn();
extern void replication_scanner_init(const char *query_string);
extern void replication_scanner_finish(void);
extern bool replication_scanner_is_replication_command(void);
  • WalSndSetState

    用来更改walSnd的状态。

数据模型

  • walsender状态
typedef enum WalSndState
{
	WALSNDSTATE_STARTUP = 0,
	WALSNDSTATE_BACKUP,
	WALSNDSTATE_CATCHUP,
	WALSNDSTATE_STREAMING,
	WALSNDSTATE_STOPPING
} WalSndState;
  • walsender 结构

一个进程对应一个walSnd结构。

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 shown above. */
	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;
} WalSnd;
  • WalSndCtlData
typedef struct
{
	/*
	 * Synchronous replication queue with one queue per request type.
	 * Protected by SyncRepLock.
	 */
	SHM_QUEUE	SyncRepQueue[NUM_SYNC_REP_WAIT_MODE];

	/*
	 * Current location of the head of the queue. All waiters should have a
	 * waitLSN that follows this value. Protected by SyncRepLock.
	 */
	XLogRecPtr	lsn[NUM_SYNC_REP_WAIT_MODE];
	
	/*
	 * Are any sync standbys defined?  Waiting backends can't reload the
	 * config file safely, so checkpointer updates this value as needed.
	 * Protected by SyncRepLock.
	 */
	bool		sync_standbys_defined;
	
	WalSnd		walsnds[FLEXIBLE_ARRAY_MEMBER];
} WalSndCtlData;
  • NodeTag
typedef enum NodeTag {
   .....
       /*
	 * TAGS FOR REPLICATION GRAMMAR PARSE NODES (replnodes.h)
	 */
	T_IdentifySystemCmd,
	T_BaseBackupCmd,
	T_CreateReplicationSlotCmd,
	T_DropReplicationSlotCmd,
	T_ReadReplicationSlotCmd,
	T_StartReplicationCmd,
	T_TimeLineHistoryCmd,
    ......
} NodeTag;
  • XLogReaderState

    typedef uint64 XLogRecPtr;
    struct XLogReaderState
    {
        XLogReaderRoutine routine;
        XLogRecPtr	ReadRecPtr;		/* start of last record read */
    	XLogRecPtr	EndRecPtr;		/* end+1 of last record read */
    }
    
    • XLogReaderRoutine

      typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader,
      							   XLogRecPtr targetPagePtr,
      							   int reqLen,
      							   XLogRecPtr targetRecPtr,
      							   char *readBuf);
      typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader,
      								  XLogSegNo nextSegNo,
      								  TimeLineID *tli_p);
      typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader);
      typedef struct XLogReaderRoutine
      {
      	XLogPageReadCB page_read;
      	WALSegmentOpenCB segment_open;
      	WALSegmentCloseCB segment_close;
      } XLogReaderRoutine;
      
  • XLogRecoveryCtlData

    typedef struct XLogRecoveryCtlData
    {
    	/*
    	 * SharedHotStandbyActive indicates if we allow hot standby queries to be
    	 * run.  Protected by info_lck.
    	 */
    	bool		SharedHotStandbyActive;
    
    	/*
    	 * SharedPromoteIsTriggered indicates if a standby promotion has been
    	 * triggered.  Protected by info_lck.
    	 */
    	bool		SharedPromoteIsTriggered;
    
    	Latch		recoveryWakeupLatch;
    
    	/*
    	 * Last record successfully replayed.
    	 */
    	XLogRecPtr	lastReplayedReadRecPtr; /* start position */
    	XLogRecPtr	lastReplayedEndRecPtr;	/* end+1 position */
    	TimeLineID	lastReplayedTLI;	/* timeline */
    
    	/*
    	 * When we're currently replaying a record, ie. in a redo function,
    	 * replayEndRecPtr points to the end+1 of the record being replayed,
    	 * otherwise it's equal to lastReplayedEndRecPtr.
    	 */
    	XLogRecPtr	replayEndRecPtr;
    	TimeLineID	replayEndTLI;
    	/* timestamp of last COMMIT/ABORT record replayed (or being replayed) */
    	TimestampTz recoveryLastXTime;
    
    	/*
    	 * timestamp of when we started replaying the current chunk of WAL data,
    	 * only relevant for replication or archive recovery
    	 */
    	TimestampTz currentChunkStartTime;
    	/* Recovery pause state */
    	RecoveryPauseState recoveryPauseState;
    	ConditionVariable recoveryNotPausedCV;
    
    	slock_t		info_lck;		/* locks shared variables shown above */
    } XLogRecoveryCtlData;
    

数据发送

数据通过socket接口进行发送,最终数据出口为操作系统提供的socket接口的send函数。

typedef struct
{
	void		(*comm_reset) (void);
	int			(*flush) (void);
	int			(*flush_if_writable) (void);
	bool		(*is_send_pending) (void);
	int			(*putmessage) (char msgtype, const char *s, size_t len);
	void		(*putmessage_noblock) (char msgtype, const char *s, size_t len);
} PQcommMethods;
static const PQcommMethods PqCommSocketMethods = {
	socket_comm_reset,
	socket_flush,
	socket_flush_if_writable,
	socket_is_send_pending,
	socket_putmessage,
	socket_putmessage_noblock
};

其执行流程如下:

XLogSendPhysical
pq_putmessage_noblock
socket_putmessage_noblock
socket_putmessage
internal_putbytes
internal_flush
secure_write
secure_raw_write
send
PG学习笔记(1)—— 主从复制:流复制 PG学习笔记(1)—— 主从复制:流复制 闲云野鹤,乡夫俗子,不过一隅静土。 背景 PostgreSQL 9.1之前,主从复制传输以WAL日志文件为单位,主库写完WAL日志后再传输给从库,导致主从延迟较大。基于这种情况,PostgreSQL 9.1引入主从流复制,以WAL日志的record为传输单位,从库及时同步主库数据,并且应用每个WAL record,因此能做到同步复制。另外实现了Hot Standby,从库在应用WAL record的同事能够提供制度服务。 架构 PG主从流复制的核心有三个进程构成: 阅读详情

相关推荐

postgresql walsender

postgresql walsender

PostgreSQL数据库复制——walsender后端启动

walsender类似于常规后端,连接和walsender process是一对一的关系,但它主要流程是处理一组特殊的复制模式命令,而不是处理SQL查询(代码在src/backend/postmaster/postmaster.c/ProcessStartupPacket(Port*, bool)函数:当strcmp(valptr, “database”)==0时,设置am_walsender为true,在src/backend/tcop/postgres.c/PostgresMain函数处理case Q时

肥叔菌的博客 2724

检索增强世界模型(R-WoM)原理与应用实践

世界模型是AI系统理解环境的核心技术,通过构建环境的内部表示实现状态预测和行动规划。传统方法基于RNN或VAE等神经网络,而检索增强世界模型(R-WoM)创新性地引入检索机制,结合外部记忆库提升系统性能。这种架构突破模型参数限制,使AI能像人类一样利用历史经验解决问题,在游戏AI、虚拟助手等场景表现优异。关键技术包括FAISS相似性搜索、分层记忆管理和动态检索策略,其中Transformer编码器和GRU动态模型的组合实现高效环境建模。实践表明,该方法可提升47%的战术多样性,加快32%的应急响应速度。

weixin_42676876的博客 341

PostgreSQL WalSender 与 WalReceiver 进程对比

walsender和是 PostgreSQL 主从复制中关键的进程,它们负责WAL日志的传输和应用。

文牧之的博客 1830

BH1750光强度传感器Stm32f103驱动(已测试ok)

1. 实验:Stm32f103 驱动 bh1750采集光照强度,串口打印采集到的数据。 2. 实验准备器材 开发版:stm32f103c8t6 器件:bh1750 GY-302 开发环境:win10,KILE4 下载程序的软件:FlyMcu.exe 串口调试助手:ComAssistant.exe 3. BH1750 的接线 VCC:5V或3.3V ...

weixin_53329977的博客 8931

第十九届全国大学生智能车竞赛越野信标 硬件篇

全国大学生智能汽车竞赛,越野信标组

2301_77568650的博客 4118

【Postgresql源码分析之五】主备热备代码分析--Walsender进程(一)

PG中的主备复制通过两个进程实现的,主机通过walsender进程发送xlog日志,备机通过walreciver进程接收xlog日志并进行redo恢复操作。

2688

ABAP 7.40+新语法实战:用VALUE和REDUCE五分钟搞定复杂内表统计

本文详细介绍了ABAP 7.40+新语法中的VALUE和REDUCE操作符,如何高效处理复杂内表统计任务。通过实战案例展示,这些新语法能将代码量减少70%以上,显著提升开发效率和可读性,特别适合大数据量下的销售数据分析、分组统计等场景。

weixin_27219587的博客 207

数据库修仙炼气篇九——postgresql流复制同异步分析

postgresql流复制同异步详解。

growdu的网络博客 593

偏最小二乘结构方程(PLS-SEM)_TomatoSCI分析日记

①模型整体拟合指标(Goodness-of-Fit, GOF),这个可以看做整体的R方了,上限是1;②指标载荷的具体值;然而,当数据中包含潜变量(即由多个观测指标组合而成的综合概念)时,贝叶斯结构方程不太适用。指标过少(1-2 个)会削弱潜变量的解释力,而指标过多可能增加噪声,影响模型稳定性。如果指标较多,可考虑进一步划分潜变量,但应确保每个指标有意义。掌握这两类方法后,在处理多变量、因果或路径分析研究时,可以根据数据特点与研究需求灵活选择。对于一般的多变量研究,这两类结构方程均为常用且有效的分析方案。

qq_44684643的博客 2011

告别调参玄学:用 DINOv2 (ViT-S/ViT-G) 和 PCA 可视化,直观理解自监督特征

本文深入解析了DINOv2(ViT-S/ViT-G)模型在自监督学习中的特征提取机制,通过PCA降维技术实现特征空间的可视化。文章对比了不同规模模型的特征表达差异,并提供了PCA阈值调优和深度分析的实用技巧,帮助读者直观理解自监督学习的视觉密码。

weixin_42565865的博客 410

PostgreSQL 源码解读(153)- 后台进程#5(walsender#1)

本节简单介绍了PostgreSQL的后台进程walsender,该进程实质上是streaming replication环境中master节点...

1276

Java的API帮助文档

JDK帮助文档 SUN公司为JDK工具包提供了一整套文档资料,我们习惯上称之为JDK文档。 JDK文档中提供了Java中的各种技术的详细资料,以及JDK中提供的各种类的帮助说明。 JDk文档是Java语言的完整说明,大多数书籍中的类的介绍都要参照它来完成,它是编程者经常查阅的资料 如何理解API:就当做是一个“字典”,“使用手册”,API就相当于是一个电子的帮助文档,可以帮我们查看JDK提供的类的信息,平时查看的时候可结合百度一起看。 官网下载: 1、登录Oracle官网(Oracl.

人生得意须尽欢 2万+

postgresql walsender源码分析

本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。walsender 看名字就知道,它是通过tcp协议发送write ahead log。那么它是什么场景下使用呢?以及如何获得wal产生的呢?如何与对应协调呢?下面我们就来看看。

一个追逐梦想的码农 5712

基金估值核算系统三国杀:恒生 VS 赢时胜 VS 融选!

本文对比分析了恒生电子、赢时胜和融选科技三家金融科技公司的基金估值系统。恒生电子作为行业龙头,在公募基金领域占据较大份额,其新一代估值系统6.0采用微服务架构,自动化程度高;赢时胜在中型公募和券商资管领域优势明显,其V5.5系统在信创适配和复杂产品处理方面表现突出;融选科技作为新兴厂商,提供轻量化解决方案,适合中小型机构。文章从市场格局、系统定位、技术架构、成本构成和用户反馈五个维度进行深入比较,为金融机构选型提供参考。当前估值系统市场呈现"三国鼎立"格局,各具特色,选型需结合机构规模、

magbox520的博客 828

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

PostgreSQL 15如何改善了逻辑复制中的通信

现在,我将分别介绍这篇博文开头提到的两个问题是如何改进/修复的。

魂醉的一亩二分地 763

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

pgsql 的主备 流复制(ssl认证)

一、PostgreSQL通过WAL日志构建高可靠性原理: PostgrepSQL在数据目录的子目录pg_xlog子目录中维护了一个WAL日志文件,可以把WAL日志备份到另外一台备份服务器,通过重做WAL日志的方式在备服务器上恢复数据(类似Oracle的redo日志)。 WAL日志复制到另外一台备份服务器可以有两种方式: 1、 WAL日志文件复制 此种方式是写完一个WAL日志后,才把WAL日志文件拷贝到备份数据库中。这样通常备份会落后主库一个WAL日志文件,当主数据库发生故障时,主数据库的WAL文件并没有填充

KillerXie的博客 891

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

PostgreSQL数据库复制——后台一等公民进程WalReceiver&startup交互

在PostgreSQL流复制过程中,有三个进程协同工作:walsender进程,walreceiver进程和startup进程。其中walsender进程属于主节点的进程,主要用来向备节点发送wal record; walreceiver和startup进程属于备节点进程,wal receiver主要用来接收主端发送来的wal record并写入磁盘上的XLOG文件中,之后startup进程就会对这些wal数据进行replay。三个进程共同协作,完成主备的整个流复制过程。本篇博客主要关注于WalReceiv

肥叔菌的博客 1473

PostgreSQL WAL 原理剖析、日志堆积治理与流复制监控

state, -- 复制状态:startup(启动), catchup(追赶), streaming(流复制中), backup(备份中), stopping(停止)sync_state, -- 同步模式:async(异步), sync(同步), potential(潜在同步), quorum(法定人数同步)逻辑流复制需 logical。restart_lsn, -- 备库需要的旧 LSN,决定了 WAL 堆积的起点。

king_harry的专栏 1051

PG物理复制剖析

PG物理复制原理

DBA成长之路 1849

postgresql13主从切换

提升从库为主库之后,可以看到,后台进程中不再有startup recovering,以及walreceiver streaming进程了,同时多了postgres: walwriter 写进程;4.通过原主库(10.124.50.13)上nginx四层代理新主库(10.124.50.14)的地址,保持对外的地址不变,便于服务重连。会有如下报错,不用管它,第一次启动会进行数据初始化,时间非常久,观察端口和日志正常,等待数据初始化结束即可。1.主库(10.124.50.13)故障,停掉主库。

Recool7的博客 1006

PostgreSQL PG主备流复制机制

PostgreSQL在9.0之后引入了主备流复制机制,通过流复制,备库不断的从主库同步相应的数据,并在备库apply每个WAL record,这里的流复制每次传输单位是WAL日志的record。而PostgreSQL9.0之前提供的方法是主库写完一个WAL日志文件后,才把WAL日志文件传送到备库,这样的方式导致主备延迟特别大。同时PostgreSQL9....

weixin_33769125的博客 494

PostgreSQL数据库网络层——libpq服务端网络通信方法

网络I/O通信 src/backend/libpq/pqcomm.c文件为libpq网络通信服务端提供了如下通信方法。pq_getstring、pq_getmessage其实就是调用pq_getbytes函数,pq_getbytes、pq_getbyte和pq_peekbyte都是调用的pq_recvbuf函数,所以本博客以pq_getbytes函数描述网络I/O读的流程。 * low-level I/O: * pq_getbytes - get a known number of bytes fr

肥叔菌的博客 2238

Postgresql - 源码 - WAL Sender process

介绍: WAL sender process 是9.0的新功能。需要从主服务器发送XLOG到单个recipient(备机)。注意可以同时存在多个walsender进程。当备用服务器的walreceiver连接到主服务器并请求XLOG streaming replication的时候,由postmaster启动walsender process。 walsender类似于常规后端,连接和wals...

chuckchen1222的博客 2395

[原创]postgreSQL9.1.2总控walsender.c源码分析

一、程序涉及到的一些知识 1、主服务器是以连续的归档模式操作的,而备用服务器是以连续的恢复模式从主服务器的WAL文件中读取数据。 2、归档进程pgarch就是负责在重做日志文件切换后将已经写满的重做日志文件复制到归档日志文件中,以防止循环写入重做日志文件时将其覆盖。所以说,只有数据库运行在归档模式时,这个pgarch进程才会被启动。 3、日志传送是异步进行的。WAL记录的传送是在事务提交之后...

编程资料大全 336

pg9.1 max_wal_sender 的含义

pg9.1 支持streaming replication 我们设置数据库的时候会遇到这个参数 ,官方文档上关于这个参数的介绍只有一行: “Specifies the maximum number of concur...

cudi7618的博客 618
上一篇: 数据库修仙炼气篇七——replication
下一篇: 数据库修仙炼气篇五——pg_walreceiver
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我在数据库世界里修仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值