Golang 如何實現自定義 CDC 工具?

CDC

變更數據捕獲(CDC)是一種跟蹤數據庫更改的技術,允許開發人員捕獲應用於行的插入、更新和刪除。它是數據集成和實時處理任務的重要組成部分。在本文中,我們將討論如何在 Golang 中爲 PostgreSQL、Oracle、MySQL、MongoDB 和 SQL Server 等多個數據庫開發自定義 CDC 工具。

通常在 CDC 領域或者說大數據領域都是 java 的生態比較繁榮,比如 Flink, Spark, 最近大火的 paimon[1] 都是 java 寫的。Java 在數據生態的繁榮爲對應數據工具的開發提供了土壤。那麼我們 Gopher 如果也想開發 CDC 工具怎麼辦?今天介紹的是一些 golang 的 Lib,基於這些 lib 我們也可以實現自定義的 CDC 工具。

PostgreSQL

對於 PostgreSQL,我們可以使用 pglogrepl[2] 庫(github.com/jackc/pglogrepl)。該庫提供了 PostgreSQL 中的邏輯解碼和流複製協議的低級 API。它允許您讀取 PostgreSQL 的預寫式日誌(WAL),這些日誌是存儲所有對數據庫的更改的地方。通過讀取和解碼這些日誌,我們可以跟蹤數據庫中的更改。解碼可以在插件級別或消費者級別進行,這取決於 PostgreSQL 中使用的解碼插件。

Oracle

爲 Oracle 創建 CDC 工具要複雜一些。Oracle 有一個名爲 “LogMiner” 的內置工具,它允許您通過 SQL 接口查詢在線和歸檔的重做日誌文件。數據的主要來源將是 V$LOGMNR_CONTENTS 視圖,這是 LogMiner 在對其進行挖掘後的重做日誌數據的視圖。

我們的 CDC 工具需要定期查詢此視圖,並解析 SQL_REDO 和 SQL_UNDO 字段,以瞭解對數據庫所做的更改。這需要理解 Oracle 的 SQL 語法,並可能處理不同版本的 Oracle,因爲語法可能會發生變化。

MySQL

可以使用 go-mysql[3] 庫(github.com/go-mysql-org/go-mysql/canal)處理 MySQL。該軟件包提供了一個框架,用於將 MySQL 的 binlog 同步到其他系統。它支持將 MySQL 的 binlog 同步到用戶定義的處理程序,例如 stdout 和 Kafka 消息隊列。通過使用該庫,我們可以相對簡單地跟蹤數據庫中的更改。

MongoDB

對於 MongoDB,我們可以使用 mongo-driver/mongo[4] 包(go.mongodb.org/mongo-driver/mongo)。該軟件包爲 Go 提供了 MongoDB 驅動程序 API。MongoDB 驅動程序支持 “Change Streams”,它允許應用程序訪問實時數據更改,而無需尾隨 oplog 的複雜性和風險。應用程序可以使用更改流訂閱單個集合、數據庫或整個部署上的所有數據更改,並立即對其進行響應。

SQL Server

對於 SQL Server,我們可以利用 go-mssqldb[5] 包(github.com/denisenkom/go-mssqldb)。SQL Server 支持變更跟蹤,它跟蹤表上的 DML 更改(插入、更新、刪除)。通過查詢這些變更表,我們可以獲取有關更改的信息。請注意,這隻會告訴我們更改行的鍵,而不是數據本身。要獲取更改的數據,我們需要對實際數據表進行另一個查詢。

結論

在 Golang 中創建自定義 CDC 工具涉及理解每個數據庫用於記錄更改的基礎機制。通過利用現有軟件包的功能,我們可以構建一個強大的工具,可以跟蹤多種類型數據庫的更改。然而,要實現高效和有效的 CDC 工具,需要對每個數據庫的日誌機制有透徹的瞭解,以及對 Golang 有紮實的掌握。

參考資料

[1]

paimon: https://paimon.apache.org/

[2]

pglogrepl: github.com/jackc/pglogrepl

[3]

go-mysql: https://github.com/go-mysql-org/go-mysql

[4]

mongo-driver: go.mongodb.org/mongo-driver/mongo

[5]

go-mssqldb: github.com/denisenkom/go-mssqldb

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/ZDj-UNxLxD7O8g2dHkS18g