欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PostgreSQL邏輯復制解密原理解析

 更新時間:2022年09月21日 11:20:19   作者:京東云開發(fā)者  
邏輯復制,是基于復制標識復制數(shù)據(jù)及其變化的一種方法,區(qū)別于物理復制對頁面操作的描述,邏輯復制是對事務及數(shù)據(jù)元組的一種描述,這篇文章主要介紹了PostgreSQL邏輯復制解密原理解析,需要的朋友可以參考下

在數(shù)字化時代的今天,我們都認同數(shù)據(jù)會創(chuàng)造價值。為了最大化數(shù)據(jù)的價值,我們不停的建立著數(shù)據(jù)遷移的管道,從同構(gòu)到異構(gòu),從關(guān)系型到非關(guān)系型,從云下到云上,從數(shù)倉到數(shù)據(jù)湖,試圖在各種場景挖掘數(shù)據(jù)的價值。而在這縱橫交錯的數(shù)據(jù)網(wǎng)絡中,邏輯復制扮演著及其重要的角色。讓我們將視角從復雜的網(wǎng)絡拉回其中的一個端點,從PostgreSQL出發(fā),對其邏輯復制的原理進行解密。

在數(shù)字化時代的今天,我們都認同數(shù)據(jù)會創(chuàng)造價值。為了最大化數(shù)據(jù)的價值,我們不停的建立著數(shù)據(jù)遷移的管道,從同構(gòu)到異構(gòu),從關(guān)系型到非關(guān)系型,從云下到云上,從數(shù)倉到數(shù)據(jù)湖,試圖在各種場景挖掘數(shù)據(jù)的價值。而在這縱橫交錯的數(shù)據(jù)網(wǎng)絡中,邏輯復制扮演著及其重要的角色。

讓我們將視角從復雜的網(wǎng)絡拉回其中的一個端點,從PostgreSQL出發(fā),對其邏輯復制的原理進行解密。

1 概念與原理

邏輯復制,是基于復制標識復制數(shù)據(jù)及其變化的一種方法。區(qū)別于物理復制對頁面操作的描述,邏輯復制是對事務及數(shù)據(jù)元組的一種描述。

圖-WAL數(shù)據(jù)流示例

如圖所示,物理復制的數(shù)據(jù)流是對tablespace/database/filenode文件的塊進行操作,而邏輯復制的內(nèi)容是對元組進行描述。

接下來我們來看邏輯復制中的幾個概念:

復制槽

復制槽是記錄復制狀態(tài)的一組信息。由于WAL(預寫式日志)文件在數(shù)據(jù)真正落盤后會刪除,復制槽會防止過早清理邏輯復制解析所需的WAL日志。在邏輯復制中,每個插槽從單個數(shù)據(jù)庫流式傳輸一系列更改,創(chuàng)建復制槽需要指定其使用的輸出插件,同時創(chuàng)建復制槽時會提供一個快照。

輸出插件

輸出插件負責將WAL日志解碼為可讀的格式,常用的插件用test_decoding(多用來測試),pgoutput(默認使用),wal2json(輸出為json)。PostgreSQL定義了一系列回調(diào)函數(shù),我們除了使用上述插件,可以通過回調(diào)函數(shù)編寫自己的輸出插件。

圖-復制槽數(shù)據(jù)流

復制協(xié)議與消息

通過復制協(xié)議,我們可以從源端獲取WAL數(shù)據(jù)流。例如通過PSQL工具建議復制連接

psql "dbname=postgres replication=database"

開啟流式傳輸WAL

START_REPLICATION[ SLOT slot_name] [ PHYSICAL] XXX/XXX[ TIMELINE tli]

無論是物理復制,還是邏輯復制,使用PostgreSQL的發(fā)布訂閱或者pg_basebackup搭建流復制,都是通過復制協(xié)議與定義的消息進行交互(物理復制和邏輯復制數(shù)據(jù)流內(nèi)容不同)

圖- WAL數(shù)據(jù)流消息類型

圖-邏輯復制中的XLogData消息

工作流程

當我們了解了概念之后,來看一下整個解析的工作流程。由于WAL文件里一個事務的內(nèi)容并不一定是連續(xù)的,所以需要通過Reorder后放在buffer中,根據(jù)事務ID組織成一條消息,COMMIT后發(fā)送給輸出插件,輸出插件解析后將消息流發(fā)送給目標端。

圖-邏輯解析工作流程

2 問題與演進

當我們掌握了邏輯復制的原理,計劃使用其構(gòu)建我們的數(shù)據(jù)遷移應用之前,我們還有一些問題并沒有解決。讓我們來一起看看是什么亟待解決的問題,以及我們?nèi)绾芜M行處理。

問題一:Failover slot

為了高可用性,數(shù)據(jù)庫至少會存在一主一備的架構(gòu),當主庫故障進行高可用切換時,備庫卻沒有相應的復制槽信息,也就是缺少failover slot。這是由于保存slot信息的物理文件,未同步至備庫。那么我們?nèi)绾问謩觿?chuàng)建一個faliover slot呢?

1. 主庫創(chuàng)建復制槽,檢查備庫wal文件是否連續(xù)

2. 復制包含slot信息的物理文件至備庫,在pg_repslot目錄下

3. 備庫重啟,重啟后才可以看到復制槽信息,原因是讀取slot物理文件的函數(shù)StartupReplicationSlots只會在postmaster進程啟動時調(diào)用。

4. 定期查詢主庫slot狀態(tài),使用pg_replication_slot_advance函數(shù)推進備庫復制槽

自此,我們在備庫上也有了相應的信息,手動實現(xiàn)了failover slot。PostgreSQL生態(tài)中著名的高可用軟件Patroni也是以這種方式進行了實現(xiàn),區(qū)別只是在Patroni查詢主庫slot狀態(tài)時將信息寫入了DCS中,備庫拿到DCS中的位點信息進行推進。

問題二:DDL同步

原生的邏輯復制不支持解析DDL語句,我們可以使用事件觸發(fā)器來進行處理。

1. 使用事件觸發(fā)器感知表結(jié)構(gòu)變更,記錄到DDL_RECORD表中,并將該表通過邏輯復制進行發(fā)布。

2. 接收端獲取到該表的數(shù)據(jù)變更,即可處理為相應DDL語句進行執(zhí)行。

圖-事件觸發(fā)器實現(xiàn)DDL同步

問題三: 雙向同步

當數(shù)據(jù)遷移涉及雙向同步的管道時,例如想實現(xiàn)雙主雙寫,對數(shù)據(jù)庫同一對象進行操作,就會出現(xiàn)WAL循環(huán)。

圖-相同表雙向同步導致數(shù)據(jù)循環(huán)

部分DTS應用為了解決這個問題會創(chuàng)建輔助表,在事務中先對輔助表進行操作,通過解析到對輔助表的操作而得知該記錄是又DTS應用插入,從而過濾該事務,不再循環(huán)解析。PostgreSQL對事務提供了Origin記錄,無須輔助表,通過pg_replication_origin_session_setup函數(shù)或者發(fā)布訂閱中的replorigin_create即可指定Origin ID。

指定Origin ID后,我們除了可以解析后通過DTS應用進行過濾,還也可以通過解析插件中的FilterByOriginCB回調(diào)函數(shù)在解析過程中過濾,這種方式減少了數(shù)據(jù)傳輸,效率更高。

圖-test_decoding中OriginFilter函數(shù)DEMO

其他問題:

除了以上三個問題,還有一些使用的問題或限制。這里列出了一些,不再展開,僅簡要說明。

Toast處理:對于toast值(消息格式中可以判斷),我們在處理時一般使用占位符進行處理,接收端接收到占位符就不對這一列進行處理,雖然有些麻煩,但這也是在和傳輸toast值的方案中權(quán)衡的結(jié)果。

心跳表:由于復制槽記錄的XMIN是全局的,當我們發(fā)布的表一直沒有更新時,XMIN沒有推進導致WAL積壓,我們可以創(chuàng)建一張心跳表,周期性寫入數(shù)據(jù)并發(fā)布,使XMIN進行推進。

大事務延遲: 根據(jù)前文提到的工作流程我們可以知道默認事務在COMMIT后才會進行解析,這對于大事務來說勢必會導致延遲,PG14版本提供了streamin模式進行解析,即事務進行中進行解析并發(fā)送至接收端。

3 應用與實踐

前兩節(jié)我們從原理及問題的角度對PostgreSQL進行了解密,接下來我們看如何通過我們掌握的邏輯復制原理,進行數(shù)據(jù)遷移的應用與實踐。

全量與增量同步

在真實的數(shù)據(jù)遷移場景中,大部分都是全量和增量都要同步的場景,并且我們打通了數(shù)據(jù)傳輸?shù)耐ǖ篮?,也對這條通道的安全,效率,以及功能的擴展,例如清洗,脫敏等ETL能力提出了新的要求。我們先來看一下如果實現(xiàn)全量與增量的同步。

圖-數(shù)據(jù)流向示意圖

主要流程包括:

1. 創(chuàng)建復制槽并導出快照

2. 根據(jù)快照進行全量數(shù)據(jù)遷移

3. 根據(jù)復制槽進行增量數(shù)據(jù)的遷移

我們使用了PG數(shù)據(jù)庫或者消息隊列MQ作為數(shù)據(jù)代理,全量與增量解析可以同時進行,當全量數(shù)據(jù)處理完畢后,狀態(tài)機通知增量處理程序進行增量發(fā)布。而對于代理中的數(shù)據(jù),可以在解析后進行預處理。

