精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

PostgreSQL 14中兩階段提交的邏輯解碼正文

li5236 ? 來源:yzsDBA ? 作者:yzsDBA ? 2022-03-29 15:54 ? 次閱讀

Fujitsu OSS團隊和PostgreSQL開源社區(qū)合作在PG14中添加了在邏輯復(fù)制中對兩階段提交進(jìn)行解密的功能。下面看看這項功能是什么?

背景

兩階段提交是事務(wù)以兩階段進(jìn)行提交的一種機制。通常在分布式數(shù)據(jù)庫中用于保證一致性。事務(wù)的兩階段是PREPARE階段和COMMIT/ROLLBACK階段。PG中兩階段提交的命令是:

PREPARE TRANSACTION

COMMIT PREPARED

ROLLBACK PREPARED

PG在8.0版本已經(jīng)支持了兩階段提交,10.0版本支持邏輯復(fù)制。但是邏輯復(fù)制中一直都不支持兩階段提交。單實例中已經(jīng)支持了PREPARE TRANSACTION、COMMIT PREPARED和ROLLBACK PREPARED命令,但是當(dāng)這些命令需要邏輯復(fù)制到備機時,他們不再保持原始含義。PREPARE TRANSACTION命令被視為NOP,而根本沒有解碼。COMMIT PREPARED命令被視為COMMIT,ROLLBACK PREPARED命令被視為ABORT。

什么是兩階段提交

兩階段提交是一種原子提交協(xié)議,有助于維護分布式數(shù)據(jù)庫之間的一致性。提供數(shù)據(jù)庫內(nèi)原子性的普通提交不足以為跨數(shù)據(jù)庫的事務(wù)提供一致性。為說明這個問題,我們舉一個例子:

1) John在A銀行有300$

2) Mark在B銀行有100$

3) John想給Mark轉(zhuǎn)100$

事務(wù)進(jìn)行過程中,需要從A銀行提取100$到銀行B。事務(wù)結(jié)束的時候,應(yīng)該都有200$.如果在轉(zhuǎn)賬的過程中,任何時候任何一筆交易失敗,那么賬戶狀態(tài)應(yīng)該恢復(fù)到轉(zhuǎn)賬開始前的狀態(tài)。事務(wù)可能因各種原因而失敗。如果在事務(wù)提交之前發(fā)生任何中斷,則該事務(wù)會回滾。在我們的示例中,如果John的賬戶中扣除金額時發(fā)生中斷,那么中斷口John的賬戶不應(yīng)該減少。這就是簡單的提交如何保持?jǐn)?shù)據(jù)庫內(nèi)的一致性。

但是我們考慮這樣一種情況,即從John賬戶中扣除100$的事務(wù)在一次提交時成功,但向Mark在B銀行的賬戶中添加100$的事務(wù)失敗而被回滾。然后此操作結(jié)束后,雖然John賬戶已扣款,但Mark將不會收到該金額。100$消失了。在處理分布式事務(wù)時,簡單的提交有可能失敗。

分布式事務(wù)的分步執(zhí)行

對于兩階段提交,其中一個數(shù)據(jù)庫充當(dāng)分布式事務(wù)的協(xié)調(diào)器。

階段1

一個數(shù)據(jù)庫開始應(yīng)用事務(wù),然后做Prepare。它以prepare消息形式發(fā)送prepared事務(wù)到其它數(shù)據(jù)庫。第2個數(shù)據(jù)庫獲取到Prepare消息,然后prepare該事務(wù)。Prepare涉及事務(wù)中的修改,但不提交。這些臟數(shù)據(jù)寫到磁盤以持久化。一旦所有數(shù)據(jù)庫都prepare了事務(wù),并且有關(guān)該事務(wù)的所有信息都存儲到磁盤上,prepare階段就完成了。

階段2

接下來,仲裁器啟動提交階段。如果第2個數(shù)據(jù)庫由于某種原因未能準(zhǔn)備事務(wù),則仲裁器啟動回滾階段。因此根據(jù)prepare是否成功,事務(wù)要么提交,要么回滾。在最后提交階段發(fā)生中斷是可以恢復(fù)的,因為所需的prepare事務(wù)已經(jīng)寫入磁盤并可以重新應(yīng)用。

兩階段提交與單實例數(shù)據(jù)庫并不相關(guān),但若數(shù)據(jù)復(fù)制跨多個數(shù)據(jù)庫實例時,就相關(guān)了。

邏輯復(fù)制中支持兩階段提交非常重要。

功能概述

在PG14版本前,邏輯復(fù)制事務(wù)僅在事務(wù)提交后才被解碼和復(fù)制。這是為了避免復(fù)制事務(wù)可能最終被中止。

