0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PostgreSQL 14中两阶段提交的逻辑解码正文

li5236 来源:yzsDBA 作者:yzsDBA 2022-03-29 15:54 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Fujitsu OSS团队和PostgreSQL开源社区合作在PG14中添加了在逻辑复制中对两阶段提交进行解密的功能。下面看看这项功能是什么?

背景

两阶段提交是事务以两阶段进行提交的一种机制。通常在分布式数据库中用于保证一致性。事务的两阶段是PREPARE阶段和COMMIT/ROLLBACK阶段。PG中两阶段提交的命令是:

PREPARE TRANSACTION

COMMIT PREPARED

ROLLBACK PREPARED

PG在8.0版本已经支持了两阶段提交,10.0版本支持逻辑复制。但是逻辑复制中一直都不支持两阶段提交。单实例中已经支持了PREPARE TRANSACTION、COMMIT PREPARED和ROLLBACK PREPARED命令,但是当这些命令需要逻辑复制到备机时,他们不再保持原始含义。PREPARE TRANSACTION命令被视为NOP,而根本没有解码。COMMIT PREPARED命令被视为COMMIT,ROLLBACK PREPARED命令被视为ABORT。

什么是两阶段提交

两阶段提交是一种原子提交协议,有助于维护分布式数据库之间的一致性。提供数据库内原子性的普通提交不足以为跨数据库的事务提供一致性。为说明这个问题,我们举一个例子:

1) John在A银行有300$

2) Mark在B银行有100$

3) John想给Mark转100$

事务进行过程中,需要从A银行提取100$到银行B。事务结束的时候,应该都有200$.如果在转账的过程中,任何时候任何一笔交易失败,那么账户状态应该恢复到转账开始前的状态。事务可能因各种原因而失败。如果在事务提交之前发生任何中断,则该事务会回滚。在我们的示例中,如果John的账户中扣除金额时发生中断,那么中断口John的账户不应该减少。这就是简单的提交如何保持数据库内的一致性。

但是我们考虑这样一种情况,即从John账户中扣除100$的事务在一次提交时成功,但向Mark在B银行的账户中添加100$的事务失败而被回滚。然后此操作结束后,虽然John账户已扣款,但Mark将不会收到该金额。100$消失了。在处理分布式事务时,简单的提交有可能失败。

分布式事务的分步执行

对于两阶段提交,其中一个数据库充当分布式事务的协调器。

阶段1

一个数据库开始应用事务,然后做Prepare。它以prepare消息形式发送prepared事务到其它数据库。第2个数据库获取到Prepare消息,然后prepare该事务。Prepare涉及事务中的修改,但不提交。这些脏数据写到磁盘以持久化。一旦所有数据库都prepare了事务,并且有关该事务的所有信息都存储到磁盘上,prepare阶段就完成了。

阶段2

接下来,仲裁器启动提交阶段。如果第2个数据库由于某种原因未能准备事务,则仲裁器启动回滚阶段。因此根据prepare是否成功,事务要么提交,要么回滚。在最后提交阶段发生中断是可以恢复的,因为所需的prepare事务已经写入磁盘并可以重新应用。

两阶段提交与单实例数据库并不相关,但若数据复制跨多个数据库实例时,就相关了。

逻辑复制中支持两阶段提交非常重要。

功能概述

在PG14版本前,逻辑复制事务仅在事务提交后才被解码和复制。这是为了避免复制事务可能最终被中止。

pYYBAGJCuz2AAk9VAADt58QBQP8805.jpg

提交时解码事务

PG14的逻辑复制支持PREPARE TRANSACTION、COMMIT PREPARED和ROOLBACK PREPARED命令。当PREPARE TRANSACTION命令解码时,事务被解码并复制。PREPARE TRANSACTION就像WAL SENDER中COMMIT一样启动事务重放和解码。

poYBAGJCuz2AXylOAAD6e9PW35o258.jpg

prepare时解码事务

我们还定义了新的插件回调,允许逻辑解码插件支持两阶段提交。

回调函数

描述

filter_prepare_cb

允许插件根据PREPARE TRANSACTION命令中使用的GID过滤Prepare时不需要解码的事务

begin_prepare_cb

Prepare事务的开始

prepare_cb

当PREPARE TRANSACTION命令被解码时调用

commit_prepared_cb

当COMMIT PREPARED命令解码时调用

rollback_prepared_cb

