数据库修仙炼气篇五——pg_walreceiver

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

pg_walreceiver

启动流程

启动receiver进程

main
PostmasterMain
StartChildProcess
fork_process
AuxiliaryProcessMain
WalReceiverMain

连接主库

WalReceiverMain
walrcv_connect
libpqrcv_connect

wal_receiver整体流程

wal_receiver整体流程由三层循环组成,第一层循环使用launch机制,第二层和第三层则使用for(;;)实现。

  • 第一层循环是wal_receiver进程的控制循环,负责挂起和监听socket是否有数据到来
  • 第二层循环是流复制流程,从一次流复制开始到流复制结束或流复制出现错误
  • 第三层循环是wal数据和心跳数据接收,不断的从socket的buffer中收取数据,直到buffer中没有数据

wal数据接收流程

收到wal数据
收到心跳
loop
walrcv_receive
XLogWalRcvProcessMsg
ProcessWalSndrMessage
XLogWalRcvWrite
pg_pwrite
XLogWalRcvSendReply
  1. wal数据接收在walreceiver的第三层循环,通过循环调用walrcv_receive收取数据,当返回的数据长度小于等于0时退出;其中等于0时表示没有数据,小于0表示收包遇到错误;

    					for (;;)
    					{
    						if (len > 0)
    						{
    							/*
    							 * Something was received from primary, so reset
    							 * timeout
    							 */
    							last_recv_timestamp = GetCurrentTimestamp();
    							ping_sent = false;
    							XLogWalRcvProcessMsg(buf[0], &buf[1], len - 1,
    												 startpointTLI);
    						}
    						else if (len == 0)
    							break;
    						else if (len < 0)
    						{
    							ereport(LOG,
    									(errmsg("replication terminated by primary server"),
    									 errdetail("End of WAL reached on timeline %u at %X/%X.",
    											   startpointTLI,
    											   LSN_FORMAT_ARGS(LogstreamResult.Write))));
    							endofwal = true;
    							break;
    						}
    						len = walrcv_receive(wrconn, &buf, &wait_fd);
    					}
    
  2. 当收到数据后,会根据报文的第一个字节区分wal数据和心跳,并进行区别处理;

    	switch (type)
    	{
    		case 'w':				/* WAL records */
    			{
    				/* copy message to StringInfo */
    				hdrlen = sizeof(int64) + sizeof(int64) + sizeof(int64);
    				if (len < hdrlen)
    					ereport(ERROR,
    							(errcode(ERRCODE_PROTOCOL_VIOLATION),
    							 errmsg_internal("invalid WAL message received from primary")));
    				appendBinaryStringInfo(&incoming_message, buf, hdrlen);
    
    				/* read the fields */
    				dataStart = pq_getmsgint64(&incoming_message);
    				walEnd = pq_getmsgint64(&incoming_message);
    				sendTime = pq_getmsgint64(&incoming_message);
    				ProcessWalSndrMessage(walEnd, sendTime);
    
    				buf += hdrlen;
    				len -= hdrlen;
    				XLogWalRcvWrite(buf, len, dataStart, tli);
    				break;
    			}
    		case 'k':				/* Keepalive */
    			{
    				/* copy message to StringInfo */
    				hdrlen = sizeof(int64) + sizeof(int64) + sizeof(char);
    				if (len != hdrlen)
    					ereport(ERROR,
    							(errcode(ERRCODE_PROTOCOL_VIOLATION),
    							 errmsg_internal("invalid keepalive message received from primary")));
    				appendBinaryStringInfo(&incoming_message, buf, hdrlen);
    
    				/* read the fields */
    				walEnd = pq_getmsgint64(&incoming_message);
    				sendTime = pq_getmsgint64(&incoming_message);
    				replyRequested = pq_getmsgbyte(&incoming_message);
    
    				ProcessWalSndrMessage(walEnd, sendTime);
    
    				/* If the primary requested a reply, send one immediately */
    				if (replyRequested)
    					XLogWalRcvSendReply(true, false);
    				break;
    			}
    		default:
    			ereport(ERROR,
    					(errcode(ERRCODE_PROTOCOL_VIOLATION),
    					 errmsg_internal("invalid replication message type %d",
    									 type)));
    	}
    

    如果是wal报文,则进行写入;如果是心跳报文需要进一步读取报文的最后一个字节是否为1,为1表示需要回复心跳报文。

  3. 当一次数据收取结束后(socket的buffer中没有数据),此时walreceiver也需要进行回复,通知walsender收到了数据;

    					/* Let the primary know that we received some data. */
    					XLogWalRcvSendReply(false, false);
    
  4. 同时如果写入了数据,需要将数据flush到磁盘

    					/*
    					 * If we've written some records, flush them to disk and
    					 * let the startup process and primary server know about
    					 * them.
    					 */
    					XLogWalRcvFlush(false, startpointTLI);
    
