資源描述:
《postgresql . 邏輯復(fù)制原理與最佳實踐》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、PostgreSQL10.0邏輯復(fù)制原理與最佳實踐本文章來自于阿里云云棲社區(qū)摘要:?標簽PostgreSQL,logicalreplication,邏輯復(fù)制,最佳實踐背景PostgreSQL從2010年發(fā)布的9.0開始支持流式物理復(fù)制,備庫可以作為只讀庫打開,提供給用戶使用。標簽PostgreSQL,logicalreplication,邏輯復(fù)制,最佳實踐背景PostgreSQL從2010年發(fā)布的9.0開始支持流式物理復(fù)制,備庫可以作為只讀庫打開,提供給用戶使用。物理復(fù)制的好處1.物理層面完全一致,這是許多商業(yè)數(shù)據(jù)庫的慣用手段。例如Oracle
2、的DG。2.延遲低,事務(wù)執(zhí)行過程中產(chǎn)生REDOrecord,實時的在備庫apply,事務(wù)結(jié)束時,備庫立馬能見到數(shù)據(jù)。不論事務(wù)多大,都一樣。3.物理復(fù)制的一致性、可靠性達到了金融級的需求,不必擔(dān)心數(shù)據(jù)邏輯層面不一致。但是物理復(fù)制要求主備塊級完全一致,所以有一些無法覆蓋的應(yīng)用場景,例如備庫不僅要只讀,還要可寫。又比如備庫不需要完全和主庫一致,只需要復(fù)制部分數(shù)據(jù),或者備庫要從多個數(shù)據(jù)源復(fù)制數(shù)據(jù),等等。物理復(fù)制無法覆蓋的場景1.數(shù)據(jù)庫實例的部分,例如單個數(shù)據(jù)庫或者某些表的復(fù)制需求。例如某個游戲業(yè)務(wù),賬號體系是一套數(shù)據(jù)庫,如果全國各地有多個接入點,全部都
3、連到中心數(shù)據(jù)庫進行認證可能不太科學(xué)。那么就希望將登陸需要用到的一些數(shù)據(jù)表同步到多個數(shù)據(jù)中心,而不是整個數(shù)據(jù)庫實例。2.數(shù)據(jù)到達subcriber后,針對不同數(shù)據(jù),設(shè)置觸發(fā)器。3.將多個數(shù)據(jù)庫實例的數(shù)據(jù),同步到一個目標數(shù)據(jù)庫。例如多個數(shù)據(jù)庫同步到一個大的數(shù)據(jù)倉庫。4.在不同的數(shù)據(jù)庫版本之間,復(fù)制數(shù)據(jù)5.將一個數(shù)據(jù)庫實例的不同數(shù)據(jù),復(fù)制到不同的目標庫。例如省級數(shù)據(jù)庫的數(shù)據(jù),按地區(qū)劃分,分別復(fù)制到不同的地區(qū)。6.在多個數(shù)據(jù)庫實例之間,共享部分數(shù)據(jù)。例如某個業(yè)務(wù)按用戶ID哈希,拆分成了8個數(shù)據(jù)庫,但是有些小的維度表,需要在多個數(shù)據(jù)庫之間共享。以上場景是
4、物理復(fù)制無法覆蓋的。邏輯復(fù)制應(yīng)運而生,實際上,從2014年發(fā)布的9.4版本開始,PostgreSQL就支持邏輯復(fù)制了,只是一直沒有將其引入內(nèi)核。2017年即將發(fā)布的10.0,將會在內(nèi)核層面支持基于REDO流的邏輯復(fù)制。另一個好消息是,你可以針對同一個數(shù)據(jù)庫實例,同時使用邏輯復(fù)制和物理復(fù)制,因為他們都是基于REDO的。下面我們來看一下邏輯復(fù)制的概念、架構(gòu)、監(jiān)控、安全、最佳實踐。邏輯復(fù)制概念PostgreSQL邏輯復(fù)制是事務(wù)級別的復(fù)制,引入了幾個概念publication-發(fā)布者發(fā)布者指數(shù)據(jù)上游節(jié)點,你需要將哪些表發(fā)布出去?上游節(jié)點需要配置這些東西
5、1.需要將數(shù)據(jù)庫的REDO的wal_level配置為logical。2.需要發(fā)布邏輯復(fù)制的表,必須配置表的REPLICAIDENTITY,即如何標示老的記錄。被復(fù)制的表,建議有PK約束。altertabletable_nameREPLICAIDENTITY{DEFAULT
6、USINGINDEXindex_name
7、FULL
8、NOTHING}解釋REPLICAIDENTITYThisformchangestheinformationwhichiswrittentothewrite-aheadlogtoidentifyrowswhichareupd
9、atedordeleted.Thisoptionhasnoeffectexceptwhenlogicalreplicationisinuse.記錄PK列的1.DEFAULT(thedefaultfornon-systemtables)recordstheoldvaluesofthecolumnsoftheprimarykey,ifany.記錄指定索引列(索引的所有列須是notnull列,其實和PK一樣,但是某些情況下,你可以選一個比PK更小的UK)2.USINGINDEXrecordstheoldvaluesofthecolumnscovere
10、dbythenamedindex,whichmustbeunique,notpartial,notdeferrable,andincludeonlycolumnsmarkedNOTNULL.記錄完整記錄3.FULLrecordstheoldvaluesofallcolumnsintherow.啥也不記錄,這樣做是否不支持update,delete?user_catalog_table=true或者系統(tǒng)表,默認為replicaidentitynothing啥也不記錄。如果這種表發(fā)布出去了,允許insert,但是執(zhí)行delete或者update時,
11、會報錯。4.NOTHINGrecordsnoinformationabouttheoldrow(Thisisthedefaultforsystemta