pglogical 擴充套件使用釋出/訂閱模組為 PostgreSQL 提供邏輯流複製。它基於作為 BDR 專案的一部分開發的技術。
我們使用以下術語來描述節點之間的資料流,有意重複使用早期的 Slony 技術:
- 節點 - PostgreSQL 資料庫例項
- 提供者和訂閱者 - 節點承擔的角色
- 複製集——表的集合
pglogical 是利用最新核心功能的新技術,因此我們有以下版本限制:
- 提供者和訂閱者節點必須執行 PostgreSQL 9.4+
- 複製源過濾和衝突檢測需要 PostgreSQL 9.5+
- 此外,訂閱者可以是 Postgres-XL 9.5+
支援的用例包括:
- 主要版本之間的升級(考慮到上述限制)
- 完整資料庫複製
- 使用複製集選擇性地複製表集
- 在釋出者或訂閱者端選擇性複製錶行(row_filter)
- 釋出者端表列的選擇性複製
- 從多個上游伺服器收集/合併資料
架構細節:
- pglogical 在每個資料庫級別上工作,而不是像物理流複製那樣在整個伺服器級別工作
- 一個提供程式可以為多個訂閱程式提供服務,而不會產生額外的磁碟寫入開銷
- 一個訂閱者可以合併來自多個來源的更改,並使用自動和可配置的衝突解決方案檢測更改之間的衝突(多主所需的一些但不是所有方面)。
- 級聯複製以變更集轉發的形式實現。
1.要求
要使用 pglogical,提供商和訂閱者必須執行 PostgreSQL 9.4 或更新版本。
提供商和訂閱者都必須安裝此
pglogical
擴充套件程式。您必須 CREATE EXTENSION pglogical在兩者上都安裝 。提供方和訂閱方的表必須具有相同的名稱並採用相同的架構。未來的修訂版本可能會新增對映功能。
提供者和訂閱者上的表必須具有相同的列,並且每列的資料型別相同。 訂閱者上的
CHECK
約束、 NOT NULL
限制等必須與提供者上的相同或更弱(更寬鬆)。2. 使用方法
本節介紹 pglogical 複製擴充套件的基本用法。
2.1 快速設定
首先,必須正確配置 PostgreSQL 伺服器以支援邏輯解碼:
wal_level = 'logical' max_worker_processes = 10 # one per database needed on provider node # one per node needed on subscriber node max_replication_slots = 10 # one per node needed on provider node max_wal_senders = 10 # one per node needed on provider node shared_preload_libraries = 'pglogical'
如果您使用的是 PostgreSQL 9.5+(這在 9.4 上不起作用)並且想要透過最後/第一個更新獲勝來處理衝突解決(請參閱 下面的衝突),您可以將這個附加選項新增到 postgresql.conf:
track_commit_timestamp = on # needed for last/first update wins conflict resolution # property available in PostgreSQL 9.5+
pg_hba.conf
必須允許來自本地主機的複製連線。接下來
pglogical
必須在所有節點上安裝擴充套件:CREATE EXTENSION pglogical;
如果使用 PostgreSQL 9.4,則 pglogical_origin
還必須在該節點上安裝擴充套件:
CREATE EXTENSION pglogical_origin;
現在建立提供者節點:
SELECT pglogical.create_node( node_name := 'provider1', dsn := 'host=providerhost port=5432 dbname=db' );
將公共架構中的所有表新增到預設複製集。
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
您還可以選擇建立額外的複製集並向其中新增表(請參閱下面的“複製集”)。
通常,最好在訂閱之前建立複製集,以便在單個初始事務中初始複製設定期間同步所有表。但是,大型資料庫的使用者可能希望逐步建立它們,以便更好地控制。