PostgreSQL:“ FATAL: requested WAL segment00800002A0 has already been removed” 在使用配置了热备的PostgreSQL数据库时,在执行大量事务时,尤其是一个需要插入几千万条数据的insert事务时(典型的做法是持续 insert into t select * from t;),后台log中报错如下: csv格式日志: 2013-07-01 13:25:29.430 CST,,,27738,,51d112c8.6c5a,1,,2013-07-01 13:2 阅读详情

相关推荐

【0379】Postgres内核 walreceiver (libpqwalreceiver API)分析

它会等待常规后端进程消亡,然后写入关机检查点并终止 pgarch 及其他辅助进程,但对于 walsender 进程而言,这种做法并不可取,因为我们希望备用服务器在主服务器关机前接收所有的 WAL,包括关机检查点。当 postmaster 接受一个连接时,它会立即 forks 出一个新进程来处理握手和认证操作,该进程会初始化成为一个后端进程。在完成初始化并在 PMSignal 数组中对自身进行标记之前,walsender 进程看起来与常规后端进程无异,并且在进程终止时,会取消 PMSignal 位置的标记。

Postgres 数据库内核开发工程师 631

PostgreSQL数据库复制——后台一等公民进程WalReceiver 收发逻辑

首先看图中的for死循环,其在循环流程出现错误或者end-of-streaming情况(流复制由主库终止)才会退出。其执行流程如下所示: 首先尝试一把walrcv_receive,如果读取的数据len等于零的时候,需要调用WaitLatchOrSocket阻塞监听WL_EXIT_ON_PM_DEATH | WL_SOCKET_READABLE | WL_TIMEOUT | WL_LATCH_SET事件,也就是我们想要等待网络套接字可读或者latch超时。 如果尝试出来读取的数据len不等于零,也就是有数.

肥叔菌的博客 1013

Wal receiver进程描述结构

