Greenplum,PostgreSQL資料實時訂閱的幾種方式

德哥發表於2017-10-28

標籤

PostgreSQL , Greenplum , 非同步訊息佇列 , skytools , PGQ , 資料訂閱 , 觸發器 , 時間戳 , BINLOG , 邏輯複製 , 邏輯複製slot , 邏輯decode


背景

通常在一個企業中,對一份資料可能更有多個業務系統需要對其進行處理。

《從人類河流文明 洞察 資料流動的重要性》

因此資料是流動的,通常會通過訊息佇列來完成這樣的工作。不過呢,這樣要求訊息佇列是最上游。

當無法將訊息佇列放到最上游時,例如資料先到了資料庫,再訂閱給其他業務線,怎麼辦呢?

就比如這裡的RDS PG的部分。

pic

下面來探討一下有多少種方法來實現這個需求:將資料庫的變更實時訂閱到其他業務線(例如Kafka)。

PostgreSQL , 阿里雲RDS for PostgreSQL

PostgreSQL,在阿里雲對應RDS for PostgreSQL這個產品。

PostgreSQL的資料變更,如何訂閱給下游?下面是可選的方法:

1、觸發器,將表的變更記錄到一個流水錶,然後業務通過讀取流水錶進行訂閱。

《USE hstore store table`s trace record》

2、規則,在需要訂閱的表上,建立RULE,將表的變更記錄到一個流水錶,然後業務通過讀取流水錶進行訂閱。

https://www.postgresql.org/docs/10/static/sql-createrule.html

3、非同步訊息,使用觸發器或RULE,將表的變更寫入CHANNEL。(資料庫的非同步訊息通道功能)。

訂閱端通過監聽CHANNEL,實現對資料的訂閱。

https://www.postgresql.org/docs/10/static/sql-notify.html

https://www.postgresql.org/docs/10/static/sql-listen.html

4、WAL 邏輯 decode。

從9.4的版本開始,PostgreSQL支援邏輯複製,將資料變更寫入WAL,(類似MySQL的binlog複製)。客戶端通過從WAL翻譯REDO來實現訂閱。

alidecode 是一個翻譯wal的外掛,使用者也可以自己寫翻譯WAL的外掛。

《PostgreSQL 最佳實踐 – 邏輯增量複製(MySQL <-> PgSQL <-> PgSQL)》

5、PGQ ,是SKYTOOLS的一個基礎功能,在PostgreSQL內部實現了一個非同步的佇列。使用者可以對需要複製的表,建立PGQ,然後寫PGQ的消費者來實現訂閱。

https://wiki.postgresql.org/wiki/SkyTools

londiste3 就是一個用於複製的PGQ消費者代表程式。

6、confluentinc bottledwater-pg , 基於PG的WAL以及邏輯複製功能,實現的一個主動消費者,將資料自動從WAL翻譯,並寫入KAFKA佇列,實現訊息訂閱。

pic

https://github.com/confluentinc/bottledwater-pg

《實時資料交換平臺 – BottledWater-pg with confluent》

7、時間戳,最傳統的方法,使用者在寫入、刪除、更新時,記錄資料的寫入時間、修改時間。

刪除時,邏輯刪除(標記欄位),並記錄刪除時間。

通過這個時間戳的推移來訂閱資料。

方法優先順序

優先使用邏輯DECODE的方法(6、4)。

其次是時間戳(7)。

然後可以考慮PGQ。

然後再考慮非同步訊息的方法。

最後考慮觸發器和規則。

Greenplum , 阿里雲HybridDB for PostgreSQL

Greenplum,在阿里雲對應HybridDB for PostgreSQL這個產品。

也有若干種訂閱方法:

推薦方法:

使用appendonly表,以及時間戳的方法。

阿里雲推出了metascan技術,可以在不建索引的情況下,極度高效的實現時間戳的推移訂閱。

阿里雲訂閱套件

1、datax,配置推移欄位,推移訂閱。

2、cdp

3、d2

4、dts,通過類似binlog的解析來訂閱。


相關文章