最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解監(jiān)聽(tīng)MySQL的binlog日志工具分析:Canal

 更新時(shí)間:2020年10月20日 11:13:01   作者:大數(shù)據(jù)學(xué)習(xí)與分享  
Canal主要用途是基于MySQL數(shù)據(jù)庫(kù)增量日志解析,提供增量數(shù)據(jù)訂閱和消費(fèi),目前主要支持MySQL。接下來(lái)通過(guò)本文給大家介紹監(jiān)聽(tīng)MySQL的binlog日志工具分析:Canal的相關(guān)知識(shí),感興趣的朋友一起看看吧

Canal是阿里巴巴旗下的一款開(kāi)源項(xiàng)目,利用Java開(kāi)發(fā)。主要用途是基于MySQL數(shù)據(jù)庫(kù)增量日志解析,提供增量數(shù)據(jù)訂閱和消費(fèi),目前主要支持MySQL。

GitHub地址:https://github.com/alibaba/canal

在介紹Canal內(nèi)部原理之前,首先來(lái)了解一下MySQL Master/Slave同步原理:

MySQL master啟動(dòng)binlog機(jī)制,將數(shù)據(jù)變更寫(xiě)入二進(jìn)制日志(binary log, 其中記錄叫做二進(jìn)制日志事件binary log events,可以通過(guò)show binlog events進(jìn)行查看)MySQL slave(I/O thread)將master的binary log events拷貝到它的中繼日志(relay log)MySQL slave(SQL thread)重放relay log中事件,將數(shù)據(jù)變更反映它自己的數(shù)據(jù)中

Canal工作原理:

Canal模擬MySQL slave的交互協(xié)議,偽裝自己為MySQL slave,向MySQL master發(fā)送dump協(xié)議MySQL master收到dump請(qǐng)求,開(kāi)始推送binary log給slave(也就是canal)Canal解析binary log對(duì)象(原始為byte流)

簡(jiǎn)而言之,Canal是通過(guò)模擬成為MySQL的slave,監(jiān)聽(tīng)MySQL的binlog日志來(lái)獲取數(shù)據(jù)。當(dāng)把MySQL的binlog設(shè)置為row模式以后,可以獲取到執(zhí)行的每一個(gè)Insert/Update/Delete的腳本,以及修改前和修改后的數(shù)據(jù),基于這個(gè)特性,Canal就能高效的獲取到MySQL數(shù)據(jù)的變更。 Canal架構(gòu):

說(shuō)明: server代表一個(gè)Canal運(yùn)行實(shí)例,對(duì)應(yīng)于一個(gè)jvm instance對(duì)應(yīng)于一個(gè)數(shù)據(jù)隊(duì)列(1個(gè)server對(duì)應(yīng)1..n個(gè)instance)

EventParser:數(shù)據(jù)源接入,模擬slave協(xié)議和master進(jìn)行交互,協(xié)議解析

EventSink:Parser和Store連接器,主要進(jìn)行數(shù)據(jù)過(guò)濾,加工,分發(fā)的工作

EventStore:負(fù)責(zé)存儲(chǔ)

MemoryMetaManager:增量訂閱和消費(fèi)信息管理器

Event Parser設(shè)計(jì):

整個(gè)parser過(guò)程大致可分為以下幾步:

Connection獲取上一次解析成功的log position(如果是第一次啟動(dòng),則獲取初始指定的位置或者是當(dāng)前數(shù)據(jù)庫(kù)的binlog log position)Connection建立連接,向MySQL master發(fā)送BINLOG_DUMP請(qǐng)求MySQL開(kāi)始推送binary Log接收到的binary Log通過(guò)BinlogParser進(jìn)行協(xié)議解析,補(bǔ)充一些特定信息。如補(bǔ)充字段名字、字段類(lèi)型、主鍵信息、unsigned類(lèi)型處理等將解析后的數(shù)據(jù)傳入到EventSink組件進(jìn)行數(shù)據(jù)存儲(chǔ)(這是一個(gè)阻塞操作,直到存儲(chǔ)成功)定時(shí)記錄binary Log位置,以便重啟后繼續(xù)進(jìn)行增量訂閱

