@TOC
[Mysql數(shù)據(jù)實(shí)時(shí)增量同步之CDC工具—Canal、mysql_stream、go-mysql-transfer、Maxwell:https://blog.csdn.net/weixin_42526326/article/details/121148721
什么是CDC?
CDC(Change Data Capture)是變更數(shù)據(jù)獲取的簡(jiǎn)稱(chēng)。可以基于增量日志,以極低的侵入性來(lái)完成增量數(shù)據(jù)捕獲的工作。核心思想是,監(jiān)測(cè)并捕獲數(shù)據(jù)庫(kù)的變動(dòng)(包括數(shù)據(jù)或數(shù)據(jù)表的插入、更新以及刪除等),將這些變更按發(fā)生的順序完整記錄下來(lái),寫(xiě)入到消息中間件中以供其他服務(wù)進(jìn)行訂閱及消費(fèi)。
簡(jiǎn)單來(lái)講:CDC是指從源數(shù)據(jù)庫(kù)捕獲到數(shù)據(jù)和數(shù)據(jù)結(jié)構(gòu)(也稱(chēng)為模式)的增量變更,近乎實(shí)時(shí)地將這些變更,傳播到其他數(shù)據(jù)庫(kù)或應(yīng)用程序之處。
通過(guò)這種方式,CDC能夠向數(shù)據(jù)倉(cāng)庫(kù)提供高效、低延遲的數(shù)據(jù)傳輸,以便信息被及時(shí)轉(zhuǎn)換并交付給專(zhuān)供分析的應(yīng)用程序。
與批量復(fù)制相比,變更數(shù)據(jù)的捕獲通常具有如下三項(xiàng)基本優(yōu)勢(shì):
- CDC通過(guò)僅發(fā)送增量的變更,來(lái)降低通過(guò)網(wǎng)絡(luò)傳輸數(shù)據(jù)的成本。
- CDC可以幫助用戶(hù)根據(jù)最新的數(shù)據(jù)做出更快、更準(zhǔn)確的決策。例如,CDC會(huì)將事務(wù)直接傳輸?shù)綄?zhuān)供分析的應(yīng)用上。
- CDC最大限度地減少了對(duì)于生產(chǎn)環(huán)境網(wǎng)絡(luò)流量的干擾。
CDC工具對(duì)比
特色 | Canal | mysql_stream | go-mysql-transfer | Maxwell |
---|---|---|---|---|
開(kāi)發(fā)語(yǔ)言 | Java | Python | Golang | Java |
高可用 | 支持 | 支持 | 支持 | 支持 |
接收端 | 編碼定制 | Kafka等(MQ) | Redis、MongoDB、Elasticsearch、RabbitMQ、Kafka、RocketMQ、HTTP API 等 | Kafka,Kinesis、RabbitMQ、Redis、Google Cloud Pub/Sub、文件等 |
全量數(shù)據(jù)初始化 | 不支持 | 支持 | 支持 | 支持 |
數(shù)據(jù)格式 | 編碼定制 | Json(固定格式) | Json(規(guī)則配置) 模板語(yǔ)法 Lua腳本 | JSON |
性能(4-8TPS) |
實(shí)現(xiàn)原理:
1、go-mysql-transfer將自己偽裝成MySQL的Slave,
2、向Master發(fā)送dump協(xié)議獲取binlog,解析binlog并生成消息
3、將生成的消息實(shí)時(shí)、批量發(fā)送給接收端
Mysql binlog 講解:
MySQL的二進(jìn)制日志可以說(shuō)MySQL最重要的日志了,它記錄了所有的DDL和DML(除了數(shù)據(jù)查詢(xún)語(yǔ)句)語(yǔ)句,
以事件形式記錄,還包含語(yǔ)句所執(zhí)行的消耗的時(shí)間,MySQL的二進(jìn)制日志是事務(wù)安全型的。
一般來(lái)說(shuō)開(kāi)啟二進(jìn)制日志大概會(huì)有1%的性能損耗。
二進(jìn)制日志兩個(gè)最重要的使用場(chǎng)景:
- MySQL Replication在Master端開(kāi)啟binlog,Master把它的二進(jìn)制日志傳遞給slaves來(lái)達(dá)到master-slave數(shù)據(jù)一致的目的。
- 數(shù)據(jù)恢復(fù),通過(guò)使用mysqlbinlog工具來(lái)使恢復(fù)數(shù)據(jù)。
二進(jìn)制日志包括兩類(lèi)文件:
二進(jìn)制日志索引文件(文件名后綴為.index)用于記錄所有的二進(jìn)制文件
二進(jìn)制日志文件(文件名后綴為.00000*)記錄數(shù)據(jù)庫(kù)所有的DDL和DML(除了數(shù)據(jù)查詢(xún)語(yǔ)句)語(yǔ)句事件。
binlog文件的滾動(dòng):
- 達(dá)到了滾動(dòng)的大小
- mysql服務(wù)停止
mysql binlog的三種格式
在配置文件中可以選擇配置 binlog_format= statement|mixed|row
-
ROW 模式(一般就用它)
日志會(huì)記錄每一行數(shù)據(jù)被修改的形式,不會(huì)記錄執(zhí)行 SQL 語(yǔ)句的上下文相關(guān)信息,只記錄要修改的數(shù)據(jù),哪條數(shù)據(jù)被修改了,修改成了什么樣子,只有 value,不會(huì)有 SQL 多表關(guān)聯(lián)的情況。
優(yōu)點(diǎn):它僅僅只需要記錄哪條數(shù)據(jù)被修改了,修改成什么樣子了,所以它的日志內(nèi)容會(huì)非常清楚地記錄下每一行數(shù)據(jù)修改的細(xì)節(jié),非常容易理解。
缺點(diǎn):ROW 模式下,特別是數(shù)據(jù)添加的情況下,所有執(zhí)行的語(yǔ)句都會(huì)記錄到日志中,都將以每行記錄的修改來(lái)記錄,這樣會(huì)產(chǎn)生大量的日志內(nèi)容。
-
STATEMENT 模式
每條會(huì)修改數(shù)據(jù)的 SQL 語(yǔ)句都會(huì)被記錄下來(lái)。
缺點(diǎn):由于它是記錄的執(zhí)行語(yǔ)句,所以,為了讓這些語(yǔ)句在 slave 端也能正確執(zhí)行,那他還必須記錄每條語(yǔ)句在執(zhí)行過(guò)程中的一些相關(guān)信息,也就是上下文信息,以保證所有語(yǔ)句在 slave 端被執(zhí)行的時(shí)候能夠得到和在 master 端執(zhí)行時(shí)候相同的結(jié)果。
但目前例如 step()函數(shù)在有些版本中就不能被正確復(fù)制,在存儲(chǔ)過(guò)程中使用了 last-insert-id()函數(shù),可能會(huì)使 slave 和 master 上得到不一致的 id,就是會(huì)出現(xiàn)數(shù)據(jù)不一致的情況,ROW 模式下就沒(méi)有。
-
MIXED 模式
以上兩種模式都使用。
常見(jiàn)的數(shù)據(jù)采集工具(相關(guān)知識(shí)):
DataX、Flume、Canal、Sqoop、LogStash
DataX (處理離線(xiàn)數(shù)據(jù))
DataX 是阿里巴巴開(kāi)源的一個(gè)異構(gòu)數(shù)據(jù)源離線(xiàn)同步工具,異構(gòu)數(shù)據(jù)源離線(xiàn)同步指的是將源端數(shù)據(jù)同步到目的端,但是端與端的數(shù)據(jù)源類(lèi)型種類(lèi)繁多,在沒(méi)有 DataX 之前,端與端的鏈路將組成一個(gè)復(fù)雜的網(wǎng)狀結(jié)構(gòu),非常零散無(wú)法把同步核心邏輯抽象出來(lái)。
為了解決異構(gòu)數(shù)據(jù)源同步問(wèn)題,DataX 將復(fù)雜的網(wǎng)狀的同步鏈路變成了星型數(shù)據(jù)鏈路,DataX 作為中間傳輸載體負(fù)責(zé)連接各種數(shù)據(jù)源。
所以,當(dāng)需要接入一個(gè)新的數(shù)據(jù)源的時(shí)候,只需要將此數(shù)據(jù)源對(duì)接到 DataX,就可以跟已有的數(shù)據(jù)源做到無(wú)縫數(shù)據(jù)同步。
DataX本身作為離線(xiàn)數(shù)據(jù)同步框架,采用Framework+plugin架構(gòu)構(gòu)建。將數(shù)據(jù)源讀取和寫(xiě)入抽象成為Reader/Writer插件,納入到整個(gè)同步框架中。
- Reader: 它為數(shù)據(jù)采集模塊,負(fù)責(zé)采集數(shù)據(jù)源的數(shù)據(jù),將數(shù)據(jù)發(fā)送給Framework。
- Writer: 它為數(shù)據(jù)寫(xiě)入模塊,負(fù)責(zé)不斷向Framework取數(shù)據(jù),并將數(shù)據(jù)寫(xiě)入到目的端。
- Framework:它用于連接Reader和Writer,作為兩者的數(shù)據(jù)傳輸通道,并處理緩沖、并發(fā)、數(shù)據(jù)轉(zhuǎn)換等問(wèn)題。
核心模塊介紹:
- DataX完成單個(gè)數(shù)據(jù)同步的作業(yè),我們把它稱(chēng)之為Job,DataX接收到一個(gè)Job之后,將啟動(dòng)一個(gè)進(jìn)程來(lái)完成整個(gè)作業(yè)同步過(guò)程。
- DataX Job啟動(dòng)后,會(huì)根據(jù)不同的源端切分策略,將Job切分成多個(gè)小的Task(子任務(wù)),以便于并發(fā)執(zhí)行。
- 切分多個(gè)Task之后,DataX Job會(huì)調(diào)用Scheduler模塊,根據(jù)配置的并發(fā)數(shù)據(jù)量,將拆分成的Task重新組合,組裝成TaskGroup(任務(wù)組)。每一個(gè)TaskGroup負(fù)責(zé)以一定的并發(fā)運(yùn)行完畢分配好的所有Task,默認(rèn)單個(gè)任務(wù)組的并發(fā)數(shù)量為5。
- 每一個(gè)Task都由TaskGroup負(fù)責(zé)啟動(dòng),Task啟動(dòng)后,會(huì)固定啟動(dòng)Reader->Channel->Writer的線(xiàn)程來(lái)完成任務(wù)同步工作。
- DataX作業(yè)運(yùn)行完成之后,Job監(jiān)控并等待多個(gè)TaskGroup模塊任務(wù)完成,等待所有TaskGroup任務(wù)完成后Job成功退出。否則,異常退出。
Flume(處理實(shí)時(shí)數(shù)據(jù))
Flume主要應(yīng)用的場(chǎng)景是同步日志數(shù)據(jù),主要包含三個(gè)組件:Source、Channel、Sink。
Flume最大的優(yōu)點(diǎn)就是官網(wǎng)提供了豐富的Source、Channel、Sink,根據(jù)不同的業(yè)務(wù)需求,我們可以在官網(wǎng)查找相關(guān)配置。另外,F(xiàn)lume還提供了自定義這些組件的接口。
Logstash(處理離線(xiàn)數(shù)據(jù))
Logstash就是一根具備實(shí)時(shí)數(shù)據(jù)傳輸能力的管道,負(fù)責(zé)將數(shù)據(jù)信息從管道的輸入端傳輸?shù)焦艿赖妮敵龆耍慌c此同時(shí)這根管道還可以讓你根據(jù)自己的需求在中間加上過(guò)濾網(wǎng),Logstash提供了很多功能強(qiáng)大的過(guò)濾網(wǎng)來(lái)滿(mǎn)足各種應(yīng)用場(chǎng)景。
Logstash是由JRuby編寫(xiě),使用基于消息的簡(jiǎn)單架構(gòu),在JVM上運(yùn)行。在管道內(nèi)的數(shù)據(jù)流稱(chēng)之為event,它分為inputs階段、filters階段、outputs階段。
Sqoop(處理離線(xiàn)數(shù)據(jù))
Sqoop是Hadoop和關(guān)系型數(shù)據(jù)庫(kù)之間傳送數(shù)據(jù)的一種工具,它是用來(lái)從關(guān)系型數(shù)據(jù)庫(kù)如MySQL到Hadoop的HDFS從Hadoop文件系統(tǒng)導(dǎo)出數(shù)據(jù)到關(guān)系型數(shù)據(jù)庫(kù)。Sqoop底層用的還是MapReducer,用的時(shí)候一定要注意數(shù)據(jù)傾斜。
注:sqoop不是CDC工具 sqoop是基于查詢(xún)的全量數(shù)據(jù)捕獲.
參考: