做者:瀚高PG實驗室 (Highgo PG Lab)- 禹曉sql
本文屬於詳談pg邏輯複製系列文章的第一部分,做者計劃分紅3個部分分別介紹邏輯複製的原理、搭建及維護,感興趣的朋友能夠持續關注,所涉及的原理介紹及操做記錄基於的pg版本爲pg12.4。數據庫
咱們在使用postgresql數據庫做爲生產用數據庫時,咱們常常採用流複製的形式來實現數據庫的熱備,當原主庫發生故障時,備庫能夠快速的切換爲主庫來減小業務的中止時間。流複製是數據庫物理級別的數據同步,在實際使用的場景中存在一些沒法知足的需求,好比省公司的某張業務表要聚集全部地市的業務數據,或者總部某張基礎表更新後,子公司須要實時同步這張基礎表等等,對於以上場景,物理複製時沒法知足的,此時咱們可使用邏輯複製來知足這些要求。
邏輯複製使用場景:網絡
邏輯複製是基於WAL日誌的邏輯解析,咱們能夠將WAL日誌理解爲ORACLE的redo日誌。邏輯複製的原理是發佈端的主庫將Publication中表的WAL日誌解析成必定格式併發送給備庫的Subscription,Subscription接收到解析後的WAL日誌後進行重放應用,從而實現表數據的同步。併發
能夠看到與邏輯解析相關的兩個重要部分是Publication和Subscription。ide
Publication(發佈)建立在可讀寫的業務數據庫實例上,對於已建立Publication的數據庫稱爲發佈節點。對於發佈節點的功能及限制,詳見第三部分。發佈節點負責WAL日誌的邏輯解析,這點你們要區別清楚。
Subscription(訂閱)建立在邏輯複製備庫上,對於已建立Subscription的數據庫成爲訂閱節點,建立訂閱時,默認狀況下會在發佈節點建立用於傳輸解析後的WAL日誌的邏輯複製槽,訂閱節點經過邏輯複製槽獲取發佈節點發送的WAL數據變化,所以當由於網絡緣由致使邏輯複製中斷時,發佈節點會一直保存訂閱節點未應用的WAL日誌,業務較爲繁忙的狀況下容易形成發佈節點磁盤爆滿,此問題你們必定要注意。post
一、發佈節點建立邏輯複製用戶
舉例:create user logicalrep replication login encrypted password ‘logicalrep’; 必須有流複製權限spa
二、發佈節點建立發佈
建立發佈節點語法日誌
Command: CREATE PUBLICATION Description: define a new publication Syntax: CREATE PUBLICATION name [ FOR TABLE [ ONLY ] table_name [ * ] [, ...] | FOR ALL TABLES ] [ WITH ( publication_parameter [= value] [, ... ] ) ] where option can be: PUBLISH INSERT | NOPUBLISH INSERT | PUBLISH UPDATE | NOPUBLISH UPDATE | PUBLISH DELETE | NOPUBLISH DELETE 默認發佈insert,update,delete。
舉例:create publication pub1 for table t1postgresql
修改發佈節點語法對象
Command: ALTER PUBLICATION Description: change the definition of a publication Syntax: ALTER PUBLICATION name WITH ( option [, ... ] ) where option can be: PUBLISH INSERT | NOPUBLISH INSERT | PUBLISH UPDATE | NOPUBLISH UPDATE | PUBLISH DELETE | NOPUBLISH DELETE ALTER PUBLICATION name ADD TABLE [ ONLY ] table_name [ * ] [, ...]ALTER PUBLICATION name SET TABLE [ ONLY ] table_name [ * ] [, ...]ALTER PUBLICATION name DROP TABLE [ ONLY ] table_name [ * ] [, ...]ALTER PUBLICATION name SET ( publication_parameter [= value] [, ... ] )ALTER PUBLICATION name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }ALTER PUBLICATION name RENAME TO new_name
發佈者小結
①目前僅僅支持發佈表,不容許發佈其餘對象。
②同一張表,能夠發佈屢次。
③在同一個數據庫中,能夠建立多個publication,可是不能重名,經過系統表查看已建立的publication
④容許使用all tables發佈全部表。
⑤一個publication容許有多個訂閱者。
⑥目前publication僅支持insert, update, delete。容許發佈時,選擇發佈insert、update、delete,好比只發布insert,而不發佈update, delete。當發佈了表的update, delete時,表必須設置replica identity,即如何標示OLD TUPLE,經過pk或者uk或者full。若是設置了nothing,則執行update,delete時會報錯。
⑦create publication或者alter publication,發佈或者修改發佈內容中添加或者刪除表時,都是事務級別,不會出現複製了部分事務的狀況。⑧發佈者須要設置wal_level=logical,同時開啓足夠的worker,設置足夠大的replication slot,設置足夠多的sender。
⑨發佈者的pg_hba.conf須要設置replication條目,容許訂閱者鏈接。
⑩發佈者的數據庫中,必須有replication角色的用戶,或者超級用戶,而且訂閱者要使用它經過流複製協議鏈接到發佈者。
三、訂閱端建立訂閱表
建立表結構同發佈端表結構相同的空表 注意主鍵約束,沒有的話發佈端的update delete等操做會報錯
例:create table t1 (id int primary key,name text)
四、訂閱端建立訂閱
建立訂閱語法
Command: CREATE SUBSCRIPTION Description: define a new subscription Syntax: CREATE SUBSCRIPTION subscription_name CONNECTION 'conninfo' PUBLICATION { publication_name [, ...] } [ WITH ( subscription_parameter [= value] [, ... ] ) ]
舉例:create subscription sub1 connection ‘host=192.168.230.81 port=5866 dbname=postgres user=logicalrep password=logicalrep’ publication pub1;
修改訂閱語法
Command: ALTER SUBSCRIPTION Description: change the definition of a subscription Syntax: ALTER SUBSCRIPTION name WITH ( option [, ... ] ) ] where option can be: SLOT NAME = slot_name ALTER SUBSCRIPTION name CONNECTION 'conninfo'ALTER SUBSCRIPTION name SET PUBLICATION publication_name [, ...] [ WITH ( set_publication_option [= value] [, ... ] ) ]ALTER SUBSCRIPTION name REFRESH PUBLICATION [ WITH ( refresh_option [= value] [, ... ] ) ]ALTER SUBSCRIPTION name ENABLE ALTER SUBSCRIPTION name DISABLE ALTER SUBSCRIPTION name SET ( subscription_parameter [= value] [, ... ] )ALTER SUBSCRIPTION name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }ALTER SUBSCRIPTION name RENAME TO new_name
訂閱者小結①必須使用超級用戶建立訂閱②訂閱者須要經過流複製協議鏈接到發佈者,同時須要在發佈者建立replication slot。③同一個數據庫中,能夠建立多個subscription,這些subscription能夠連自一個或多個發佈者。④訂閱者的同一張表,不能接受來自同一個源的多個發佈。⑤每個訂閱,都須要在發佈端建立一個slot,可使用slot name = ?指定,或者默認爲subscription name。⑥在建立subscription或者alter subscription時,可使用enable來啓用該訂閱,或者使用disable暫停該訂閱。⑦若是要徹底刪除訂閱,使用drop subscription,注意,刪除訂閱後,本地的表不會被刪除,數據也不會清除,僅僅是不在接收該訂閱的上游信息。⑧建立訂閱時,不會自動建立發佈端的表,因此表須要在訂閱端先建立好。