為什么通過日志方式采集數(shù)據(jù)?
減少對業(yè)務(wù)庫的入侵,如果使用全量方式獲取數(shù)據(jù)會對業(yè)務(wù)庫造成很大的性能影響。通過流式采集binlog對業(yè)務(wù)庫的入侵性降到最低。
目前流式采集binlog的幾種開源方案
1.Maxwell
maxwell是讀取mysql binlogs 并將行更新為json格式數(shù)據(jù)到kafka,kinesis,或者其他流式平臺一個守護(hù)進(jìn)程。Maxwell的操作開銷很低,只需要mysql和一個寫入位置。Maxwell為您提供了無需重新構(gòu)建整個平臺的事件源的一些好處。
Maxwell與mysql 通信是采用mysql-binlog-connector-java開源框架。
2.Canal
canal是純Java開發(fā)?;跀?shù)據(jù)庫增量日志解析,提供增量數(shù)據(jù)訂閱&消費(fèi),目前主要支持了MySQL.
Maxwell 與 Cannal 對比
- 兩者都是純java開發(fā)。
- canal集群方式部署,系統(tǒng)比較臃腫,復(fù)雜性也相對較高,可定制性也比較差,所以我們沒有考慮這種方案。
- 雖然Maxwell不能直接支持HA,但是它支持?jǐn)帱c(diǎn)還原,即錯誤解決后重啟繼續(xù)上次點(diǎn)兒讀取數(shù)據(jù)。
- Canal是服務(wù)端,數(shù)據(jù)過來了并不能直接寫出去,需要一個客戶端:syncClient去獲取數(shù)據(jù)。Maxwell即是服務(wù)端也是客戶端。
- Maxwell支持Bootstrap,即刷全量的數(shù)據(jù),而Canal不支持。
- 兩家產(chǎn)品社區(qū)都比較活躍。
小結(jié):個人推薦選擇Maxwell。
- 服務(wù)端和客戶端是一體的
- Maxwell是輕量級的,出錯風(fēng)險低,Canal經(jīng)常出錯
- 雖然部署的是單臺,但是具有斷點(diǎn)還原能力,出錯好解決
BinLog的協(xié)議,數(shù)據(jù)發(fā)送方式
通過dump協(xié)議進(jìn)行數(shù)據(jù)交互。

image.png
binlog日志格式為ROW:binlog推送的event中包含變更的數(shù)據(jù)。
BinLog日志格式
- Statement:每一條會修改數(shù)據(jù)的sql都會記錄在binlog中。
優(yōu)點(diǎn):不需要記錄每一行的變化,減少了binlog日志量,節(jié)約了IO,提高性能。(相比row能節(jié)約多少性能與日志量,這個取決于應(yīng)用的SQL情況,正常同一條記錄修改或者插入row格式所產(chǎn)生的日志量還小于Statement產(chǎn)生的日志量,但是考慮到如果帶條件的update操作,以及整表刪除,alter表等操作,ROW格式會產(chǎn)生大量日志,因此在考慮是否使用ROW格式日志時應(yīng)該跟據(jù)應(yīng)用的實(shí)際情況,其所產(chǎn)生的日志量會增加多少,以
及帶來的IO性能問題。)
缺點(diǎn):由于記錄的只是執(zhí)行語句,為了這些語句能在slave上正確運(yùn)行,因此還必須記錄每條語句在執(zhí)行的時候的一些相關(guān)信息,以保證所有語句能在slave得到和在master端執(zhí)行時候相同 的結(jié)果。另外mysql 的復(fù)制,像一些特定函數(shù)功能,slave可與master上要保持一致會有很多相關(guān)問題(如sleep()函數(shù), last_insert_id(),以及user-defined functions(udf)會出現(xiàn)問題). - Row:不記錄sql語句上下文相關(guān)信息,僅保存哪條記錄被修改。
優(yōu)點(diǎn): binlog中可以不記錄執(zhí)行的sql語句的上下文相關(guān)的信息,僅需要記錄那一條記錄被修
改成什么了。所以rowlevel的日志內(nèi)容會非常清楚的記錄下每一行數(shù)據(jù)修改的細(xì)節(jié)。而且不會
出現(xiàn)某些特定情況下的存儲過程,或function,以及trigger的調(diào)用和觸發(fā)無法被正確復(fù)制的
問題
缺點(diǎn):所有的執(zhí)行的語句當(dāng)記錄到日志中的時候,都將以每行記錄的修改來記錄,這樣可能會產(chǎn)生大量的日志內(nèi)容,比如一條update語句,修改多條記錄,則binlog中每一條修改都會有記錄,這樣造成binlog日志量會很大,特別是當(dāng)執(zhí)行alter table之類的語句的時候,由于表結(jié)構(gòu)修改,每條記錄都發(fā)生改變,那么該表每一條記錄都會記錄到日志中。 - Mixedlevel:以上兩種Level的混合。