Mysql 日志采集

為什么通過日志方式采集數(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 對比

  1. 兩者都是純java開發(fā)。
  2. canal集群方式部署,系統(tǒng)比較臃腫,復(fù)雜性也相對較高,可定制性也比較差,所以我們沒有考慮這種方案。
  3. 雖然Maxwell不能直接支持HA,但是它支持?jǐn)帱c(diǎn)還原,即錯誤解決后重啟繼續(xù)上次點(diǎn)兒讀取數(shù)據(jù)。
  4. Canal是服務(wù)端,數(shù)據(jù)過來了并不能直接寫出去,需要一個客戶端:syncClient去獲取數(shù)據(jù)。Maxwell即是服務(wù)端也是客戶端。
  5. Maxwell支持Bootstrap,即刷全量的數(shù)據(jù),而Canal不支持。
  6. 兩家產(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的混合。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容