如果需要同步的master宕機(jī),可以從它的其他slave節(jié)點(diǎn)繼續(xù)同步binlog日志,避免單點(diǎn)故障。 Event Sink設(shè)計(jì):

EventSink主要作用如下:

數(shù)據(jù)過(guò)濾:支持通配符的過(guò)濾模式,表名,字段內(nèi)容等

數(shù)據(jù)路由/分發(fā):解決1:n(1個(gè)parser對(duì)應(yīng)多個(gè)store的模式)

數(shù)據(jù)歸并:解決n:1(多個(gè)parser對(duì)應(yīng)1個(gè)store)

數(shù)據(jù)加工:在進(jìn)入store之前進(jìn)行額外的處理,比如join 數(shù)據(jù)1:n業(yè)務(wù)

為了合理的利用數(shù)據(jù)庫(kù)資源, 一般常見(jiàn)的業(yè)務(wù)都是按照schema進(jìn)行隔離,然后在MySQL上層或者dao這一層面上,進(jìn)行一個(gè)數(shù)據(jù)源路由,屏蔽數(shù)據(jù)庫(kù)物理位置對(duì)開(kāi)發(fā)的影響,阿里系主要是通過(guò)cobar/tddl來(lái)解決數(shù)據(jù)源路由問(wèn)題。所以,一般一個(gè)數(shù)據(jù)庫(kù)實(shí)例上,會(huì)部署多個(gè)schema,每個(gè)schema會(huì)有由1個(gè)或者多個(gè)業(yè)務(wù)方關(guān)注。

數(shù)據(jù)n:1業(yè)務(wù)

同樣,當(dāng)一個(gè)業(yè)務(wù)的數(shù)據(jù)規(guī)模達(dá)到一定的量級(jí)后,必然會(huì)涉及到水平拆分和垂直拆分的問(wèn)題,針對(duì)這些拆分的數(shù)據(jù)需要處理時(shí),就需要鏈接多個(gè)store進(jìn)行處理,消費(fèi)的位點(diǎn)就會(huì)變成多份,而且數(shù)據(jù)消費(fèi)的進(jìn)度無(wú)法得到盡可能有序的保證。所以,在一定業(yè)務(wù)場(chǎng)景下,需要將拆分后的增量數(shù)據(jù)進(jìn)行歸并處理,比如按照時(shí)間戳/全局id進(jìn)行排序歸并。 Event Store設(shè)計(jì):

支持多種存儲(chǔ)模式,比如Memory內(nèi)存模式。采用內(nèi)存環(huán)裝的設(shè)計(jì)來(lái)保存消息,借鑒了Disruptor的RingBuffer的實(shí)現(xiàn)思路。 RingBuffer設(shè)計(jì):

定義了3個(gè)cursor:

put:Sink模塊進(jìn)行數(shù)據(jù)存儲(chǔ)的最后一次寫(xiě)入位置(同步寫(xiě)入數(shù)據(jù)的cursor)

get:數(shù)據(jù)訂閱獲取的最后一次提取位置(同步獲取的數(shù)據(jù)的cursor)

ack:數(shù)據(jù)消費(fèi)成功的最后一次消費(fèi)位置

借鑒Disruptor的RingBuffer的實(shí)現(xiàn),將RingBuffer拉直來(lái)看:

實(shí)現(xiàn)說(shuō)明:

put/get/ack cursor用于遞增,采用long型存儲(chǔ)。三者之間的關(guān)系為put>=get>=ackbuffer的get操作,通過(guò)取余或者&操作。(&操作:cusor & (size - 1) , size需要為2的指數(shù),效率比較高)

Instance設(shè)計(jì):

instance代表了一個(gè)實(shí)際運(yùn)行的數(shù)據(jù)隊(duì)列,包括了EventPaser、EventSink、EventStore等組件。抽象了CanalInstanceGenerator,主要是考慮配置的管理方式:

manager方式:和你自己的內(nèi)部web console/manager系統(tǒng)進(jìn)行對(duì)接。(目前主要是公司內(nèi)部使用)

spring方式:基于spring xml + properties進(jìn)行定義,構(gòu)建spring配置。 Server設(shè)計(jì):

server代表了一個(gè)Canal運(yùn)行實(shí)例,為了方便組件化使用,特意抽象了Embeded(嵌入式)/Netty(網(wǎng)絡(luò)訪問(wèn))的兩種實(shí)現(xiàn)。

增量訂閱/消費(fèi)設(shè)計(jì):

具體的協(xié)議格式,可參見(jiàn):CanalProtocol.proto。數(shù)據(jù)對(duì)象格式:EntryProtocol.proto

Entry
  Header
    logfileName [binlog文件名]
    logfileOffset [binlog position]
    executeTime [binlog里記錄變更發(fā)生的時(shí)間戳]
    schemaName [數(shù)據(jù)庫(kù)實(shí)例]
    tableName [表名]
    eventType [insert/update/delete類(lèi)型]
  entryType  [事務(wù)頭BEGIN/事務(wù)尾END/數(shù)據(jù)ROWDATA]
  storeValue [byte數(shù)據(jù),可展開(kāi),對(duì)應(yīng)的類(lèi)型為RowChange]

RowChange
isDdl    [是否是ddl變更操作,比如create table/drop table]
sql   [具體的ddl sql]
rowDatas  [具體insert/update/delete的變更數(shù)據(jù),可為多條,1個(gè)binlog event事件可對(duì)應(yīng)多條變更,比如批處理]
beforeColumns [Column類(lèi)型的數(shù)組]
afterColumns [Column類(lèi)型的數(shù)組]

Column
index    [column序號(hào)]
sqlType   [jdbc type]
name    [column name]
isKey    [是否為主鍵]
updated   [是否發(fā)生過(guò)變更]
isNull   [值是否為null]
value    [具體的內(nèi)容,注意為文本]

針對(duì)上述的補(bǔ)充說(shuō)明:

1.可以提供數(shù)據(jù)庫(kù)變更前和變更后的字段內(nèi)容,針對(duì)binlog中沒(méi)有的name、isKey等信息進(jìn)行補(bǔ)全

2.可以提供ddl的變更語(yǔ)句

Canal HA機(jī)制:

Canal的HA實(shí)現(xiàn)機(jī)制是依賴(lài)zookeeper實(shí)現(xiàn)的,主要分為Canal server和Canal client的HA。 Canal server:為了減少對(duì)MySQL dump的請(qǐng)求,不同server上的instance要求同一時(shí)間只能有一個(gè)處于running狀態(tài),其他的處于standby狀態(tài)。

Canal client:為了保證有序性,一份instance同一時(shí)間只能由一個(gè)Canal client進(jìn)行g(shù)et/ack/rollback操作,否則客戶(hù)端接收無(wú)法保證有序。 Canal Server HA架構(gòu)圖:

大致步驟:

  • Canal server要啟動(dòng)某個(gè)Canal instance時(shí)都先向Zookeeper進(jìn)行一次嘗試啟動(dòng)判斷 (實(shí)現(xiàn):創(chuàng)建EPHEMERAL節(jié)點(diǎn),誰(shuí)創(chuàng)建成功就允許誰(shuí)啟動(dòng))
  • 創(chuàng)建Zookeeper節(jié)點(diǎn)成功后,對(duì)應(yīng)的Canal server就啟動(dòng)對(duì)應(yīng)的Canal instance,沒(méi)有創(chuàng)建成功的Canal instance就會(huì)處于standby狀態(tài)
  • 一旦Zookeeper發(fā)現(xiàn)Canal server A創(chuàng)建的節(jié)點(diǎn)消失后,立即通知其他的Canal server再次進(jìn)行步驟1的操作,重新選出一個(gè)Canal server啟動(dòng)instance
  • Canal client每次進(jìn)行connect時(shí),會(huì)首先向Zookeeper詢(xún)問(wèn)當(dāng)前是誰(shuí)啟動(dòng)了Canal instance,然后和其建立鏈接,一旦鏈接不可用,會(huì)重新嘗試connect

Canal Client的方式和Canal server方式類(lèi)似,也是利用Zookeeper的搶占EPHEMERAL節(jié)點(diǎn)的方式進(jìn)行控制。