pYYBAGJCuz2AAk9VAADt58QBQP8805.jpg

提交時解碼事務(wù)

PG14的邏輯復(fù)制支持PREPARE TRANSACTION、COMMIT PREPARED和ROOLBACK PREPARED命令。當(dāng)PREPARE TRANSACTION命令解碼時,事務(wù)被解碼并復(fù)制。PREPARE TRANSACTION就像WAL SENDER中COMMIT一樣啟動事務(wù)重放和解碼。

poYBAGJCuz2AXylOAAD6e9PW35o258.jpg

prepare時解碼事務(wù)

我們還定義了新的插件回調(diào),允許邏輯解碼插件支持兩階段提交。

回調(diào)函數(shù)

描述

filter_prepare_cb

允許插件根據(jù)PREPARE TRANSACTION命令中使用的GID過濾Prepare時不需要解碼的事務(wù)

begin_prepare_cb

Prepare事務(wù)的開始

prepare_cb

當(dāng)PREPARE TRANSACTION命令被解碼時調(diào)用

commit_prepared_cb

當(dāng)COMMIT PREPARED命令解碼時調(diào)用

rollback_prepared_cb

當(dāng)ROLLBACK PREPARED命令解碼時調(diào)用

插件修改

test_decoding

該插件是一個邏輯解碼輸出插件,作為一個示例幫助用戶開發(fā)自己的邏輯解碼插件。test_decoding通過邏輯解碼機制接收WAL,并將其解碼為所執(zhí)行操作的文本表示。

它被修改為能夠在prepare時使用新的兩階段回調(diào)函數(shù)和解碼事務(wù)

APIs的修改

pg_create_logical_replication_slot()

該API添加了新的選項指定slot是否支持兩階段提交。輸出插件可以使用帶有兩階段選項的復(fù)制槽以支持兩階段提交。

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

案例

看下怎么檢測兩階段提交的事務(wù)解碼輸出:

1) 創(chuàng)建一個復(fù)制槽

使用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) 創(chuàng)建一個表

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

CREATE TABLE

3) 檢測prepare事務(wù)和commit事務(wù)的解碼輸出內(nèi)容

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對此功能的更改,有了解碼器端的基礎(chǔ)架構(gòu),允許在prepare時解碼兩階段提交。我們還修改了test_decoding插件以利用此基礎(chǔ)架構(gòu)。

下一步就是把對兩階段的支持實現(xiàn)到PG內(nèi)部最大的邏輯解碼插件--pgoutput插件中。這個插件支持邏輯復(fù)制的PUBLISHER/SUBSCRIBER 模式。他是邏輯復(fù)制中使用最廣泛的插件。富士通OSS團隊正在和開源社區(qū)合作,以在PG15中添加此功能。

對于分布式數(shù)據(jù)庫中的兩階段事務(wù),PG也需要支持:備機通知主機PREPARE失敗了,發(fā)起回滾。這種反饋機制在PG中不支持,是未來改進(jìn)的方向之一。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 解碼器
    +關(guān)注

    關(guān)注

    9

    文章

    1131

    瀏覽量

    40683
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    3766

    瀏覽量

    64278
