【Canal源碼分析】數(shù)據(jù)傳輸協(xié)議

Canal的數(shù)據(jù)傳輸有兩塊审姓,一塊是進(jìn)行binlog訂閱時(shí)园担,binlog轉(zhuǎn)換為我們所定義的Message近弟,第二塊是client與server進(jìn)行TCP交互時(shí)缅糟,傳輸?shù)腡CP協(xié)議。

一祷愉、EntryProtocal

這塊是binlog的一個(gè)存儲(chǔ)溺拱。主要的格式如下:

Entry
    Header
        version         [協(xié)議的版本號(hào),default = 1]
        logfileName     [binlog文件名]
        logfileOffset   [binlog position]
        serverId        [服務(wù)端serverId]
        serverenCode    [變更數(shù)據(jù)的編碼]
        executeTime     [變更數(shù)據(jù)的執(zhí)行時(shí)間]
        sourceType      [變更數(shù)據(jù)的來源,default = MYSQL]
        schemaName      [變更數(shù)據(jù)的schemaname]
        tableName       [變更數(shù)據(jù)的tablename]
        eventLength     [每個(gè)event的長度]
        eventType       [insert/update/delete類型,default = UPDATE]
        props           [預(yù)留擴(kuò)展]
        gtid            [當(dāng)前事務(wù)的gitd]
    entryType           [事務(wù)頭BEGIN/事務(wù)尾END/數(shù)據(jù)ROWDATA/HEARTBEAT/GTIDLOG]
    storeValue          [byte數(shù)據(jù),可展開,對應(yīng)的類型為RowChange]    
RowChange
    tableId             [tableId,由數(shù)據(jù)庫產(chǎn)生]
    eventType           [數(shù)據(jù)變更類型,default = UPDATE]
    isDdl               [標(biāo)識(shí)是否是ddl語句谣辞,比如create table/drop table]
    sql                 [ddl/query的sql語句]
    rowDatas            [具體insert/update/delete的變更數(shù)據(jù)迫摔,可為多條,1個(gè)binlog event事件可對應(yīng)多條變更泥从,比如批處理]
        beforeColumns   [字段信息句占,增量數(shù)據(jù)(修改前,刪除前),Column類型的數(shù)組]
        afterColumns    [字段信息,增量數(shù)據(jù)(修改后,新增后),Column類型的數(shù)組] 
        props           [預(yù)留擴(kuò)展]
    props               [預(yù)留擴(kuò)展]
    ddlSchemaName       [ddl/query的schemaName躯嫉,會(huì)存在跨庫ddl纱烘,需要保留執(zhí)行ddl的當(dāng)前schemaName]
Column 
    index               [字段下標(biāo)]      
    sqlType             [jdbc type]
    name                [字段名稱(忽略大小寫),在mysql中是沒有的]
    isKey               [是否為主鍵]
    updated             [是否發(fā)生過變更]
    isNull              [值是否為null]
    props               [預(yù)留擴(kuò)展]
    value               [字段值,timestamp,Datetime是一個(gè)時(shí)間格式的文本]
    length              [對應(yīng)數(shù)據(jù)對象原始長度]
    mysqlType           [字段mysql類型]

二祈餐、CanalProtocal

這塊主要定義了client和server交互的協(xié)議擂啥。

Packet
    magic_number    [default = 17]
    version         [default = 1]
    type            [PacketType,類型]
    compression     [壓縮帆阳,default = NONE]
    body            [具體內(nèi)容]

主要的類型和對應(yīng)的body哺壶,都可以在CanalProtocal.proto里面查看到。

enum PacketType {
    HANDSHAKE = 1;
    CLIENTAUTHENTICATION = 2;
    ACK = 3;
    SUBSCRIPTION = 4;
    UNSUBSCRIPTION = 5;
    GET = 6;
    MESSAGES = 7;
    CLIENTACK = 8;
    // management part
    SHUTDOWN = 9;
    // integration
    DUMP = 10;
    HEARTBEAT = 11;
    CLIENTROLLBACK = 12;
}
//心跳
message HeartBeat {
    optional int64 send_timestamp = 1;
    optional int64 start_timestamp = 2;
}

