Postgresql

將 PostgreSQL 數據複製到 Citus/Greenplum?

  • January 13, 2022

我需要在數據倉庫中集成來自 3 個不同 PostgreSQL 數據庫(OLTP 應用程序後端)的數據。對於數據倉庫本身,我考慮使用 Citus 或 Greenplum。要求來自應用程序的數據必須盡可能接近實時地與數據倉庫同步(超過 3-5 分鐘的延遲是不可接受的,實時複製是最好的)。在這方面,我有以下問題:

  1. Postgres 邏輯複製可以與 Citus 一起使用嗎?Citus 是 Postgres 的擴展,你能把 Citus 集群當成一個普通的 Postgres 數據庫嗎?如果是,那麼邏輯複製理論上應該可以工作,但是它如何處理分佈式表呢?
  2. Greenplum 是 Postgres 的一個分支,那麼 Postgres 邏輯複製是否可以使用它呢?我還讀到 Greenplum 沒有針對 OLTP 工作負載進行優化,這是否意味著當我嘗試將 OLTP 數據攝取到其中時它會中斷?
  3. 如果邏輯複製不適用於 Citus/Greenplum,那麼如何從 Postgres 流式傳輸數據?我是否需要將邏輯級 WAL 流式傳輸到 Kafka,然後編寫自定義邏輯以將其轉換為目標數據庫上的 SQL 語句?有什麼工具嗎?

額外的問題:是否有人同時使用 Citus 和 Greenplum,尤其是它們的 SQL 限制?我知道 Citus 不完全支持相關子查詢和遞歸 CTE,Greenplum 是否有類似的限制?

對於這些問題,我將不勝感激,我嘗試使用Google搜尋,但關於該主題的資訊很少或沒有,請您至少提供一些指導嗎?

經過一番研究,我設法想出了一個答案。感謝@a_horse_with_no_name 為我指明了正確的方向。

可以使用 Kafka Connect 實現不同數據源之間的實時同步。

Kafka Connect 允許通過 Source 連接器將數據從各種系統發送到 Kafka 集群,並使用 Sink 連接器從 Kafka 讀取數據。用於從系統獲取數據到 Kafka 或將數據從 Kafka 傳輸到系統的所有特定於平台的程式碼都由特定連接器的維護者抽像出來。

連接器維護者通常會尊重接收器和源之間的某種“契約”,即他們會事先就規範化的消息格式達成一致,這允許使用不同的源和接收器(例如,您可以擁有 PostgreSQL 源和 Elasticsearch 和 Neo4J 接收器同時,儘管它們具有完全不同的範式)。

對於將 Postgres 與 Citus/Greenplum 同步的情況,應該可以通過 Debezium PostgreSQL Source Connector 和 JDBC Sink 連接器進行(Citus 和 Greenplum 都支持 JDBC)。

經過研究,我發現最新的 Greenplum 數據庫版本 6.19 使用 Postgres 版本 9.4 送出。只有在 Postgres 9.5+ 版本中,才能使用 ON CONFLICT 使用帶有 JDBC 接收器連接器的 upsert 模式。因此,只有 JDBC 連接器的“insert.mode”屬性中的插入和更新模式是可能的。

@Denis Arharov 您能否提供一些有關如何設置 JDBC 接收器連接器的詳細資訊?特別是,我對帶有接收器連接器的 Greenplum upserts 感興趣

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