Debezium 作者版權所有。根據 Apache 授權 2.0 版授權。
Debezium 是一個開源項目,為變更資料擷取 (CDC) 提供低延遲資料流平台。此連接器提供了一個接收器實現,用於將 Debezium 發出的變更串流傳輸到關聯式資料庫中。
此連接器實作是 Debezium 源感知的。這表示連接器可以使用本機 Debezium 來變更事件,而無需使用ExtractNewRecordState
來展平事件結構。這減少了使用 JDBC 接收器連接器所需的配置。此外,這也意味著管道的接收器端可以利用 Debezium 元資料(例如列類型傳播)來無縫支援管道的接收器連接器端的正確列類型解析。
JDBC 接收器連接器是傳統的 Kafka Connect 接收器連接器(也稱為消費者)。它的工作是從一個或多個 Kafka 主題讀取記錄,並產生在配置的目標資料庫上執行的 SQL 語句。
SinkRecordDescriptor
是從每個SinkRecord
的物件。大多數採用SinkRecord
的方法都採用此描述符物件。該描述符實際上是SinkRecord
的預處理版本,它允許我們執行一次預處理,然後在連接器中使用此資訊。新增方法時,您通常需要使用SinkRecordDescriptor
。
每個接收器資料庫通常都有自己的DatabaseDialect
實現,該實作應該擴展GeneralDatabaseDialect
。方言是 JDBC 接收器連接器使用的核心機制之一,用於解析連接器將向其中寫入消費事件的資料庫的 SQL 語句和其他資料庫特徵。 JDBC 接收器連接器依賴 Hibernate 的方言解析來驅動連接器使用的方言包裝器。
如果未偵測到正在使用的接收器資料庫的方言映射,則 JDBC 接收器連接器將預設使用GeneralDatabaseDialect
實作。這種通用實作並不支援連接器的每個方面,例如,選擇此方言時不支援 UPSERT 插入模式,因為 UPSERT 語句通常對於所使用的資料庫是唯一的。如果新的接收器資料庫要與 JDBC 接收器連接器的大量行為完全相容,那麼添加新的方言實作通常是個好主意。
Kafka 訊息中的每個欄位都與一個模式類型相關聯,但此類型資訊還可以攜帶其他元數據,例如來源連接器提供的名稱甚至參數。 JDBC 接收器連接器使用基於io.debezium.connector.jdbc.type.Type
協定的類型系統,以便處理值綁定、預設值解析和其他可能特定於類型的特徵。
實際上有三種不同類型的Type
實作:
io.debezium.connector.jdbc.type.connect
中找到。io.debezium.connector.jdbc.type.debezium
中找到。io.debezium.connector.jdbc.dialect
層次結構中找到。類型以分層模式註冊,從 Kafka Connect 類型開始,然後是 Debezium 類型,最後是特定於方言的類型。這使得 Debezium 類型能夠在需要時覆蓋 Kafka Connect 類型,並最終使方言覆蓋任何其他貢獻的類型。
透過先查看 Kafka 模式名稱並將其對應到類型註冊來解析類型。如果模式沒有名稱,則使用模式的類型解析為類型。如果沒有偵測到該欄位的其他類型實現,這允許基本 Kafka Connect 類型對如何解釋資料擁有最終決定權。
JDBC 接收器連接器使用兩種命名策略:
TableNamingStrategy
ColumnNamingStrategy
JDBC 接收器連接器附帶了兩者的預設實現,可在io.debezium.connector.jdbc.naming
套件中找到。這兩種策略的預設行為如下:
.
與_
並使用配置的table.name.format
值來解析表的最終名稱。因此,假設事件的主題名稱為server.schema.table
且預設為table.name.format=dbo.${topic}
,則目標表將建立為dbo.server_schema_table
。可以透過在連接器配置中指定完全限定的類別名稱參考來覆寫這兩種策略。範例配置:
table.naming.strategy=io.debezium.connector.jdbc.naming.DefaultTableNamingStrategy
column.naming.strategy=io.debezium.connector.jdbc.naming.DefaultColumnNamingStrategy
JDBC 接收器連接器維護記憶體中關係模型,類似於 Debezium 來源連接器。這些關係模型類別可以在io.debezium.connector.jdbc.relational
套件中找到。
為了使用 Debezium JDBC 接收器連接器程式碼庫並在本地建置它,需要以下內容:
.mvnw
呼叫 Maven 指令的包裝器)此測試套件很大程度上是基於 TestContainer 的使用,並自動啟動各種來源資料庫和接收器資料庫。如果沒有 Docker 相容的環境,整合測試將無法運作。如果您沒有 Docker 環境,可以使用-DskipITs
命令列參數跳過整合測試,如下所示:
$ ./mvnw clean verify -DskipITs
測試套件共有三種:
預設情況下,所有單元測試都作為建置的一部分執行。預設情況下,僅針對 MySQL、PostgreSQL 和 SQL Server 執行基於接收器的整合測試,而不會執行任何基於端對端矩陣的測試。
為了對 Oracle 和 DB2 執行基於接收器的整合測試,必須提供-Dtest.tags
參數以將這些測試包含在建置中。為此,請新增所有要執行的整合測試,如下所示,針對所有資料庫:
$ ./mvnw clean install -Dtest.tags=it-mysql,it-postgresql,it-sqlserver,it-oracle,it-db2
為了對所有資料庫運行所有基於接收器的整合測試,提供了一個快捷標籤:
$ ./mvnw clean install -Dtest.tags=it
同樣,為了啟用特定的端對端測試,也可以為-Dtest.tags
參數提供每個接收器資料庫類型所需的標籤:
$ ./mvnw clean install -Dtest.tags=e2e-mysql,e2e-postgresql,e2e-sqlserver,e2e-oracle,e2e-db2
為了運行所有端到端整合測試,還提供了一個快捷標籤:
$ ./mvnw clean install -Dtest.tags=e2e
為了對所有來源/接收器組合執行所有測試:
$ ./mvnw clean install -Dtest.tags=all
Debezium 社群歡迎任何想要以任何方式提供幫助的人,無論是報告問題、幫助編寫文檔,還是貢獻程式碼變更以修復錯誤、新增測試或實作新功能。有關詳細信息,請參閱此文件。
非常感謝所有 Debezium JDBC 接收器貢獻者!
此專案根據 Apache 許可證版本 2 獲得許可。