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