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