postgresql流复制同异步分析

news/2024/7/7 20:17:58

postgresql流复制同异步分析

postgresql流复制主要是四个进程的交互。

  • postgres(backend进程)(主节点)

    接受客户端的请求,并通过共享内存等待walsender唤醒。

  • walsender(主节点)

    向walreceiver发送日志,通过tcp通信,采用流复制协议与walreceiver交互。

  • walreceiver(备节点)

    向walsender请求日志,并回复wal日志接收,写入,数据apply信息,通过tcp通信,采用流复制协议与walsender通信。

  • startup(备节点)

    进行日志回放,将wal日志redo成数据,通过共享内存和信号与walreceiver通信。

参数

流复制同异步由如下两个参数控制:

  • synchronous_commit

    用于指定同异步模式。

  • synchronous_standby_names

    用于指定同步时需要多少备节点确认。

synchronous_commit

配置解析

{"synchronous_commit", PGC_USERSET, WAL_SETTINGS,
            gettext_noop("Sets the current transaction's synchronization level."),
            NULL
        },
        &synchronous_commit,
        SYNCHRONOUS_COMMIT_ON, synchronous_commit_options,
        NULL, assign_synchronous_commit, NULL
static const struct config_enum_entry synchronous_commit_options[] = {
    {"local", SYNCHRONOUS_COMMIT_LOCAL_FLUSH, false},
    {"remote_write", SYNCHRONOUS_COMMIT_REMOTE_WRITE, false},
    {"remote_apply", SYNCHRONOUS_COMMIT_REMOTE_APPLY, false},
    {"on", SYNCHRONOUS_COMMIT_ON, false},
    {"off", SYNCHRONOUS_COMMIT_OFF, false},
    {"true", SYNCHRONOUS_COMMIT_ON, true},
    {"false", SYNCHRONOUS_COMMIT_OFF, true},
    {"yes", SYNCHRONOUS_COMMIT_ON, true},
    {"no", SYNCHRONOUS_COMMIT_OFF, true},
    {"1", SYNCHRONOUS_COMMIT_ON, true},
    {"0", SYNCHRONOUS_COMMIT_OFF, true},
    {NULL, 0, false}
};

配置不同的值代表不同的同步模式。

synchronous_standby_names

配置解析

{
        {"synchronous_standby_names", PGC_SIGHUP, REPLICATION_PRIMARY,
            gettext_noop("Number of synchronous standbys and list of names of potential synchronous ones."),
            NULL,
            GUC_LIST_INPUT
        },
        &SyncRepStandbyNames,
        "",
        check_synchronous_standby_names, assign_synchronous_standby_names, NULL
    },
SyncRepConfig = (SyncRepConfigData *) extra;

在check_synchronous_standby_names中解析后最终将其赋值给了SyncRepConfig。

synchronous_standby_names可以配置为某个具体的备节点名,也可以配置成any 1(*)的形式。

synchronous_standby_names = 'standby001'

或者

synchronous_standby_names='ANY 1 (*)'

walsender进程处理同步

walsender收到walreceiver回复的r报文
唤醒满足条件的backend进程
计算备库的回复确认是否满足要求,同时会计算writePtr,flushPtr,applyPtr
获取候选者个数
SYNC_REP_PRIORITY优先级模式计算ptr,最旧的
非优先级模式计算ptr,第n个
ProcessStandbyMessage
ProcessStandbyReplyMessage
SyncRepReleaseWaiters
SyncRepGetSyncRecPtr
SyncRepGetCandidateStandbys
SyncRepGetOldestSyncRecPtr
SyncRepGetNthLatestSyncRecPtr

收到walreceiver的确认报文,walsender需要判断回复的standby个数是否满足配置的要求。SyncRepGetSyncRecPtr中会计算已经回复的standby个数并和配置的值进行比较,若满足则会返回true,否则返回false。

got_recptr = SyncRepGetSyncRecPtr(&writePtr, &flushPtr, &applyPtr, &am_sync);
    if (!got_recptr || !am_sync)	{ // 若确认的standby个数不足或者不是sync模式直接返回
		LWLockRelease(SyncRepLock);
		announce_next_takeover = !am_sync;
		return;
	}

若确认的standby个数不足或者不是sync模式直接返回;