//握手
message Handshake {
    optional string communication_encoding = 1 [default = "utf8"];
    optional bytes seeds = 2;
    repeated Compression supported_compressions = 3;
}

// client authentication
message ClientAuth {
    optional string username = 1;
    optional bytes password = 2; // hashed password with seeds from Handshake message
    optional int32 net_read_timeout = 3 [default = 0]; // in seconds
    optional int32 net_write_timeout = 4 [default = 0]; // in seconds
    optional string destination = 5;
    optional string client_id = 6;
    optional string filter = 7;
    optional int64 start_timestamp = 8;
}

//服務(wù)端響應(yīng)
message Ack {
    optional int32 error_code = 1 [default = 0];
    optional string error_message = 2; // if something like compression is not supported, erorr_message will tell about it.
}

//客戶端提交
message ClientAck {
    optional string destination = 1;
    optional string client_id = 2;
    optional int64 batch_id = 3;
}

// subscription
message Sub {
    optional string destination = 1;
    optional string client_id = 2;
    optional string filter = 7;
}

// Unsubscription
message Unsub {
    optional string destination = 1;
    optional string client_id = 2;
    optional string filter = 7;
}

//  PullRequest
message Get {
    optional string destination = 1;
    optional string client_id = 2;
    optional int32 fetch_size = 3;
    optional int64 timeout = 4 [default = -1]; // 默認(rèn)-1時(shí)代表不控制
    optional int32 unit = 5 [default = 2];// 數(shù)字類型蜒谤,0:納秒,1:毫秒,2:微秒,3:秒,4:分鐘,5:小時(shí),6:天
    optional bool auto_ack = 6 [default = false]; // 是否自動(dòng)ack
}

//消息
message Messages {
    optional int64 batch_id = 1;
    repeated bytes messages = 2;
}

// TBD when new packets are required
message Dump{
    optional string journal = 1;
    optional int64  position = 2;
    optional int64 timestamp = 3 [default = 0];
}

// 客戶端回滾
message ClientRollback{
    optional string destination = 1;
    optional string client_id = 2;
    optional int64 batch_id = 3;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末山宾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鳍徽,更是在濱河造成了極大的恐慌资锰,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阶祭,死亡現(xiàn)場離奇詭異绷杜,居然都是意外死亡直秆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門鞭盟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來圾结,“玉大人,你說我怎么就攤上這事懊缺∫吒澹” “怎么了培他?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵鹃两,是天一觀的道長。 經(jīng)常有香客問我舀凛,道長俊扳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任猛遍,我火速辦了婚禮馋记,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘懊烤。我一直安慰自己梯醒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布腌紧。 她就那樣靜靜地躺著茸习,像睡著了一般。 火紅的嫁衣襯著肌膚如雪壁肋。 梳的紋絲不亂的頭發(fā)上号胚,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機(jī)與錄音浸遗,去河邊找鬼猫胁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛跛锌,可吹牛的內(nèi)容都是我干的弃秆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼髓帽,長吁一口氣:“原來是場噩夢啊……” “哼驾茴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起氢卡,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤锈至,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后译秦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峡捡,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡击碗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了们拙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稍途。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖砚婆,靈堂內(nèi)的尸體忽然破棺而出械拍,到底是詐尸還是另有隱情,我是刑警寧澤装盯,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布坷虑,位于F島的核電站,受9級(jí)特大地震影響埂奈,放射性物質(zhì)發(fā)生泄漏迄损。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一账磺、第九天 我趴在偏房一處隱蔽的房頂上張望芹敌。 院中可真熱鬧,春花似錦垮抗、人聲如沸氏捞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽液茎。三九已至,卻和暖如春壤玫,著一層夾襖步出監(jiān)牢的瞬間豁护,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工欲间, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留楚里,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓猎贴,卻偏偏與公主長得像班缎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子她渴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容