作者:admin 日期:2023-09-06 瀏覽: 次
實(shí)時(shí)監(jiān)視同步數(shù)據(jù)庫變更,這個(gè)框架真是神器
我們數(shù)據(jù)庫中的數(shù)據(jù)一直在變化,有時(shí)候我們希望能監(jiān)聽數(shù)據(jù)庫數(shù)據(jù)的變化并根據(jù)變化做出一些反應(yīng),比如更新對(duì)應(yīng)變化數(shù)據(jù)的緩存、增量同步到其它數(shù)據(jù)源、對(duì)數(shù)據(jù)進(jìn)行檢測和審計(jì)等等。而這種技術(shù)就叫變更數(shù)據(jù)捕獲(Change Data Capture)。對(duì)于這種技術(shù)我們可能知道一個(gè)國內(nèi)比較知名的框架Canal,非常好用!但是Canal有一個(gè)局限性就是只能用于Mysql的變更數(shù)據(jù)捕獲。今天來介紹另一種更加強(qiáng)大的分布式CDC框架Debezium。
提起Debezium這個(gè)框架,相信大多數(shù)普通開發(fā)者都比較陌生,但是提及它所屬的公司大家一定不會(huì)陌生。紅帽公司
沒錯(cuò)就是開源界最成功的紅帽公司。Debezium是為捕獲數(shù)據(jù)更改的流式處理框架,開源免費(fèi)。Debezium近乎實(shí)時(shí)地監(jiān)控?cái)?shù)據(jù)庫行級(jí)別(row-level)的數(shù)據(jù)變更,并針對(duì)變更可以做出反應(yīng)。而且只有已提交的變更才是可見的,所以不用擔(dān)心事務(wù)問題或者更改被回滾的問題。Debezium為所有的數(shù)據(jù)庫更改事件提供了一個(gè)統(tǒng)一的模型,所以不用擔(dān)心每種數(shù)據(jù)庫系統(tǒng)的復(fù)雜性。Debezium提供了對(duì)MongoDB、MySQL、PostgreSQL、SQL Server、Oracle、DB2等數(shù)據(jù)庫的支持。
另外借助于Kafka Connector可以開發(fā)出一個(gè)基于事件流的變更捕獲平臺(tái),具有高容錯(cuò)率和極強(qiáng)的擴(kuò)展性。Debezium Kafka 架構(gòu)
如圖所示,部署了用于 MySQL 和 PostgresSQL 的 Debezium Kafka連接器以捕獲對(duì)這兩種類型數(shù)據(jù)庫的更改事件,然后將這些更改通過下游的Kafka Connector將記錄傳輸?shù)狡渌到y(tǒng)或者數(shù)據(jù)庫(例如 Elasticsearch、數(shù)據(jù)倉庫、分析系統(tǒng))或緩存。
另一種玩法就是將Debezium內(nèi)置到應(yīng)用程序中,來做一個(gè)類似消息總線的設(shè)施,將數(shù)據(jù)變更事件傳遞給訂閱的下游系統(tǒng)中。Debezium內(nèi)置服務(wù)器架構(gòu)
Debezium對(duì)數(shù)據(jù)的完整性和可用性也是做了不少的工作。Debezium用持久化的、有副本備份的日志來記錄數(shù)據(jù)庫數(shù)據(jù)變化的歷史,因此,你的應(yīng)用可以隨時(shí)停止再重啟,而不會(huì)錯(cuò)過它停止運(yùn)行時(shí)發(fā)生的事件,保證了所有的事件都能被正確地、完全地處理掉。?
稍后我會(huì)演示一個(gè)Spring Boot集成Debezium的數(shù)據(jù)捕獲系統(tǒng)。
理論介紹并不能讓你直觀感受到Debezium的能力,所以接下來我將使用嵌入式Debezium引擎來演示一下。流程圖
如上圖所示,當(dāng)我們變更MySQL數(shù)據(jù)庫中的某行數(shù)據(jù)時(shí),通過Debezium實(shí)時(shí)監(jiān)聽到binlog日志的變化觸發(fā)捕獲變更事件,然后獲取到變更事件模型,并做出響應(yīng)(消費(fèi))。接下來我們來搭建環(huán)境。
為了方便這里使用MySQL的Docker容器,對(duì)應(yīng)的腳本為:
上面的腳本運(yùn)行了一個(gè)用戶名為、密碼為并且將數(shù)據(jù)掛載到本地路徑的MySQL容器,同時(shí)開啟了binlog日志,并設(shè)置為,這些信息后面配置會(huì)用。?
請(qǐng)注意如果不使用用戶的話,需要保證用戶具有, , , , 五種權(quán)限。
Spring Boot的應(yīng)用中加入下列依賴:
?

目前最新的版本號(hào)為1.5.2.Final。
然后聲明需要的配置:
配置分為兩部分:一部分是Debezium Engine的配置屬性,參見Debezium Engine配置[1]。一部分是Mysql Connector的配置屬性,參見Mysql Connector配置[2]。
應(yīng)用程序需要為運(yùn)行的Mysql Connector啟動(dòng)一個(gè)Debezium引擎,這個(gè)引擎會(huì)以異步線程的形式運(yùn)行,它包裝了整個(gè)Mysql Connector連接器的生命周期。聲明一個(gè)引擎需要以下幾步:聲明收到數(shù)據(jù)變更捕獲信息的格式,提供了、、、、等格式。加載上面定義的配置。聲明消費(fèi)數(shù)據(jù)更改事件的函數(shù)方法。
聲明的偽代碼:
方法為:
引擎的啟動(dòng)和關(guān)閉正好契合Spring Bean的生命周期:
啟動(dòng)該Spring Boot項(xiàng)目,你可以采用各種手段往數(shù)據(jù)庫增刪改數(shù)據(jù),觀察會(huì)有類似下面的打印:
說明Debezium監(jiān)聽到了數(shù)據(jù)庫的變更。你可以想想這種技術(shù)在哪些場景有用武之地。好了今天的分享就到這里,感謝大家的支持,我是:碼農(nóng)小胖哥。原創(chuàng)不易,請(qǐng)多多關(guān)注、點(diǎn)贊、轉(zhuǎn)發(fā)、再看。?
文中的源代碼可通過關(guān)注:碼農(nóng)小胖哥 回復(fù)獲取。[1]
Debezium Engine配置: https://debezium.io/documentation/reference/1.5/development/engine.html#engine-properties[2]
Mysql Connector配置: https://debezium.io/documentation/reference/1.5/connectors/mysql.html#mysql-connector-properties
初創(chuàng)公司真的適合用微服務(wù)嗎?
2021-06-02
Spring Security 實(shí)戰(zhàn)干貨:如何獲取當(dāng)前用戶信息
2021-05-31