热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

PostgreSQL9.1.2总控walsender.c源码分析

PostgreSQL9.1.2总控walsender.c源码分析,walsender.c程序中的函数都是为walsender进程发送WAL记录而准备的,包括了walsender进

PostgreSQL9.1.2总控walsender.c源码分析,walsender.c程序中的函数都是为walsender进程发送WAL记录而准备的,包括了walsender进

一、程序涉及到的一些知识

1、主服务器是以连续的归档模式操作的,而备用服务器是以连续的恢复模式从主服务器的WAL文件中读取数据。

2、归档进程pgarch就是负责在重做日志文件切换后将已经写满的重做日志文件复制到归档日志文件中,以防止循环写入重做日志文件时将其覆盖。所以说,只有数据库运行在归档模式时,这个pgarch进程才会被启动。

3、日志传送是异步进行的。WAL记录的传送是在事务提交之后进行的。

4、辅助服务器可以通过TCP连接(所谓的流复制)从WAL归档或者主服务器的目录中读取WAL记录。

5、如果想用流复制,必须在主服务器中设置相应的权限,以使来自备用服务器的流复制连接得到许可。这个需要在pg_hba.conf文件中做相应的配置。本代码中的max_wal_senders变量也是在这个文件做配置的,以提供足够大的值来存储备用服务器的数量。

二、walsender.c主要函数功能详解

walsender.c程序中的函数都是为walsender进程发送WAL记录而准备的,包括了walsender进程的入口函数、初始化函数、读取WAL记录的XlogRead函数、XlogSend函数以及walsender进程处理相关的信号函数等。

1、walsender进程重要的数据结构

(1)、标记walsender进程的状态枚举

在walsender进程的生命周期中,进程存在四个状态,即:启动状态、备份状态、获取异常状态以及终止状态。其定义如下所示:

[cpp]

下面就walsender进程的四个状态以及何时处于一种特定的状态进行说明:

①、在刚刚创建的时候是处在启动状态;

②、在日志的发送过程中,一直都是处在备份的状态;

③、如果walsender进程在休眠的时候接收到一些异常信号的时,walsender进程的状态标记为catchup态,标记出进程在和 walreceiver通信的过程中出现一些不可以处理的异常,比如:walreceiver进程请求的文件不存在、walsender进程和walreceiver进程的通信链接断开等等。

④、walsender进程在休眠的时候接收到一些异常信号的时候,会由catchup态转换为终止态,在这个状态的时候,进程一般需要处理相关的异常处理,比如发送出一些留在缓冲区中尚未发送出去的WAL日志文件、进程退出等。

(2)、存储每一个walsender进程的信息数据结构

在postgreSQL数据库系统中,可能存在多个walsender进程用来为walreceiver进程发送请求的WAL记录,如果不对每个walsender进程加以标记,整个系统将会很混乱,这个用来存储walsender进程信息的数据结构定义在src\include\replication\walsender.h文件中。其结构如下所示:

[cpp]

在WalSnd结构体中,定义了存储walsender进程的ID号,在系统中每一个进程的ID号是不一样的,这样用进程号来标记共享内存中的WalSnd结构,将会带来很大的方便。在WalSnd结构体中定义的内容分别简述如下:

①、pid:存储walsender进程的ID号;

②、state:存储walsender进程的状态,,其状态含义在上面陈述过;

③、write、flush以及apply:分别记录辅助服务器中xlog被写、刷新和应用的位置,如果辅助服务器还没有为它们赋值,则它们是无效的;

④、mutex:互斥信号量,是int类型的,用来控制一些临界资源,使得临界资源一次只能被一个进程所读、写等操作;

⑤、latch:用来保护③中的三个变量,其作用相当于一把锁;

⑥、sync_standby_priority:辅助服务器的优先级顺序,为0则表示没有被排列,被同步复制锁SyncRepLock保护。

linux

推荐阅读
  • 本文档提供了详细的MySQL安装步骤,包括解压安装文件、选择安装类型、配置MySQL服务以及设置管理员密码等关键环节,帮助用户顺利完成MySQL的安装。 ... [详细]
  • 本文详细介绍如何在Spring Boot项目中集成和使用JPA,涵盖JPA的基本概念、Spring Data JPA的功能以及具体的操作步骤,帮助开发者快速掌握这一强大的持久化技术。 ... [详细]
  • 本文介绍了一种有效的方法来监控Web服务器(如Nginx)和数据库服务器(如MySQL)的服务状态,通过端口、进程和服务响应等多种方式确保服务的正常运行。 ... [详细]
  • 本文介绍如何通过配置Linux服务器作为路由器来实现两个不同网段(192.168.1.0/24 和 192.168.2.0/24)之间的互联互通。 ... [详细]
  • 查询技巧:获取数据库中第二高薪水的方法
    本文将介绍如何使用SQL查询语句从Employee表中提取出第二高的薪水(Salary)。例如,在给定的Employee表中,通过SQL查询可以正确返回200作为第二高的薪水。 ... [详细]
  • 解析 HTTP 头 'Vary: Accept-Encoding' 的作用与重要性
    本文详细探讨了 'Vary: Accept-Encoding' HTTP 头的作用,即指导缓存系统(如代理服务器和 CDN)根据不同的编码需求存储和提供适当的资源版本,确保不同类型的客户端能够接收到适合自己的内容。 ... [详细]
  • Web网络基础
    目录儿1使用HTTP协议访问Web2HTTP的诞生2.1因特网的起源2.2互联网、因特网与万维网2.3万维网与HTTP3网络基础TCPIP3.1TCPIP协议族3.2TCPIP的分 ... [详细]
  • 解决SVN E200007错误的方法
    本文详细介绍了在使用SVN提交代码时遇到E200007错误的原因及解决方案,特别是针对服务器地址变更后的问题。 ... [详细]
  • Windows Server 2012 R2 配置IIS 8.5 Web服务器指南
    尽管许多人可能更倾向于使用Linux系统来部署Web服务,但在某些情况下,使用Windows Server 2012 R2及其内置的IIS 8.5来搭建Web服务器是必要的。本文将详细介绍如何在Windows Server 2012 R2上安装和配置IIS 8.5。 ... [详细]
  • 去控件化在线文档处理,推动高效信创办公环境
    探讨在线文档处理去控件化的趋势及其对构建高效信创办公生态的影响。 ... [详细]
  • 本文探讨了在Qt框架下实现TCP多线程服务器端的方法,解决了一个常见的问题:服务器端仅能与最后一个连接的客户端通信。通过继承QThread类并利用socketDescriptor标识符,实现了多个客户端与服务器端的同时通信。 ... [详细]
  • J2EE平台集成了多种服务、API和协议,旨在支持基于Web的多层应用开发。本文将详细介绍J2EE平台中的13项关键技术规范,涵盖从数据库连接到事务处理等多个方面。 ... [详细]
  • 了解如何有效清除远程桌面连接中的缓存记录,对于提升服务器安全性至关重要。本文将指导您完成这一过程。 ... [详细]
  • 本文探讨了在Node.js环境中如何有效地捕获标准输出(stdout)的内容,并将其存储到变量中。通过具体的示例和解决方案,帮助开发者解决常见的输出捕获问题。 ... [详细]
  • 微信小程序支付官方参数小程序中代码后端发起支付代码支付回调官方参数文档地址:https:developers.weixin.qq.comminiprogramdeva ... [详细]
author-avatar
nw3344_575
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有