WalReceiver进程的描述结构WalRcvData,仅当作记录typedef struct { pid_t pid;//当前walreciver进程的pid WalRcvState walRcvState;//标记进程状态 pg_time_t startTime;//RequestXLogStream函数调用的开始时间 //startup...

帅的数说 513

Postgresql关于wal日志总结,一文搞清楚它的所有概念和相关操作

官方文档 https://www.postgresql.org/docs/11/wal-intro.html https://www.postgresql.org/docs/11/wal-configuration.html https://www.postgresql.org/docs/11/runtime-config-wal.html https://www.postgresql.org/docs/11/runtime-config-preset.html https://www.postgresql

lusklusklusk的博客 1万+

视觉辅助RIS波束追踪:用摄像头“看见”用户,实现毫秒级波束对准

在无线通信领域,波束成形技术是提升高频段信号覆盖与质量的核心手段,其原理是通过调整天线阵列的相位,使信号能量在特定方向相干叠加,形成高增益定向波束。这项技术的价值在于能有效克服高频信号路径损耗大、穿透性差的瓶颈,广泛应用于5G/6G、毫米波通信及室内定位等场景。然而,传统波束追踪依赖信道估计或波束扫描,存在训练开销大、实时性差的问题。本文聚焦于一种创新解决方案:将计算机视觉与可重构智能表面(RIS)相结合。通过摄像头直接感知用户位置,并利用RIS快速重构反射波束方向,实现了近乎零开销、毫秒级延迟的波束追踪,

weixin_33552698的博客 620

IAR9.20.4安装与注册全攻略:附资源及典型问题解决方案

本文提供IAR9.20.4的详细安装与注册指南,涵盖环境准备、安装步骤、权限设置及注册机使用技巧。针对典型问题如评估版残留、权限不足和杀毒软件拦截等,给出了具体解决方案,帮助用户顺利完成IAR开发环境的搭建与激活。

a2b3c4d5e的博客 297

第十一章 PostgreSQL中的流复制

搞了一个公众号PostgreSQL运维技术,欢迎来踩~ 悄悄放一张: PostgreSQL运维技术 原文:https://www.interdb.jp/pg/pgsql11.html 同步流复制的特性是从9.1版本开始实现的,这种本地复制特性是基于log shipping,这是一种通用的复制技术。其中主服务器持续地发送wal数据,然后备库在本地对接收到的wal数据进行重放。 这一章文字比较多,也是PG实现高可用(一主多从)的基石,很重要...... 这章包括以下几个主题: 流...

深海微澜 4612

Qt实现仿微信在线聊天工具(服务器、客户端)V1_ 01

在主控类中绑定登录类的信号 void signalLoginOK() ,跳过验证步骤,先实现页面的跳转MyChatToolClient.h文件//登录成功槽函数 private :MyChatToolClient.cpp文件} //登录成功槽函数 void MyChatToolClient :: slotLoginOk() {//关闭登录窗口并释放空间 m_loginWin -> close();//新建并打开聊天窗口 m_chatWin = new ChatWindow;

Leo的博客 1874

PostgreSQL WalSender 与 WalReceiver 进程对比

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

文牧之的博客 1830

STM32F4_DHT11数字温湿度传感器

开机的时候先检测是否有DHT11存在,如果没有,则提示错误。DHT11和DS18B20相同,传感器输出的都是未编码的二进制数字。本节我们将利用STM32F4来读取DHT11的温湿度传感器,获取环境的温度和湿度值。因此:温湿度的读取方式就是整数部分的二进制转换成十进制放在整数部分;小数部分的二进制转换成十进制放在小数部分。DHT11和MCU的一次通讯时间最大3ms,主机连续向DHT11采样的间隔建议不小于100ms。DHT11是广州奥松有限公司生产的一款温湿度一体化的数字传感器。数据分小数部分和整数部分。

light_2025的博客 3432

【Python实战解析】从数据爬取到房价预测:一个完整的数据科学项目流程拆解

本文详细拆解了一个完整的Python数据科学项目流程,从爬取长沙二手房数据到房价预测模型构建。通过实战案例,介绍了数据爬取、清洗、可视化及模型优化的关键技巧,帮助开发者掌握Python在数据分析中的应用,提升程序开发能力。

weixin_30379531的博客 412

PG的wal receiver进程如何启动

备机的receiver进程是由恢复进程即startup进程发启。具体如下:1)恢复进程首先需要打开需要恢复的WAL日志文件。通过函数WaitForWALToBecomeAvailable完成。2)从前文中可知,日志文件读取的顺序是LOG_FROM_ARCHIVE - XLOG_FROM_PG_WAL - XLOG_FROM_STREAM。也就是先从归档中读取,归档读取失败...

帅的数说 640

Tesseract in Java - Intellij IDEA对Tess4J的配置和使用

最近要弄OCR,搜到这个,官网全英文,很烦,看看有没有中文的博客介绍,擦,一个比一个奇葩,还是自己按照官方的来吧,外网慢的很,传到csdn给大家下载。中文训练库下载地址: http://download.youkuaiyun.com/detail/d_dmelon/9916532Tess4J3.4下载地址: http://download.youkuaiyun.com/detail/d_dmelon/9916519安装

Lewis的博客 1万+

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

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

肥叔菌的博客 1473

uniapp - [微信小程序 | 安卓苹果app] 详细实现接入天地图完整流程,提供显示地图、IP 属地定位 / 用户定位的城市名称、用户定位的经纬度超多功能(复制运行示例代码,详细注释及常见问题)

uni-app,微信小程序,安卓app,苹果app,App端,支付宝小程序,nvue,天地图,国家天地图api,接入使用天地图,uniApp小程序端接入天地图,uniapp安卓苹果app端接入天地图,微信小程序平台如何引入天地图,天地图Api使用教程,如何在uniapp里集成天地图,使用天地图获取当前定位,天地图api教程,天地图官方文档,天地图详细使用教程,Uniapp项目如何使用天地图,项目引入天地图配置及使用教程,使用天地图获取用户定位,天地图获取用户当前位置信息(经纬度),如何通过天地图拿到用户定位

🏆 前端领域优质创作者 1万+

一文速学数模-K-means聚类算法实战:信用卡用户画像聚类分析

