Postgresql

多對一複制/事務複製

  • November 4, 2019

我在不同的地理位置(本地站點)有幾個 PostgreSQL 數據庫。

  • 每個本地站點數據庫都具有相同的架構,但數據是唯一的。例如,獲取一個包含以下列的表:Site_ID、Department_ID、Department_Name。Site_ID 對於每個站點都是唯一的。
  • 我想將本地站點數據庫中的所有數據收集到充當數據倉庫的集中式數據庫(又是 PostgreSQL)中。
  • 集中式數據庫上的相應範例表將具有與上述相同的列。所有本地站點數據都將進入此表。當然,每個站點數據都由 Site_ID 指定。

**問題:**如何使用PostgreSQL 複製方法(流/多主 UDR/BDR/等)來實現這一點。我看到這可以通過 SQLServer 使用Transactional Replication來完成。使用 PostgreSQL 實現此功能的最佳方法是什麼?

**限制:**本地站點只能進行傳出網路連接(即由於防火牆限製而無法進行入站連接)

我看到至少兩個選項:

  • 如果您不需要近乎實時的複制,但每天(或可能每小時)一次就足夠了,而且數據量很小,您可以非常簡單地創建一個腳本,在每個遠端伺服器上執行地點:

    1. 連接到本地數據庫
    2. 轉儲本地數據(pg_dump --data-only應該沒問題)
    3. 連接到遠端數據庫
    4. 從中刪除該位置的所有數據
    5. 從轉儲中推送數據。
  • 如果您需要近乎實時的複制,或者數據量很大(但相比之下變化很小),您可以查看 Slony。有一段時間沒有使用它,它不一定是它的典型使用場景,但我相信它應該可以工作,因為數據集是不同的。

Slony 使用表上的觸發器將更改儲存在日誌中,然後使用守護程序將日誌從一台伺服器傳輸到另一台伺服器,並應用更改。不過,值得檢查這是否適用於“無法從中央連接到遠端”場景。如果沒有,您將需要考慮某種形式的 VPN(無論如何您都應該這樣做)。

從 SQLServer Transactional Replication 來看,Skytools3 的 Londiste 聽起來可以很好地解決這個問題。據我了解,Skype 對 Londist 的用途之一是將數據從他們的 PL/Proxy OLTP 設置推送到他們的數據倉庫中。這是為了將數據從具有相同表結構的表的多個數據庫推送到具有相同共享表結構的中央數據庫。

有一個簡單的教程,標題為:How To Set Up “Merge” Replication of the Same Table from Multiple Partitions,您可以參考它來嘗試設置它。

以下是 PGCon 展示文稿中的更多資訊:Londiste Replication system for PostgreSQL

引用自:https://dba.stackexchange.com/questions/126469