收藏 人收藏

    評論

    相關(guān)推薦

    邏輯異或和邏輯或的比較分析

    邏輯異或(Exclusive OR,簡稱XOR)和邏輯或(OR)是數(shù)字邏輯和編程種基本的邏輯
    的頭像 發(fā)表于 11-19 09:48 ?186次閱讀

    邏輯異或在數(shù)字電路的作用

    XOR Gate)是數(shù)字電路的一種基本邏輯門電路,它執(zhí)行的是二進(jìn)制變量的異或運算。異或運算的特點是:當(dāng)個輸入變量不同(即一個為1,另一個為0)時,輸出為1;當(dāng)個輸入變量相同(都為
    的頭像 發(fā)表于 11-19 09:44 ?182次閱讀

    邏輯異或在編程的使用

    在計算機科學(xué)和編程邏輯運算是構(gòu)建復(fù)雜算法和數(shù)據(jù)處理的基礎(chǔ)。邏輯異或(XOR)是一種二元運算,它比較個輸入值,并在輸入值不同時返回真(true),在輸入值相同時返回假(false)
    的頭像 發(fā)表于 11-19 09:41 ?104次閱讀

    MySQL還能跟上PostgreSQL的步伐嗎

    Percona 的老板 Peter Zaitsev最近發(fā)表一篇博客,討論了MySQL是否還能跟上PostgreSQL的腳步。Percona 作為MySQL 生態(tài)扛旗者,Percona 開發(fā)了知名
    的頭像 發(fā)表于 11-18 10:16 ?132次閱讀
    MySQL還能跟上<b class='flag-5'>PostgreSQL</b>的步伐嗎

    邏輯函數(shù)的化簡方法有哪

    邏輯函數(shù)的化簡是數(shù)字電路設(shè)計的重要步驟,它有助于減少電路的門數(shù)量,提高電路的性能和可靠性。邏輯函數(shù)的化簡方法主要可以分為大類: 公式化
    的頭像 發(fā)表于 08-22 16:40 ?540次閱讀

    如果SPI啟動失敗,如何創(chuàng)建可通過USB啟動的兩階段啟動加載程序?

    ) ------------------------------------------- 你好,我想創(chuàng)建一個引導(dǎo)加載程序,在 SPI 啟動失敗時通過 USB 啟動。 如果閃存的固件不正確,設(shè)備應(yīng)能通過 USB
    發(fā)表于 08-01 08:13

    PLC邏輯運算方式有哪些

    PLC(可編程邏輯控制器)邏輯運算方式主要包括以下幾種,這些邏輯運算在PLC編程扮演著至關(guān)重要的角色,用于實現(xiàn)各種復(fù)雜的控制
    的頭像 發(fā)表于 07-24 16:55 ?549次閱讀

    臺積電高雄與寶山晶圓廠擴建,1.4nm(A14)工藝制造增添兩階段

    該項目初期曾規(guī)劃建設(shè)用于2nm工藝的三個設(shè)施(P1、P2和P3裝置),而不僅如此,臺積電還針對更先進(jìn)的工藝技術(shù)專門籌劃了P4與P5車間。
    的頭像 發(fā)表于 03-30 09:53 ?565次閱讀

    數(shù)字電路邏輯門電路分類

    數(shù)字電路邏輯門電路分類 數(shù)字電路是計算機系統(tǒng)的重要組成部分,它們由邏輯門電路構(gòu)成。邏輯門電路是一種基本的數(shù)字電路,用于根據(jù)輸入的
    的頭像 發(fā)表于 02-04 09:14 ?3441次閱讀

    AD2S83APZ外部配置及程序設(shè)置精度14位,但是其解碼數(shù)值只有13位是為什么?

    的AD2S83APZ,也做過實驗,同樣的配置,同樣的程序,電機每轉(zhuǎn)一周解碼值從0x0000到0x3FFF,只出現(xiàn)一個零點。而新購器件電機每轉(zhuǎn)一周出現(xiàn)次零點,數(shù)值變化從0x000到0x1fff后跳變?yōu)?x000,之后逐漸增至0x1FFF。 硬件電路
    發(fā)表于 12-20 06:04

    git commit代碼提交規(guī)范

    接下來我就來實踐一下,首先我這里使用的是pnpm安裝依賴的。今天主要是在提交代碼時稍微自動化一點,并且讓提交規(guī)范統(tǒng)一一些。
    的頭像 發(fā)表于 12-19 09:45 ?630次閱讀
    git commit代碼<b class='flag-5'>提交</b>規(guī)范

    如何在Delphi中使用Devart PgDAC連接PostgreSQL

    PostgreSQL是一種流行的開源關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS),廣泛用于構(gòu)建健壯且可擴展的應(yīng)用程序。
    的頭像 發(fā)表于 12-06 09:04 ?1031次閱讀

    盤點一下PostgreSQL的幾種常用脫敏方式

    PostgreSQL Anonymizer 實現(xiàn)動態(tài)脫敏的方式是通過將定義某個角色為 "MASKED" 以及脫敏規(guī)則。被授予 "MASKED" 角色的用戶將無法訪問原始數(shù)據(jù),而其他角色仍然可以訪問。它現(xiàn)已支持多種的脫敏語法,你甚至可以編寫自己的規(guī)則。
    的頭像 發(fā)表于 12-05 09:59 ?550次閱讀
    盤點一下<b class='flag-5'>PostgreSQL</b>的幾種常用脫敏方式

    kernel的啟動分為哪階段

    kernel的啟動主要分為階段。 1、階段一 從入口跳轉(zhuǎn)到start_kernel之前的階段。 對應(yīng)代碼arch/arm/kernel/head.S
    的頭像 發(fā)表于 12-04 16:45 ?616次閱讀

    SharePlex Replication for PostgreSQL-邏輯選擇

    邏輯復(fù)制首先讀取WAL,允許對復(fù)制的內(nèi)容進(jìn)行一定的選擇,并且可以在不需要操作系統(tǒng)訪問的情況下遠(yuǎn)程完成,這使得它適合于數(shù)據(jù)庫即服務(wù)平臺(DBaaS),如Amazon和Azure云服務(wù)。
    的頭像 發(fā)表于 11-29 16:01 ?479次閱讀