该项目算是非常经典的金融业务用户画像的基础分析了,主要根据用户信用卡使用行为数据进行分析,根据收集到的不同字段信息,对每个用户划分类别。这里需要说明一下的是,聚类模型只是将具有相似行为的大部分用户聚集到一个类别里面,这点并不会考虑到每个字段的含义,也就是分成的类别并不是用户价值等级,此类别仅仅是这个类别大体相同的信用卡用户行为对象,并不能给每个用户价值打上标签,那是评价模型做的事,这里要注意不要搞混淆了,用户价值评价是评价模型决定的,而画像是聚类模型分析的。

master_hunter的博客 1万+

PostgreSQL的系统视图pg_stat_wal_receiver

在 PostgreSQL 中,视图提供了关于 WAL(Write-Ahead Logging)接收进程的统计信息。WAL 接收器是 PostgreSQL 集群中流复制的一部分,它在从节点中工作,通过流复制将 WAL 日志从主节点接收并写入从节点。

文牧之的博客 1673

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

PostgreSQL数据库复制——后台一等公民进程WalReceiver pg_stat_wal_receiver视图

pg_stat_wal_receiver视图只包含一行,显示来自该接收器连接的服务器 WAL 接收器的统计信息。(The pg_stat_wal_receiver view will contain only one row, showing statistics about the WAL receiver from that receiver’s connected server.) pg_stat_wal_receiver视图定义如下所示。其中需要关注: pg_stat_get_wal_receiv

肥叔菌的博客 894

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

PostgreSQL 主备流复制启动过程

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33737774的博客 594

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Postgresql - 源码 - walreceiver process

启动进程时执行一个函数,这个函数是walreceiver 进程的主入口。 WalReceiverMain()   代码位置: src/backend/replication/walreceiver.c   下面我们看一下主入口函数   /* Main entry point for walreceiver process */ void WalReceiverMain(void...

chuckchen1222的博客 1222

使用 pg_receivewal 时 PostgreSQL 恢复

了解如何使用时间点恢复有效地恢复您的数据库,当您使用pg_receivewal将WAL文件流式传输到另一个系统时。本教程假设您已经设置了1)在主数据库和复制PostgreSQL数据库集群之间流式复制,2)使用复制插槽,3)使用pg_receivewal(或pg_receivexlog)。如果需要设置这些,

allway2的博客 380

PostgreSQL WAL 使用 pg_receivewal 存档

了解如何使用 pg_receivewal 将 PostgreSQL 的 Write Ahead Log (WAL) 存档到单独的服务器。这可能是存档您的 WAL 文件的最有效方法之一。本教程假设您已经在主服务器和复制版 PostgreSQL 服务器之间设置了流式复制。

allway2的博客 271

PostgreSQL数据库复制——后台一等公民进程WalReceiver获知连接

备机在启动时会调用RequestXLogStreaming函数(这一步在哪里调用在前面的博客中已经描述过),这个函数会将GUC参数中的primary_conninfo信息保存在WalRcvData中(WalRcvData是由WalRcvShmemInit函数在共享内存中初始化的),也会保存WAL日志的复制起始LSN及时间线信息,然后通过SendPostmasterSignal(PMSIGNAL_START_WALRECEIVER)通知Postmaster进程启动WalReceiver进程,WalRecive

肥叔菌的博客 757

PostgreSQL数据库复制——后台一等公民进程WalReceiver启动函数

WalReceiver启动流程 WalReceiverProcess流复制接收进程启动需要调用的函数是MaybeStartWalReceiver,有两种情况会调用该函数(ServerLoop(postmaster.c)/sigusr1_handler --> MaybeStartWalReceiver --> StartWalReceiver)。在postmaster守护进程运行ServerLoop函数时,如果WalReceiverRequested为true,则需要调用MaybeStartWa

肥叔菌的博客 1125

pg_stat_wal_receiver说明

postgres=# select * from pg_stat_wal_receiver; -[ RECORD 1 ]---------+----------------------------------------------------------------------------------------------------------------------------------...

m15217321304的博客 1359

PostgreSQL 中 pg_receivewal 的用途

pg_receivewal 是 PostgreSQL 提供的一个工具,用于接收和存储来自主服务器(Primary Server)的 WAL(Write-Ahead Logging,预写日志)文件

qq_34254018的博客 515
上一篇: 数据库修仙炼气篇六——walsender
下一篇: 数据库修仙金丹篇十三——缩短tcp超时时间的方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

我在数据库世界里修仙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值