当ROLLBACK PREPARED命令解码时调用

插件修改

test_decoding

该插件是一个逻辑解码输出插件,作为一个示例帮助用户开发自己的逻辑解码插件。test_decoding通过逻辑解码机制接收WAL,并将其解码为所执行操作的文本表示。

它被修改为能够在prepare时使用新的两阶段回调函数和解码事务

APIs的修改

pg_create_logical_replication_slot()

该API添加了新的选项指定slot是否支持两阶段提交。输出插件可以使用带有两阶段选项的复制槽以支持两阶段提交。

pg_create_logical_replication_slot(slot_name name, plugin name [, temporary boolean, two_phase boolean ] )

案例

看下怎么检测两阶段提交的事务解码输出:

1) 创建一个复制槽

使用test_decoding作为输出插件,传入true,这样slot支持两阶段提交解码。

postgres=# SELECT * FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding', false, true);

slot_name | lsn

-----------------+-----------

regression_slot | 0/16B1970

(1 row)

2) 创建一个表

postgres=# CREATE TABLE data(id serial primary key, data text);

CREATE TABLE

3) 检测prepare事务和commit事务的解码输出内容

postgres=# BEGIN;

postgres=*# INSERT INTO data(data) VALUES('5');

postgres=*# PREPARE TRANSACTION 'test_prepared1';

postgres=# SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL);

lsn | xid | data

-----------+-----+-----------------

0/1689DC0 | 529 | BEGIN 529

0/1689DC0 | 529 | table public.data: INSERT: id[integer]:3 data[text]:'5'

0/1689FC0 | 529 | PREPARE TRANSACTION 'test_prepared1', txid 529

(3 rows)

postgres=# COMMIT PREPARED 'test_prepared1';

postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NULL);

lsn | xid | data

-----------+-----+------------------

0/168A060 | 529 | COMMIT PREPARED 'test_prepared1', txid 529

(4 rows)

postgres=# select * from data;

id | data

----+------

1 | 5

(1 row)

未来

PG14对此功能的更改,有了解码器端的基础架构,允许在prepare时解码两阶段提交。我们还修改了test_decoding插件以利用此基础架构。

下一步就是把对两阶段的支持实现到PG内部最大的逻辑解码插件--pgoutput插件中。这个插件支持逻辑复制的PUBLISHER/SUBSCRIBER 模式。他是逻辑复制中使用最广泛的插件。富士通OSS团队正在和开源社区合作,以在PG15中添加此功能。

