使用這個開源工具輕松同步數(shù)據(jù)庫

變更數(shù)據(jù)捕獲Change Data Capture(CDC)使用服務(wù)端代理來記錄、添加、更新和刪除對數(shù)據(jù)表的各種操作。它以一種易用的關(guān)系型格式提供了數(shù)據(jù)變化的細節(jié)信息。它可以捕獲將更改應(yīng)用于目標環(huán)境中的已修改行所需的列信息和元數(shù)據(jù)。這些信息保存在一個與被跟蹤的源表的列結(jié)構(gòu)相對應(yīng)的變化表內(nèi)。
捕獲變更的數(shù)據(jù)可不是一件容易的事。不過,有一個開源項目 —— ??Apache SeaTunnel??,它是一個數(shù)據(jù)整合平臺,它提供的 CDC 功能的設(shè)計理念和功能集使這些捕獲成為可能,其功能包括上文提到的,超越了現(xiàn)有產(chǎn)品的解決方案。
使用場景
CDC 的經(jīng)典應(yīng)用是異質(zhì)數(shù)據(jù)庫之間的數(shù)據(jù)同步或備份。你可以在 ??MySQL??、PostgreSQL、MariaDB 和類似的數(shù)據(jù)庫間進行數(shù)據(jù)同步。另外一個例子,你也可以將數(shù)據(jù)同步到應(yīng)該全文搜索引擎。借助 CDC,你可以基于 CDC 捕獲的數(shù)據(jù)創(chuàng)建備份。
如果設(shè)計得當(dāng),數(shù)據(jù)分析系統(tǒng)通過訂閱目標數(shù)據(jù)表的變化情況獲取需要處理的數(shù)據(jù),而不需要將分析過程嵌入已有系統(tǒng)。
在微服務(wù)間共享數(shù)據(jù)狀態(tài)
微服務(wù)現(xiàn)在很流行,但是在微服務(wù)間共享信息往往是一件復(fù)雜的事。CDC 是一個可能的解決方案。微服務(wù)可以使用 CDC 來獲取其他微服務(wù)的數(shù)據(jù)庫變化,獲取數(shù)據(jù)狀態(tài)更新,以及執(zhí)行相應(yīng)邏輯。
更新緩存
命令查詢責(zé)任隔離Command Query Responsibility Segregation(??CQRS??)的概念是將命令活動與查詢活動分開。這兩者有本質(zhì)上的不同:
- 命令向數(shù)據(jù)源寫入數(shù)據(jù)。
- 查詢從數(shù)據(jù)源讀取數(shù)據(jù)。
問題是,讀事件發(fā)生的時間與寫事件發(fā)生的時間有關(guān),以及這些事件的發(fā)生是由誰來承擔(dān)責(zé)任的?
更新緩存可能很困難。你可以使用 CDC 從數(shù)據(jù)庫獲取數(shù)據(jù)更新事件,讓它控制緩存的更新或失效。
CQRS 設(shè)計通常使用兩種不同的存儲實例來支持業(yè)務(wù)查詢和變更操作。為了保證數(shù)據(jù)的一致性,我們可以使用分布式事務(wù)來保證強大的數(shù)據(jù)一致性,代價是可用性、性能和擴展性。你也可以使用 CDC 來確保最終的數(shù)據(jù)一致性,它的性能和伸縮性較好,但其代價是數(shù)據(jù)延遲,目前業(yè)界可以保持在毫秒范圍內(nèi)。
例如,你可以使用 CDC 把 MySQL 中的數(shù)據(jù)同步到你的全文搜索引擎(比如ElasticSearch)。在這種架構(gòu)中,ElasticSearch 搜索了所有的查詢,但是當(dāng)你需要修改數(shù)據(jù)時,你不能直接操作 ElasticSearch 的,你需要修改上游的 MySQL 數(shù)據(jù),因而生成了一個更新事件。當(dāng) ElasticSearch 監(jiān)視數(shù)據(jù)庫時,這個事件就被系統(tǒng)獲取了,并在 ElasticSearch 中提示更新。
在一些 CQRS 系統(tǒng)中,也可以用類似的方法更新查詢視圖。
痛點
CDC 不是一個新概念,很多現(xiàn)有的項目已經(jīng)實現(xiàn)了它。但是對很多用戶來說,已有解決方案存在一些不足。
單數(shù)據(jù)表配置
當(dāng)你使用一些 CDC 軟件時,你必須分別配置每個表。例如,為了同步十張表,你需要寫十條 源 SQL 和 匯聚Sink
有時候,對于一張表來說可以手寫,但只對數(shù)據(jù)量小的情況適用。當(dāng)數(shù)據(jù)量大時,會發(fā)生類型映射或參數(shù)配置的錯誤,進而導(dǎo)致較高的操作和維護成本。
SeaTunnel 是一個易用的數(shù)據(jù)集成平臺,有望解決這個問題。
不支持模式演化
一些 CDC 解決方案支持 DDL 事件傳遞,但不支持傳遞到 匯聚節(jié)點Sink,以便它能進行同步變更。由于無法根據(jù) DDL 事件改變轉(zhuǎn)換的類型信息,所以即使一個能獲取事件的 CDC 也不一定可以將它發(fā)送至引擎(所以匯聚節(jié)點不能遵循 DDL 事件來進行變更)。
太多的鏈接
在一些 CDC 平臺上,當(dāng)有多個表時,如果一張表被同步了,就必須使用一個鏈接來代表一張表。當(dāng)存在多個表時,也需要很多鏈接。這就給源 JDBC 數(shù)據(jù)庫帶來了壓力,同時導(dǎo)致binlog 過多,還會導(dǎo)致重復(fù)的日志解析。
SeaTunnel CDC 架構(gòu)的目標
Apache SeaTunnel 是一個開源、高效、分布式、大規(guī)模的數(shù)據(jù)集成框架。為了解決現(xiàn)有數(shù)據(jù)集成工具解決不了的問題,開發(fā)者社區(qū)“重新造輪子”,開發(fā)了一種具有獨特功能的 CDC 平臺。它的架構(gòu)設(shè)計吸收了現(xiàn)有工具的優(yōu)點,消除了相應(yīng)的缺點。
Apache Seatunnel 支持:
- 以無鎖并行的方式快照歷史數(shù)據(jù)。
- 日志心跳檢測和動態(tài)添加數(shù)據(jù)表。
- 讀取子數(shù)據(jù)庫、子表和多結(jié)構(gòu)表。
- 模式演進。
- 所有基礎(chǔ)的 CDC 功能。
它降低了用戶的操作和維護成本,并且支持動態(tài)添加數(shù)據(jù)表。
例如,當(dāng)你要同步整個數(shù)據(jù)庫,并在稍后需要添加一個新表,你不必手動維護、改變配置或重啟當(dāng)前作業(yè)。
另外,Apache SeaTunnel 也支持并行讀取子數(shù)據(jù)庫、子表和多結(jié)構(gòu)表。還支持模式演進、DDL 轉(zhuǎn)換,以及在引擎內(nèi)改變支持的模式,這些可以變?yōu)?nbsp;轉(zhuǎn)換器Transform和 匯聚節(jié)點Sink。
SeaTunnel CDC 現(xiàn)狀
如今,CDC 擁有支持增量和快照階段的基本能力。它也支持 MySQL 實時和離線使用。MySQL 實時測試已完成,即將進行離線測試。因為它涉及對轉(zhuǎn)換器和匯聚節(jié)點的更改,目前還不支持模式。不支持動態(tài)發(fā)現(xiàn)新增表,已預(yù)留了一些支持多結(jié)構(gòu)表的接口。
項目展望
作為 Apache 孵化的項目,Apache SeaTunnel 的社區(qū)正快速發(fā)展起來。下一屆社區(qū)計劃會議的主要目標有:
1、發(fā)展并改進連接器和目錄生態(tài)
我們正努力改善連接器和目錄功能,包括:
- 支持連接更多數(shù)據(jù)庫,包括 TiDB、Doris 和 Stripe。
- 改善現(xiàn)有的連接器的易用性和性能。
- 支持 CDC 連接器用于實時、增量同步場景。
任何對連接器感興趣者都可以查看 ??Umbrella??。
2、支持更多數(shù)據(jù)集成場景(SeaTunnel 引擎)
現(xiàn)有的引擎仍然存在一些解決不了的痛點,例如對整個數(shù)據(jù)庫的同步,表結(jié)構(gòu)變化的同步以及任務(wù)失敗的大粒度。
我們正努力解決這些問題,對此感興趣者可以查看 ??#2272 議題??。
3、更易使用(Web 版)
我們正努力提供 Web 界面,令操作更簡便。通過 Web 界面,我們將實現(xiàn)以 DAG/SQL 的形式查看目錄、連接器、任務(wù)和相關(guān)信息。我們也會給予用戶訪問調(diào)度平臺的權(quán)限,以便更方便地進行任務(wù)管理。
欲了解更多關(guān)于 Web 版的信息,請訪問 ??Web 平臺子項目??。
總結(jié)
數(shù)據(jù)庫活動通常必須被仔細跟蹤,才能對數(shù)據(jù)的更新、刪除或添加操作進行管理。CDC 提供了這種功能。Apache SeaTunnel 是一個開源解決方案,能滿足這些需求,它將持續(xù)迭代更新,從而提供更多功能。該項目和社區(qū)也很活躍,歡迎你的加入。
(題圖:MJ:database connections illustration in high resolution, very detailed, 8k)

























