MySQL主從復(fù)制主庫(kù)binlog dump線程源碼分析

在之前的文章《mysql主從復(fù)制io線程源碼分析》弥姻,我們分析了MySQL從庫(kù)的io線程工作的主要過程缅疟,大致回顧一下筹煮,如下:

  1. 連接主庫(kù)
  2. 發(fā)送COM_REGISTER_SLAVE命令注冊(cè)從庫(kù)
  3. 發(fā)送COM_BINLOG_DUMP_GTID命令請(qǐng)求拉取binlog

下面將結(jié)合源碼助泽,分析一下主庫(kù)接收到從庫(kù)io線程發(fā)送過來(lái)的命令后采郎,是如何具體處理的懂昂。

MySQL源碼版本:5.7.19

原文地址:
https://mytecdb.com/blogDetail.php?id=86

1. 注冊(cè)從庫(kù)

主庫(kù)在接收到從庫(kù)發(fā)送的COM_REGISTER_SLAVE命令后介时,會(huì)調(diào)用register_slave函數(shù)完成從庫(kù)的注冊(cè)。主要的執(zhí)行邏輯如下:

獲取從庫(kù)發(fā)送的與注冊(cè)相關(guān)的一些數(shù)據(jù)凌彬,包括從庫(kù)的server_id沸柔,report_host,report_user铲敛,report_password褐澎,port等等,這些數(shù)據(jù)會(huì)被存放在一個(gè)叫做SLAVE_INFO的結(jié)構(gòu)里伐蒋,這個(gè)結(jié)構(gòu)最終會(huì)被放到slave_list變量中工三,slave_list的類型是一個(gè)HASH表。slave_list是一個(gè)全局變量先鱼,位于源碼文件 sql/rpl_master.cc俭正,這個(gè)變量在用戶執(zhí)行show slave hosts時(shí)也會(huì)用到。

如果slave_list這個(gè)HASH表中已經(jīng)有從庫(kù)的信息了焙畔,也就是包含相同server_id的從庫(kù)信息已經(jīng)存在掸读,那么會(huì)先刪掉該從庫(kù)信息,再把新的加進(jìn)去。

2. 發(fā)送binlog

主庫(kù)在接收到從庫(kù)發(fā)送的COM_BINLOG_DUMP_GTID命令后儿惫,會(huì)調(diào)用com_binlog_dump_gtid函數(shù)處理從庫(kù)拉取binlog的請(qǐng)求澡罚。主要的執(zhí)行邏輯如下:

  1. 獲取從庫(kù)發(fā)送的binlog相關(guān)信息,包括server_id肾请,binlog名稱留搔,binlog位置,binlog大小铛铁,gtid信息等等隔显。
  2. 檢查是否已經(jīng)存在與該從庫(kù)關(guān)聯(lián)的binlog dump線程,如果存在避归,結(jié)束該binlog dump線程荣月。為什么會(huì)已經(jīng)存在binlog dump線程?在某些場(chǎng)景下梳毙,比如從庫(kù)io線程停止,這時(shí)主庫(kù)的binlog dump線程正好在等待binlog更新捐下,即等待主庫(kù)寫入數(shù)據(jù)账锹,如果主庫(kù)一直沒有寫入數(shù)據(jù),dump線程就會(huì)等待很長(zhǎng)時(shí)間坷襟,如果這時(shí)從庫(kù)io線程重連到主庫(kù)奸柬,就會(huì)發(fā)現(xiàn)主庫(kù)已經(jīng)存在與該從庫(kù)對(duì)應(yīng)的dump線程。所以主庫(kù)在處理從庫(kù)binlog dump請(qǐng)求時(shí)婴程,先檢查是否已經(jīng)存在dump線程廓奕。
  3. 調(diào)用mysql_binlog_send函數(shù),向從庫(kù)發(fā)送binlog档叔。這個(gè)函數(shù)內(nèi)部實(shí)際是通過一個(gè)C++類Binlog_sender來(lái)實(shí)現(xiàn)的桌粉,該類在源碼文件sql/rpl_binlog_sender.h中定義,調(diào)用該類的run成員函數(shù)來(lái)發(fā)送binlog衙四。
  4. Binlog_sender類的run成員函數(shù)铃肯,主要邏輯是通過多個(gè)while嵌套循環(huán),依次讀取binlog文件传蹈,binlog文件中的event押逼,將event發(fā)送給從庫(kù)。如果event已經(jīng)在從庫(kù)中應(yīng)用惦界,則忽略該event挑格。當(dāng)讀到最新的binlog時(shí),如果所有event都已經(jīng)發(fā)送完成沾歪,那么線程會(huì)等待binlog更新事件update_cond漂彤,有新的binlog event寫入后,會(huì)廣播通知所有等待update_cond事件的線程開始工作,也包括dump線程显歧。dump線程在等待update_cond事件時(shí)有一個(gè)超時(shí)時(shí)間仪或,這個(gè)時(shí)間就是master_heartbeat_period,即主庫(kù)dump線程與從庫(kù)io線程的心跳時(shí)間間隔士骤,這個(gè)值在從庫(kù)執(zhí)行change master 時(shí)設(shè)置范删,啟動(dòng)io線程時(shí)把該值傳遞給主庫(kù),主庫(kù)dump線程等待update_cond超時(shí)后拷肌,將會(huì)給從庫(kù)發(fā)送一個(gè)heartbeat event到旦,之后會(huì)繼續(xù)等待update_cond事件。上述過程會(huì)一直循環(huán)巨缘,直到dump線程被kill或者遇到其他錯(cuò)誤添忘。
  5. 當(dāng)執(zhí)行邏輯從Binlog_sender類內(nèi)部的while循環(huán)退出,緊接著會(huì)調(diào)用unregister_slave函數(shù)注銷從庫(kù)的注冊(cè)若锁。這個(gè)時(shí)候在主庫(kù)上執(zhí)行show slave hosts搁骑,就會(huì)發(fā)現(xiàn)從庫(kù)的信息已經(jīng)沒有了。
