這篇文章主要介紹了PostgreSQL 邏輯復(fù)制學(xué)習(xí)中的深入與疑問(wèn),具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)建站成立于2013年,我們提供高端成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站定制、成都全網(wǎng)營(yíng)銷(xiāo)推廣、微信小程序、微信公眾號(hào)開(kāi)發(fā)、seo優(yōu)化排名服務(wù),提供專(zhuān)業(yè)營(yíng)銷(xiāo)思路、內(nèi)容策劃、視覺(jué)設(shè)計(jì)、程序開(kāi)發(fā)來(lái)完成項(xiàng)目落地,為成都葡萄架企業(yè)提供源源不斷的流量和訂單咨詢(xún)。
首先邏輯復(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ù)高可用,讀寫(xiě)分離這方面的事情。邏輯復(fù)制應(yīng)該解決的是更貼近業(yè)務(wù),或者滿(mǎn)足更細(xì)粒度的業(yè)務(wù)場(chǎng)景中的數(shù)據(jù)同步。
邏輯復(fù)制原理圖

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

在查看文檔中,下面這張圖,其中有一點(diǎn)不是很理解,在解碼中 產(chǎn)生
tuplebuf * oldtuple 和 tuplebuf * newtuple 之間的意義在哪里

而圖中的另一個(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)可以滿(mǎn)足查詢(xú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ù)開(kāi)始,從 cache 中讀取日志,如果cache 里面沒(méi)有日志會(huì)在磁盤(pán)中的日志段里面讀取獲取日志記錄,存儲(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í)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
當(dāng)前名稱(chēng):PostgreSQL邏輯復(fù)制學(xué)習(xí)中的深入與疑問(wèn)
標(biāo)題路徑:http://chinadenli.net/article42/ppdchc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)、網(wǎng)站設(shè)計(jì)、微信小程序、全網(wǎng)營(yíng)銷(xiāo)推廣、網(wǎng)站建設(shè)、定制開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)