自建實例遷移上云實踐

最后和大家分享一個自建實例遷移上云的實踐,該案例是將自建的PG10版本實例遷移至京東云上的RDS PG 11版本,通過對增量數(shù)據(jù)的回流以及數(shù)據(jù)校驗保證了數(shù)據(jù)安全與業(yè)務平穩(wěn)切換。

圖-數(shù)據(jù)遷移上云

DTS應用主要分為如下幾個階段:

1. 數(shù)據(jù)檢查階段: 檢查主鍵,權(quán)限,配置

2. 數(shù)據(jù)遷移階段: 結(jié)構(gòu),存量,增量數(shù)據(jù)遷移,監(jiān)控遷移狀態(tài)

3. 應用遷移階段: 切換域名,引入流量

4. 回滾階段: 增量數(shù)據(jù)回流,若出現(xiàn)問題可快速回滾。

到此這篇關(guān)于PostgreSQL邏輯復制解密原理解析的文章就介紹到這了,更多相關(guān)PostgreSQL邏輯復制解密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PostgreSQL常用優(yōu)化技巧示例介紹

    PostgreSQL常用優(yōu)化技巧示例介紹

    PostgreSQL的SQL優(yōu)化技巧其實和大多數(shù)使用CBO優(yōu)化器的數(shù)據(jù)庫類似,因此一些常用的SQL優(yōu)化改寫技巧在PostgreSQL也是能夠使用的。當然也會有一些不同的地方,今天我們來看看一些在PostgreSQL常用的SQL優(yōu)化改寫技巧
    2022-09-09
  • 詳解如何診斷和解決PostgreSQL中的死鎖問題

    詳解如何診斷和解決PostgreSQL中的死鎖問題

    在數(shù)據(jù)庫系統(tǒng)中,死鎖是一個常見但棘手的問題,PostgreSQL 也不例外,如果不及時診斷和解決,死鎖可能會導致系統(tǒng)性能嚴重下降,甚至應用程序的崩潰,本文將詳細探討如何診斷和解決 PostgreSQL 中的死鎖問題,需要的朋友可以參考下
    2024-07-07
  • 在Ubuntu中安裝Postgresql數(shù)據(jù)庫的步驟詳解

    在Ubuntu中安裝Postgresql數(shù)據(jù)庫的步驟詳解

    PostgreSQL 是一款強大的,開源的,對象關(guān)系型數(shù)據(jù)庫系統(tǒng)。它支持所有的主流操作系統(tǒng),包括 Linux、Unix(AIX、BSD、HP-UX,SGI IRIX、Mac OS、Solaris、Tru64) 以及 Windows 操作系統(tǒng)。本文給大家介紹了在Ubuntu中安裝Postgresql數(shù)據(jù)庫的步驟,需要的朋友可以參考下。
    2017-09-09
  • postgresql查詢今天、昨天、本周、本月、上月、今年、去年的時間以及計算時間之差

    postgresql查詢今天、昨天、本周、本月、上月、今年、去年的時間以及計算時間之差

    PostgreSQL提供了許多返回當前日期和時間的函數(shù),下面這篇文章主要給大家介紹了關(guān)于postgresql查詢今天、昨天、本周、本月、上月、今年、去年的時間以及計算時間之差的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-08-08
  • PostgreSQL中的COMMENT用法說明

    PostgreSQL中的COMMENT用法說明

    這篇文章主要介紹了PostgreSQL中的COMMENT用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL查找并刪除重復數(shù)據(jù)的方法總結(jié)

    PostgreSQL查找并刪除重復數(shù)據(jù)的方法總結(jié)

    這篇文章主要給大家介紹了PostgreSQL查找并刪除重復數(shù)據(jù)的方法,文章通過代碼示例介紹的非常詳細,對大家的學習或工作有一點的幫助,需要的朋友可以參考下
    2023-10-10
  • Postgresql創(chuàng)建新增、刪除與修改觸發(fā)器的方法

    Postgresql創(chuàng)建新增、刪除與修改觸發(fā)器的方法

    這篇文章主要介紹了Postgresql創(chuàng)建新增、刪除與修改觸發(fā)器的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • 解決PostgreSQL Array使用中的一些小問題

    解決PostgreSQL Array使用中的一些小問題

    這篇文章主要介紹了解決PostgreSQL Array使用中的一些小問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL 啟動失敗的解決方案

    PostgreSQL 啟動失敗的解決方案

    這篇文章主要介紹了PostgreSQL 啟動失敗的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • postgresql 修改列類型操作

    postgresql 修改列類型操作

    這篇文章主要介紹了postgresql 修改列類型操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論