溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PostgreSQL 邏輯復(fù)制學(xué)習(xí)中的深入與疑問(wèn)

發(fā)布時(shí)間:2021-12-13 11:23:27 來(lái)源:億速云 閱讀:116 作者:小新 欄目:大數(shù)據(jù)

這篇文章主要介紹了PostgreSQL  邏輯復(fù)制學(xué)習(xí)中的深入與疑問(wèn),具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

首先邏輯復(fù)制早期在 PG 10 之前是通過(guò)插件的方式來(lái)實(shí)現(xiàn)其功能的,在PG10合并進(jìn)數(shù)據(jù)庫(kù)系統(tǒng)中。

邏輯復(fù)制主要解決的問(wèn)題(是物理復(fù)制不能,或很難解決的問(wèn)題)

1   表級(jí)別的復(fù)制 

2   主從數(shù)據(jù)表的結(jié)構(gòu)有條件的不一致

3   復(fù)制的數(shù)據(jù)進(jìn)行過(guò)濾,僅僅復(fù)制 INSERT ,或者 UPATE  等操作

4   同cluster 中的不同庫(kù)的的數(shù)據(jù)復(fù)制到另一個(gè)庫(kù)中

如果說(shuō)物理復(fù)制解決的是數(shù)據(jù)同步,數(shù)據(jù)庫(kù)高可用,讀寫分離這方面的事情。邏輯復(fù)制應(yīng)該解決的是更貼近業(yè)務(wù),或者滿足更細(xì)粒度的業(yè)務(wù)場(chǎng)景中的數(shù)據(jù)同步。

邏輯復(fù)制原理圖

PostgreSQL  邏輯復(fù)制學(xué)習(xí)中的深入與疑問(wèn)

之前是有一篇邏輯復(fù)制輸出其他格式的數(shù)據(jù)的文字,在下面這張圖找到了他所處的層次和機(jī)理

PostgreSQL  邏輯復(fù)制學(xué)習(xí)中的深入與疑問(wèn)

在查看文檔中,下面這張圖,其中有一點(diǎn)不是很理解,在解碼中 產(chǎn)生 

tuplebuf * oldtuple  和  tuplebuf * newtuple 之間的意義在哪里

PostgreSQL  邏輯復(fù)制學(xué)習(xí)中的深入與疑問(wèn)

而圖中的另一個(gè)BDR,到底是什么,這里又挖掘了一下,BDR 是2quadrant 提供的一個(gè) 異步多主邏輯復(fù)制的功能。

他定義如下四個(gè)概念

Mulit-master  ,asynchronous , logical  , replication 

他們定義的復(fù)制是將數(shù)據(jù)從一個(gè)地方復(fù)制到另一個(gè)地方的過(guò)程。在BDR中,指的是BDR不是共享存儲(chǔ)架構(gòu);每個(gè)節(jié)點(diǎn)都有自己的數(shù)據(jù)庫(kù)副本,包括所有相關(guān)索引等。節(jié)點(diǎn)可以滿足查詢而不需要與其他節(jié)點(diǎn)通信,但是還必須有足夠的存儲(chǔ)空間來(lái)保存數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)

邏輯復(fù)制(基于行)是使用單個(gè)行值進(jìn)行復(fù)制。它與發(fā)送數(shù)據(jù)塊更改的物理(基于塊的)復(fù)制形成對(duì)比。

在本地提交對(duì)一個(gè)BDR節(jié)點(diǎn)所做的更改之前,不會(huì)將其復(fù)制到其他節(jié)點(diǎn)。因此,在任何給定時(shí)間,所有節(jié)點(diǎn)上的數(shù)據(jù)并不完全相同;一些節(jié)點(diǎn)將擁有尚未到達(dá)其他節(jié)點(diǎn)的數(shù)據(jù)。PostgreSQL的基于塊的復(fù)制解決方案也默認(rèn)為異步復(fù)制。

從上面學(xué)習(xí)和了解的情況來(lái)說(shuō),從某個(gè)層面看邏輯復(fù)制有兩個(gè)模塊 

DBR  +   解碼    +  解碼發(fā)送  +   外部接收 幾個(gè)部分組成。

其中我們已經(jīng)知道 DBR 是哪里來(lái)的,而decording 是怎么回事,下面來(lái)說(shuō)說(shuō)

整體的decording 的過(guò)程,從上一次最后讀取后的LSN號(hào)對(duì)應(yīng)的事務(wù)開始,從 cache 中讀取日志,如果cache 里面沒(méi)有日志會(huì)在磁盤中的日志段里面讀取獲取日志記錄,存儲(chǔ)到結(jié)構(gòu)體 xlogrecord, 然后在 logicaldecodingprocess record 模塊中進(jìn)行decode,然后進(jìn)行循環(huán)將log 解析完畢。

在LogicalDecodingProcessRecord 是解析日志的關(guān)鍵,其中內(nèi)存中維護(hù)一個(gè)哈希表,存放正在處理的事務(wù)信息,在處理每個(gè)日志記錄是如果遇到一個(gè)begin 操作就會(huì)在哈希表中插入相應(yīng)的事務(wù),在遇到commit 會(huì)將整個(gè)事務(wù)所有的語(yǔ)句進(jìn)行解析,每個(gè)事務(wù)都有一個(gè)快照,每次做事務(wù)都要更新快照,等到事務(wù)commit時(shí)獲得最新的快照,f按崗位系統(tǒng)表,得到relation node id  與  relation name 之間關(guān)系信息,從而完成Decode,在完成Decode后,會(huì)調(diào)用 RecorderBuffercommit 函數(shù),通過(guò)其中的 apply_change 函數(shù)將日志信息打印成可輸出的內(nèi)容,最終完成整個(gè)的Decode  過(guò)程。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“PostgreSQL  邏輯復(fù)制學(xué)習(xí)中的深入與疑問(wèn)”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI