Greenplum, PostgreSQL 數據實時訂閱的幾種方式
標簽
PostgreSQL , Greenplum , 異步消息隊列 , skytools , PGQ , 數據訂閱 , 觸發器 , 時間戳 , BINLOG , 邏輯複製 , 邏輯複製slot , 邏輯decode
背景
通常在一個企業中,對一份數據可能更有多個業務係統需要對其進行處理。
因此數據是流動的,通常會通過消息隊列來完成這樣的工作。不過呢,這樣要求消息隊列是最上遊。
當無法將消息隊列放到最上遊時,例如數據先到了數據庫,再訂閱給其他業務線,怎麼辦呢?
就比如這裏的RDS PG的部分。
下麵來探討一下有多少種方法來實現這個需求:將數據庫的變更實時訂閱到其他業務線(例如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隊列,實現消息訂閱。
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的解析來訂閱。
最後更新:2017-10-29 00:03:50