到此這篇關(guān)于詳解監(jiān)聽(tīng)MySQL的binlog日志工具分析:Canal的文章就介紹到這了,更多相關(guān)MySQL的binlog日志內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql 5.7.18 Installer安裝下載圖文教程

    mysql 5.7.18 Installer安裝下載圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.18 Installer安裝下載圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • MySQL?打開(kāi)binlog日志的方法及注意事項(xiàng)

    MySQL?打開(kāi)binlog日志的方法及注意事項(xiàng)

    本文給大家介紹MySQL?打開(kāi)binlog日志的方法及注意事項(xiàng),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-06-06
  • mysql 8.0.29 卸載問(wèn)題小結(jié)

    mysql 8.0.29 卸載問(wèn)題小結(jié)

    近我將筆記本重裝了,為了保留之前的程序,我把相關(guān)的注冊(cè)表和環(huán)境備份了下來(lái),重裝之后重新導(dǎo)入成功再現(xiàn)了部分軟件,下面給大家分享mysql 8.0.29 卸載問(wèn)題記錄,感興趣的朋友一起看看吧
    2024-04-04
  • MYSQL中REGEXP的實(shí)現(xiàn)示例

    MYSQL中REGEXP的實(shí)現(xiàn)示例

    本文主要介紹了MYSQL中REGEXP的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-08-08
  • mysql中l(wèi)imit的用法深入分析

    mysql中l(wèi)imit的用法深入分析

    本篇文章是對(duì)mysql中l(wèi)imit的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • MySQL數(shù)據(jù)庫(kù)可以用任意ip連接訪問(wèn)的方法

    MySQL數(shù)據(jù)庫(kù)可以用任意ip連接訪問(wèn)的方法

    本文主要介紹了MySQL數(shù)據(jù)庫(kù)可以用任意ip連接訪問(wèn)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • MySQL中explain語(yǔ)句的基本使用教程

    MySQL中explain語(yǔ)句的基本使用教程

    這篇文章主要給大家介紹了關(guān)于MySQL中explain語(yǔ)句的基本使用教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • MySQL數(shù)據(jù)庫(kù)崩潰問(wèn)題的檢測(cè)與解決方法

    MySQL數(shù)據(jù)庫(kù)崩潰問(wèn)題的檢測(cè)與解決方法

    數(shù)據(jù)庫(kù)崩潰問(wèn)題可能會(huì)對(duì)系統(tǒng)的可用性和數(shù)據(jù)的完整性造成嚴(yán)重影響,這篇文章主要為大家詳細(xì)介紹了MySQL如何解決數(shù)據(jù)庫(kù)崩潰問(wèn)題,需要的小伙伴可以了解下
    2025-07-07
  • MySQL數(shù)據(jù)庫(kù)是如何實(shí)現(xiàn)XA規(guī)范的

    MySQL數(shù)據(jù)庫(kù)是如何實(shí)現(xiàn)XA規(guī)范的

    這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)是如何實(shí)現(xiàn)XA規(guī)范的,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2021-01-01
  • mysql數(shù)據(jù)庫(kù) 主從復(fù)制的配置方法

    mysql數(shù)據(jù)庫(kù) 主從復(fù)制的配置方法

    本文主要介紹 mysql數(shù)據(jù)庫(kù) 主從負(fù)責(zé)的配置方法,在做數(shù)據(jù)庫(kù)開(kāi)發(fā)的時(shí)候有時(shí)候會(huì)遇到,這里做出詳細(xì)流程,大家可以參考下
    2016-07-07

最新評(píng)論

汝州市| 浪卡子县| 利川市| 旌德县| 喜德县| 诏安县| 五峰| 湖南省| 依安县| 广宁县| 柘荣县| 淮阳县| 那坡县| 木兰县| 河北区| 富阳市| 崇仁县| 多伦县| 龙胜| 蚌埠市| 台北县| 耒阳市| 成安县| 沅陵县| 甘泉县| 油尖旺区| 苏州市| 湛江市| 都兰县| 固安县| 游戏| 开封市| 余庆县| 青浦区| 繁峙县| 道孚县| 离岛区| 兴仁县| 林甸县| 淅川县| 清镇市|