对于分布式数据库中的两阶段事务,PG也需要支持:备机通知主机PREPARE失败了,发起回滚。这种反馈机制在PG中不支持,是未来改进的方向之一。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 解码器
    +关注

    关注

    9

    文章

    1203

    浏览量

    42865
  • 数据库
    +关注

    关注

    7

    文章

    3993

    浏览量

    67736
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    发布元服务提交审核

    完成所有应用信息和版本信息的配置后,可将元服务提交至华为方进行发布审核。 登录AppGallery Connect,点击“APP与元服务”。 选择要发布的元服务。 左侧导航选择“应用上架 &
    发表于 12-04 14:23

    流水线基本结构

    阶段: 取指 + 解码(Fetch + Decode):同时完成指令读取和初步解码。 执行(Execute):完成运算或数据操作。 特点: 减少流水线层级,简化控制
    发表于 11-21 07:35

    小红书获取笔记正文和点赞数的API接口

    ​  小红书(RED)是一个流行的社交平台,用户分享笔记(类似博客文章)。开发者和数据分析师常需要通过API接口获取笔记正文和点赞数,用于内容分析或应用开发。本文将详细介绍如何实现这一功能,包括
    的头像 发表于 11-18 16:27 595次阅读
    小红书获取笔记<b class='flag-5'>正文</b>和点赞数的API接口

    分享一个嵌入式学习阶段规划

    )项目进阶阶段(约 20 天) 核心目标:积累实战项目,沉淀简历成果基础工具:可选学 Git(代码提交、冲突解决)核心项目(1)STM32综合项目:做显示屏交互、ESP8266模组应用,搭配小程序开发
    发表于 09-12 15:11

    0.1-2.7 GHz SP4T 开关,带集成逻辑解码器 skyworksinc

    电子发烧友网为你提供()0.1-2.7 GHz SP4T 开关,带集成逻辑解码器相关产品参数、数据手册,更有0.1-2.7 GHz SP4T 开关,带集成逻辑解码器的引脚图、接线图、封
    发表于 08-08 18:32
    0.1-2.7 GHz SP4T 开关,带集成<b class='flag-5'>逻辑</b><b class='flag-5'>解码</b>器 skyworksinc

    LOTO示波器自定义解码功能—CANFD解码

    的CANFD解码功能进行讲解。 首先进行设备连接,使用USB转CAN/CANFD模块与一块开发板进行通信,之后使用BNC公转双夹子测试线接入模块间的通信线,红色夹子接入CANH,黑色接入CA
    的头像 发表于 07-11 10:34 750次阅读
    LOTO示波器自定义<b class='flag-5'>解码</b>功能—CANFD<b class='flag-5'>解码</b>

    CMOS的逻辑门如何应用在电路

    CMOS的逻辑门如何应用在电路 前言 在如今的电子电路,CMOS逻辑门有着接近零静态功耗和超高集成度的特点,是数字电路不可或缺的存在。其独特之处在于PMOS与NMOS晶体管的互补设
    的头像 发表于 06-19 16:07 1360次阅读
    CMOS的<b class='flag-5'>逻辑</b>门如何应用在电路<b class='flag-5'>中</b>

    Transformer架构解码器的工作流程

    解码器的作用主要是制作文本序列。与编码器类似,解码器也配备了一组类似的子层。它具有个Multi-Head attention层,一个点前馈层,并且在每个子层之后都包含剩余连接和层归一化。
    的头像 发表于 06-10 14:32 892次阅读
    Transformer架构<b class='flag-5'>中</b><b class='flag-5'>解码</b>器的工作流程

    下一代物联网:芯科科技和Arduino借助边缘AI和ML简化Matter设计和应用

    Silicon Labs(芯科科技)和Arduino宣布建立合作伙伴关系,旨在通过Arduino Nano Matter开发板(基于芯科科技的MGM240系列多协议无线模块)的两阶段合作来简化Matter协议的设计和应用
    的头像 发表于 05-19 11:15 559次阅读
    下一代物联网:芯科科技和Arduino借助边缘AI和ML简化Matter设计和应用

    NVMe协议分析之提交队列

    NVMe指令提交与完成机制是NVMe协议的核心,该机制制定了NVMe指令的交互流程和处理步骤。
    的头像 发表于 05-15 23:25 536次阅读
    NVMe协议分析之<b class='flag-5'>提交</b>队列

    展望PostgreSQL 18的新特性

    距离 PostgreSQL 17 正式发布已近半年,按照每年发布一个大版本的惯例,PostgreSQL 18 预计将在 2025 年底发布。距离正式发布还有一段时间,社区的开发工作仍在如火如荼地进行
    的头像 发表于 03-03 16:51 1392次阅读
    展望<b class='flag-5'>PostgreSQL</b> 18的新特性

    利用SSIS源、查找及目标组件集成PostgreSQL数据至ETL流程

    使用SSIS源、查找和目标组件在ETL中集成PostgreSQL数据 Devart SSIS Data Flow Components for PostgreSQL 允许您将 PostgreSQL
    的头像 发表于 02-07 09:24 1655次阅读
    利用SSIS源、查找及目标组件集成<b class='flag-5'>PostgreSQL</b>数据至ETL流程

    dbForge Studio for PostgreSQL:PostgreSQL数据库多功能集成开发环境

    什么是 dbForge Studio for PostgreSQL?是一个集成工具包包含 PostgreSQL 所需的一切 上下文感知SQL代码补全、智能格式化和语法验证 消除性能瓶颈的查询优化器
    的头像 发表于 01-16 17:26 878次阅读

    CMOS逻辑IC应用的噪声问题和解决对策

    前面期的芝识课堂,我们介绍了大量关于CMOS逻辑IC应用的一些细节事项,本期课堂让我们进入实际的应用案例,解决电路设计的噪声问题。
    的头像 发表于 01-13 10:30 1899次阅读
    CMOS<b class='flag-5'>逻辑</b>IC应用<b class='flag-5'>中</b>的噪声问题和解决对策

    PostgreSQL将不再支持MD5密码

    根据 PostgreSQL 代码仓库的最新动态,近日有维护者提交了“弃用 MD5 密码支持”的 commit。 该维护者指出,MD5 被认为不适合用作加密散列算法已有一段时间。 此外
    的头像 发表于 12-10 16:14 736次阅读