若确认的standby个数满足,且是sync模式,则需要唤醒对应模式的backend进程。

    if (walsndctl->lsn[SYNC_REP_WAIT_WRITE] < writePtr)
	{
		walsndctl->lsn[SYNC_REP_WAIT_WRITE] = writePtr;
		numwrite = SyncRepWakeQueue(false, SYNC_REP_WAIT_WRITE);
	}
	if (walsndctl->lsn[SYNC_REP_WAIT_FLUSH] < flushPtr)
	{
		walsndctl->lsn[SYNC_REP_WAIT_FLUSH] = flushPtr;
		numflush = SyncRepWakeQueue(false, SYNC_REP_WAIT_FLUSH);
	}
	if (walsndctl->lsn[SYNC_REP_WAIT_APPLY] < applyPtr)
	{
		walsndctl->lsn[SYNC_REP_WAIT_APPLY] = applyPtr;
		numapply = SyncRepWakeQueue(false, SYNC_REP_WAIT_APPLY);
	}

此时唤醒对应的后端进程后,后端进程将回复客户端。


http://lihuaxi.xjx100.cn/news/1142778.html

相关文章

AI绘画-Midjourney基础2-超强二次元风格模型 niji 5

niji 模型是 mj 的一种模型,可以生成二次元风格的图片。 在控制台输入 /settings 指令,进入设置页面。 选择第二行的 Niji version 5 模型,就可以创作二次元风格的图片了! 一、expressive 风格 expressive 风格是 niji 5 模型的默认风格。 Step into the world :: of a …

flask 添加markdown支持

flask 添加markdown支持 flask blog 演示项目 Documentation https://flask.palletsprojects.com/tutorial/ 源码 https://github.com/pallets/flask/tree/main/examples/tutorial 利用 editor.md 开源库 https://github.com/pandao/editor.md 下载 重命名为 editormd 放…

HBuilder开发uniapp添加android的模拟器的方法

我们知道使用uniapp开发多端app非常方便&#xff0c;开发过程中的模拟器也可以提高我们测试代码的效率。但我们按uniapp官网的方法&#xff0c;上google的官网下载模拟器&#xff0c;往往非常不方便。 下面我们来看一下使用其他模拟器的方法。 我们知道android开发中&#xf…

虹科新品 | 高可靠性、可适用于高磁/压的线性传感器!

PART 1 什么是线性传感器&#xff1f; 基本上&#xff0c;线性传感器是一种用于测量位移和距离的设备&#xff0c;具有高可靠性。测量网格通过光学传感器移动测量数据&#xff0c;数据被光学记录并通过控制器转换为电气数据&#xff0c;而控制器又可以转换为路径。 因此&…

DHCP+链路聚合+NAT+ACL小型实验

实验要求: 1.按照拓扑图上标识规划网络。 2.使用0SPF协议进程100实现ISP互通。 3.私网内PC属于VLAN1O, FTP Server属于VLAN2O,网关分 别为所连接的接入交换机&#xff0c;其中PC要求通过DHCP动态获取 4:私网内部所有交换机都为三层交换机&#xff0c;请合理规划VLAN&#…

华为云——代码托管的使用

一、打开前后端项目 登录华为云&#xff0c;点击页面右上角的用户名——点击个人设置 2.点击代码托管的HTTPS密码管理&#xff0c;设置自己的密码 3.回到代码仓库&#xff0c;复制HTTP地址 4.打开GitHubDesktop&#xff0c;点击左上角进行仓库克隆 &#xff08;我这里已经cl…

Linux速通 常用基本命令

大部分摘自《Linux 命令行与shell脚本编程大全》该书&#xff0c;少部分参考自csdn博客 目录 一、基本的bash shell 命令 1、文件和目录列表 基本列表功能 修改输出信息 过滤输出列表 2、处理文件 3、处理目录 4、查看文件内容 查看整个文件 查看部分文件 二、更多的…

15个对Web开发人员有用工具网站

1. 代码转图片 网址&#xff1a;https://carbon.now.sh/ 使用 Carbon 创建和分享源代码的精美图像。它提供了多种代码风格和主题。 3.图片图库 网址&#xff1a;https://unsplash.com/ 4. 智能 WebP、PNG 和 JPEG 图片压缩 网址&#xff1a;https://tinypng.com/ tiny…