使用 Postgres、Debezium 和 Kafka 流式傳輸資料

banq發表於2022-06-23

透過流處理,我們可以在資料可用時持續處理資料
我們以事件流的形式從事件源(例如資料庫)實時捕獲資料,並將資料移動到目標系統(例如資料倉儲和資料庫)。

什麼是事件?
事件就是你將資料概念化的時候。
我這麼說是什麼意思?考慮一下下面的語句
"我買了咖啡"
"我在週一下午2點從Starbites買了咖啡"
第一個語句只是資料,但第二個語句是一個事件。


變更資料採集(CDC)和Debezium
這個想法很簡單。它是關於從資料庫中獲取變化。CDC將使我們能夠捕獲已經在資料庫中的一切,以及第一次捕獲後的任何變化。

比方說,你有一個Postgres資料庫。現在,當我們在資料庫中插入任何新的記錄,更新資料庫中現有的記錄或從資料庫中刪除記錄時,Debezium透過挖掘資料庫的交易日誌來獲得有關變化的通知。Debezium捕捉到這些變化,並將它們流向Kafka主題。Kafka Connect是Apache Kafka框架的一部分,負責將這些變化傳送到Kafka。它充當了流式資料進出Kafka的橋樑。你可以用它來連線你的Kafka資料庫和資料來源。

現在,當資料在Kafka中時,我們的目標系統可以訂閱Kafka主題,這樣就可以把變化流傳給他們。

有人會問,"為什麼你要做這個基於日誌的CDC?為什麼不是基於查詢的CDC?


有2種型別的CDC:基於查詢的CDC和基於日誌的CDC

使用基於查詢的CDC:
你只是寫一個SQL來獲得你需要的資料。該查詢將包括一個謂詞,以確定什麼已經改變。這可能是基於一個時間戳欄位。

讓我們假設我們在資料庫中有4條記錄。當我們執行查詢時,我們得到了所有的記錄(因為之前的時間戳是從0開始的,所有的ts_cols都大於0)。現在,如果一條新的記錄被插入資料庫,當我們再次執行我們的查詢時會發生什麼。現在時間戳被設定為我們最後一次執行查詢的時間,我們可以提取被插入的新記錄。

這就是基於查詢的CDC的工作方式。

請注意這個方法,因為我們必須儘可能頻繁地執行查詢以獲得新的記錄。

JDBC聯結器是一個例子,你將會使用它來進行基於查詢的CDC

基於日誌的CDC
然而,對於基於日誌的CDC來說,情況就不一樣了。對於基於日誌的 CDC,我們不是在寫任何時間戳大於的查詢來提取新記錄。相反,我們要看的是資料庫的交易日誌,而聯結器必須以某種方式獲得對這些資料的訪問。任何時候,只要有插入,它就會被寫入事務長,由於我們也在事務日誌上保持一個標籤,我們可以看到它們,然後從它們的內部格式中解碼,並將它們寫成Avro/JSON的格式化資訊。

有了基於日誌的CDC,我們不僅可以看到新的記錄,我們還可以看到它是如何到達那裡的,所以有某種歷史。另外,當我們進行刪除時,它會被追加到日誌中,所以我們可以看到它們。這些是你在使用基於查詢的CDC時不會看到的一些東西。你只看到更新

Debezium專案的所有聯結器都是基於日誌的CDC聯結器的例子。

使用Debezium從Postgres中串流資料,開啟了我們可以利用的一系列可能性。
我希望這篇文章能達到它的目的,作為對用Debezium和Kafka建立一個事件驅動系統的一個可理解的介紹。
 

相關文章