在這篇博客中,我們將深入探討Postgres 16中引入的一些更高級(jí)的新功能。為了更好地理解這些功能,讀者應(yīng)具備一些Linux、Postgres和SQL的基礎(chǔ)知識(shí),因?yàn)槲覀儗⑸钊胩接戇@些新功能并指導(dǎo)如何實(shí)現(xiàn)它們。
本博客以在Ubuntu 23.04上運(yùn)行的PostgreSQL 16(開(kāi)發(fā)版)為基礎(chǔ)進(jìn)行編寫(xiě)。首先,我們將介紹一些背景信息,并簡(jiǎn)要介紹什么是雙向復(fù)制,以及為什么它很重要,然后介紹我們?nèi)绾螌?shí)現(xiàn)雙向邏輯復(fù)制。
#1?背景
在開(kāi)始學(xué)習(xí)雙向邏輯復(fù)制之前,我們首先必須了解什么是邏輯復(fù)制。
#2??邏輯復(fù)制的基礎(chǔ)知識(shí)
從 PostgreSQL 10 就支持邏輯復(fù)制功能,并且在接下來(lái)的幾年中邏輯復(fù)制功能已得到廣泛應(yīng)用和持續(xù)更新。邏輯復(fù)制是復(fù)制?(ie. replicating)數(shù)據(jù)對(duì)象的過(guò)程,其表示為它們的更改。通過(guò)這種方式,我們可以只復(fù)制表等對(duì)象的特定更改,而不是復(fù)制整個(gè)數(shù)據(jù)庫(kù),并將這些更改流式傳輸?shù)讲煌钠脚_(tái)和版本。與物理復(fù)制形成鮮明對(duì)比,邏輯復(fù)制更注重于抽象層面的數(shù)據(jù)表示,這使得它能在不同平臺(tái)和版本之間實(shí)現(xiàn)無(wú)縫的數(shù)據(jù)流傳輸。相比之下,物理復(fù)制更依賴(lài)于確切的塊地址,導(dǎo)致其復(fù)制范圍局限于整個(gè)數(shù)據(jù)庫(kù),且無(wú)法跨平臺(tái)或版本進(jìn)行數(shù)據(jù)流傳輸,因?yàn)槊總€(gè)平臺(tái)或版本的數(shù)據(jù)結(jié)構(gòu)必須完全匹配。
圖1
邏輯復(fù)制還引入了理解其雙向?qū)?yīng)關(guān)系所必不可少的兩個(gè)非常重要的元素:發(fā)布者和訂閱者,你可以將它們理解為領(lǐng)導(dǎo)者節(jié)點(diǎn)(發(fā)布者)和跟隨者節(jié)點(diǎn)(訂閱者)的角色。發(fā)布者將收集其最近的更改,并將其作為有序的命令列表發(fā)送到訂閱者。一旦訂閱者接收到這一系列命令,就會(huì)將其應(yīng)用于其數(shù)據(jù)。如果兩個(gè)數(shù)據(jù)庫(kù)最初具有相同的數(shù)據(jù),那么訂閱者將與發(fā)布者保持同步。?
#3?雙向復(fù)制
現(xiàn)在我們了解了什么是邏輯復(fù)制,那么雙向復(fù)制有什么不同之處呢?簡(jiǎn)而言之,雙向邏輯復(fù)制是指復(fù)制中的所有節(jié)點(diǎn)都同時(shí)充當(dāng)發(fā)布者和訂閱者。現(xiàn)在,每個(gè)數(shù)據(jù)庫(kù)都可以處理讀寫(xiě)請(qǐng)求,所有的更改都會(huì)以流式傳輸?shù)姆绞絺鬟f給彼此。這就是雙向的方面,與之前只有單向變化流動(dòng)不同,現(xiàn)在變化在兩個(gè)方向上都進(jìn)行流動(dòng)。?
圖2
Postgres 16 新添加的地方是它向 WITH 語(yǔ)句添加了一個(gè)新參數(shù),用于過(guò)濾掉來(lái)自特定節(jié)點(diǎn)的復(fù)制。雙向邏輯復(fù)制使用此參數(shù) WITH(ORIGIN = NONE),這會(huì)過(guò)濾掉所有具有非NONE起源的連接的復(fù)制。從本質(zhì)上講,這只允許復(fù)制新添加的數(shù)據(jù),您或許可以看到為什么會(huì)這樣。如果一個(gè)數(shù)據(jù)庫(kù)插入新數(shù)據(jù)并將其復(fù)制到第二個(gè)數(shù)據(jù)庫(kù),則第二個(gè)數(shù)據(jù)庫(kù)將復(fù)制數(shù)據(jù)并插入該數(shù)據(jù),從而觸發(fā)對(duì)原始數(shù)據(jù)庫(kù)的另一次復(fù)制。我們很快就陷入到無(wú)限復(fù)制的循環(huán)中,這就是為什么需要這個(gè)選項(xiàng)來(lái)保持一切有限的原因。
#4?好處
雙向邏輯復(fù)制的主要優(yōu)勢(shì)在于,它提供了更多的可用性,既可以滿(mǎn)足讀請(qǐng)求,也可以滿(mǎn)足寫(xiě)請(qǐng)求,因?yàn)槲覀冇袃蓚€(gè)主節(jié)點(diǎn)。這對(duì)于許多需要強(qiáng)調(diào)寫(xiě)操作的應(yīng)用程序來(lái)說(shuō)尤其有益。
#5?缺點(diǎn)
雙向邏輯復(fù)制需要一些前提條件才能正常運(yùn)行,因?yàn)樗脑S多缺點(diǎn)都來(lái)自這些特定條件。例如,在設(shè)置復(fù)制時(shí),每個(gè)數(shù)據(jù)庫(kù)中的表必須遵循相同的架構(gòu)、相同的名稱(chēng)和列,否則訂閱服務(wù)器將無(wú)法找到該表。在邏輯復(fù)制可以支持復(fù)制用于創(chuàng)建表的數(shù)據(jù)定義語(yǔ)言 (DDL) 之前,用戶(hù)必須手動(dòng)執(zhí)行此操作以確保一致性。
#6?建立
現(xiàn)在我們了解了雙向邏輯復(fù)制的基礎(chǔ)知識(shí),我們可以深入研究如何在兩個(gè)數(shù)據(jù)庫(kù)之間實(shí)現(xiàn)它。開(kāi)始與設(shè)置常規(guī)邏輯復(fù)制非常相似,但在創(chuàng)建發(fā)布服務(wù)器和訂閱服務(wù)器時(shí)有一個(gè)非常重要的區(qū)別。
首先,我們將創(chuàng)建兩個(gè)主數(shù)據(jù)庫(kù),它們將相互跟隨:
$?initdb?-D?database1
$?initdb?-D?database2
在每個(gè)數(shù)據(jù)庫(kù)的 postgres.conf 文件中,將每個(gè)數(shù)據(jù)庫(kù)的way_level設(shè)置為邏輯,并為每個(gè)數(shù)據(jù)庫(kù)指定一個(gè)唯一的端口號(hào):
postgres.conf 數(shù)據(jù)庫(kù)1
port?=?5432
wal_level?=?logical
postgres.conf 數(shù)據(jù)庫(kù)2
port?=?5433
wal_level?=?logical
>>>啟動(dòng)兩個(gè)數(shù)據(jù)庫(kù):
pg_ctl?-D?database1?-l?database1.log?start
pg_ctl?-D?database2?-l?database2.log?start
>>>為每個(gè)數(shù)據(jù)庫(kù)創(chuàng)建發(fā)布服務(wù)器:
#?CREATE?PUBLICATION?mypub1?FOR?TABLE?mytable;
#?CREATE?PUBLICATION?mypub2?FOR?TABLE?mytable;
>>>為每個(gè)數(shù)據(jù)庫(kù)創(chuàng)建訂閱服務(wù)器:
#?CREATE?SUBSCRIPTION?mysub1?CONNECTION?'host=127.0.0.1?port=5433?user=postgres?dbname=postgres'?PUBLICATION?mypub2?WITH(ORIGIN?=?NONE);
#?CREATE?SUBSCRIPTION?mysub2?CONNECTION?'host=127.0.0.1?port=5432?user=postgres?dbname=postgres'?PUBLICATION?mypub1?WITH(ORIGIN?=?NONE);?
請(qǐng)注意,創(chuàng)建發(fā)布者和訂閱者的順序至關(guān)重要。首先,我們需要?jiǎng)?chuàng)建發(fā)布者,然后才能創(chuàng)建訂閱者。為了更直觀地理解,請(qǐng)參考圖2。每個(gè)組件角落的數(shù)字表示它們的創(chuàng)建順序,這有助于確保復(fù)制過(guò)程的順利進(jìn)行。
現(xiàn)在,當(dāng)任何數(shù)據(jù)插入任一數(shù)據(jù)庫(kù)時(shí),都應(yīng)在兩個(gè)節(jié)點(diǎn)之間進(jìn)行同步復(fù)制。
#7?結(jié)論
在這篇博客中,我們介紹了 PostgreSQL 16 中的新雙向邏輯復(fù)制功能。首先,我們簡(jiǎn)要介紹了邏輯復(fù)制的背景以及用于同步數(shù)據(jù)的發(fā)布者/訂閱者模型。然后,我們討論了雙向邏輯復(fù)制的工作原理以及允許其在不觸發(fā)無(wú)限復(fù)制循環(huán)的情況下運(yùn)行的新參數(shù)。
最后,我們了解了如何在兩個(gè)主PostgreSQL 數(shù)據(jù)庫(kù)之間設(shè)置雙向復(fù)制。通過(guò)支持主節(jié)點(diǎn)之間的同步,增加可用性和數(shù)據(jù)持久性對(duì)于任何數(shù)據(jù)庫(kù)應(yīng)用程序都應(yīng)該是輕而易舉的。
*參考文獻(xiàn):
C, Vigneshwaran. Bi-Directional Replication Using Origin Filtering in PostgreSQL, Fujitsu, 31 Aug. 2023, www.postgresql.fastware.com/blog/bi-directional-replication-using-origin-filtering-in-postgresql.
原文鏈接:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-799292.html
https://www.highgo.ca/2023/12/18/new-in-postgresql-16-bi-directional-logical-replication/文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-799292.html
到了這里,關(guān)于PostgreSQL16中的新增功能:雙向邏輯復(fù)制的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!