3. 思考一個(gè)問題

從庫(kù)執(zhí)行stop slave又固,我們立即在主庫(kù)上執(zhí)行show slave hosts仲器,發(fā)現(xiàn)從庫(kù)信息仍然存在,過一段時(shí)間仰冠,大概60秒左右乏冀,再次執(zhí)行,才發(fā)現(xiàn)從庫(kù)信息消失洋只,這是為什么辆沦?

從庫(kù)執(zhí)行stop slave,只是將io線程結(jié)束掉识虚,并不會(huì)通知主庫(kù)dump線程肢扯,主庫(kù)dump線程在給從庫(kù)發(fā)送binlog event或者心跳包時(shí),由于從庫(kù)io線程已經(jīng)結(jié)束舷礼,網(wǎng)絡(luò)包無(wú)響應(yīng)鹃彻,主庫(kù)等待net.ipv4.tcp_fin_timeout(默認(rèn)60秒)后,報(bào)異常妻献,退出Binlog_sender內(nèi)部的while循環(huán)蛛株,調(diào)用unregister_slave函數(shù)注銷從庫(kù)的注冊(cè),此時(shí)再次在主庫(kù)執(zhí)行show slave hosts育拨,就不會(huì)再看到從庫(kù)的信息了谨履。


附錄:

主要源碼文件:
sql/rpl_master.h
sql/rpl_master.cc

sql/rpl_binlog_sender.h
sql/rpl_binlog_sender.cc

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市熬丧,隨后出現(xiàn)的幾起案子笋粟,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件害捕,死亡現(xiàn)場(chǎng)離奇詭異绿淋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)尝盼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門吞滞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人盾沫,你說我怎么就攤上這事裁赠。” “怎么了赴精?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵佩捞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我蕾哟,道長(zhǎng)一忱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任渐苏,我火速辦了婚禮掀潮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘琼富。我一直安慰自己,他們只是感情好庄新,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布鞠眉。 她就那樣靜靜地躺著,像睡著了一般择诈。 火紅的嫁衣襯著肌膚如雪械蹋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天羞芍,我揣著相機(jī)與錄音哗戈,去河邊找鬼。 笑死荷科,一個(gè)胖子當(dāng)著我的面吹牛唯咬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播畏浆,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼胆胰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了刻获?” 一聲冷哼從身側(cè)響起蜀涨,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后厚柳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氧枣,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年别垮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了便监。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宰闰,死狀恐怖茬贵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情移袍,我是刑警寧澤解藻,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站葡盗,受9級(jí)特大地震影響螟左,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜觅够,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一胶背、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喘先,春花似錦钳吟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至涤姊,卻和暖如春暇番,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背思喊。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工壁酬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恨课。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓舆乔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親庄呈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜕煌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • 《場(chǎng)景歌》的仿寫,想想這個(gè)地方的典型的事物诬留、景物斜纪、動(dòng)物或人物贫母,也就是能通過這些內(nèi)容讓人猜出是什么地方。 場(chǎng)景歌 作...
    蘭羞玉酎閱讀 626評(píng)論 0 0
  • 作者:海風(fēng)暖暖 作品簡(jiǎn)介: 一場(chǎng)大火盒刚,將葉家小姐葉傾晨的記憶全部抹去腺劣。家族敗落后,她只想在這個(gè)世上求得一方立...
    大海集閱讀 390評(píng)論 0 0
  • 正式和考試書拜拜了因块,不得不認(rèn)命呀 踏踏實(shí)實(shí)的工作吧橘原,離家遠(yuǎn)點(diǎn)就遠(yuǎn)點(diǎn)吧,在哪都一樣 就像爸爸所說“就當(dāng)讀大學(xué)涡上,每個(gè)假...
    筱舒雅閱讀 261評(píng)論 3 4
  • 最近在實(shí)現(xiàn)一個(gè)簡(jiǎn)單的審批功能趾断,涉及到一些事務(wù)的處理。一個(gè)管控臺(tái)項(xiàng)目吩愧,我使用的是最簡(jiǎn)單的三層架構(gòu)芋酌。使用的是Ado.n...
    LynchPi閱讀 989評(píng)論 2 8
  • 題記 2014年為在知乎上回答問題 在太原生活是怎樣的一種體驗(yàn)?, 余專門做七律一首為紀(jì)念曾經(jīng)在母校的四年雁佳。累計(jì)二...
    墨道院閱讀 238評(píng)論 0 1