MySQL主從復制從庫SQL線程源碼分析

MySQL主從復制通過Binlog進行數(shù)據(jù)傳輸和措,主庫寫入數(shù)據(jù),生成Binlog蜕煌,通過dump線程將Binlog發(fā)送給從庫派阱,從庫IO線程接收Binlog并寫入自己的relay log,SQL線程應用relay log里的事務斜纪。本文結合MySQL源碼贫母,分析SQL線程的主要處理過程。

MySQL源碼版本:5.7.19

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

1. SQL線程啟動

MySQL從庫在執(zhí)行start slave命令時盒刚,在MySQL內(nèi)部依次調(diào)用下面的函數(shù)來啟動IO線程和SQL線程腺劣。

  • mysql_execute_command(),sql/sql_parse.cc
  • start_slave_cmd()因块,sql/rpl_slave.cc
  • start_slave()橘原,sql/rpl_slave.cc
  • start_slave_threads(),sql/rpl_slave.cc
  • start_slave_thread(),sql/rpl_slave.cc

其中SQL線程在 start_slave_thread() 函數(shù)中被創(chuàng)建趾断。

start_slave_threads 函數(shù)在另外一個地方也會被調(diào)用寨辩,init_slave()函數(shù),這個函數(shù)是在MySQL啟動時調(diào)用歼冰,如果沒有指定skip-slave-start靡狞,主從復制隨著MySQL啟動而自動啟動。

2. SQL線程函數(shù)

MySQL主從復制SQL線程的線程函數(shù)位于sql/rpl_slave.cc文件中隔嫡,定義如下:

extern "C" void *handle_slave_sql(void *arg)

(1)創(chuàng)建工作線程
在MySQL 5.7 版本甸怕,開啟邏輯并行復制,SQL線程會創(chuàng)建多個工作線程并發(fā)進行relay log日志的應用腮恩,源碼中創(chuàng)建工作線程的調(diào)用棧如下:

  • handle_slave_sql()
  • slave_start_workers()
  • slave_start_single_worker()
  • mysql_thread_create()

(2)進入循環(huán)
SQL線程創(chuàng)建完工作線程之后梢杭,會進入while循環(huán),直到停止復制或者SQL線程被kill秸滴。

在循環(huán)中的主要函數(shù)調(diào)用關系如下:

  • handle_slave_sql()武契,SQL線程主函數(shù)
  • exec_relay_log_event()
  • apply_event_and_update_pos()
  • ev->apply_event(rli);
  • ev->do_apply_event()

exec_relay_log_event 函數(shù)讀取relay log中的event。

apply_event_and_update_pos函數(shù)去應用relay log event荡含。在這個函數(shù)里咒唆,會將thd的server_id設置成event的server_id,保證event被應用后释液,生成自己的binlog時全释,server_id仍然是原始值。

apply_event_and_update_pos函數(shù)中會調(diào)用函數(shù)sql_delay_event()误债,用于處理延遲復制浸船,比如使用了CHANGE MASTER TO MASTER_DELAY = X 這樣的語法。

ev->apply_event()函數(shù)是event自己成員函數(shù)寝蹈,這個函數(shù)里面會去判斷event是否可以并行應用李命,如果不可以,就在當前線程(SQL線程)去處理這個event箫老,如果可以并行應用封字,則會返回上一層函數(shù)apply_event_and_update_pos,將event丟進入一個隊列槽惫,后續(xù)worker線程會去這個隊列中取出event處理周叮。

3. 工作線程主要邏輯

工作線程的線程函數(shù)為:

extern "C" void *handle_slave_worker(void *arg)

主要調(diào)用關系如下:

  • handle_slave_worker(),工作線程主函數(shù)
  • slave_worker_exec_job_group()
  • slave_worker_exec_event()
  • ev->do_apply_event_worker(this);
  • ev->do_apply_event()
  • mysql_parse()

工作線程內(nèi)部主要是一個while循環(huán)界斜,調(diào)用slave_worker_exec_job_group()函數(shù)執(zhí)行分配給自己的任務仿耽。

在slave_worker_exec_job_group函數(shù)中,拿到event后各薇,調(diào)用下面這個函數(shù)應用event:
error= worker->slave_worker_exec_event(ev);

在slave_worker_exec_event函數(shù)中又會調(diào)用event自己的成員函數(shù)來應用event:
ret= ev->do_apply_event_worker(this);

在do_apply_event_worker函數(shù)中项贺,調(diào)用不同類型event的do_apply_event()成員函數(shù)君躺。比如Query_log_event這種類型的event。
Query_log_event::do_apply_event()

do_apply_event函數(shù)中最終調(diào)用mysql_parse函數(shù)執(zhí)行SQL語句开缎。

4. 總結

本文簡單分析了MySQL主從復制SQL線程的主要處理邏輯棕叫,MySQL主從復制是邏輯復制,從上面過程來看奕删,SQL線程(包括工作線程)從relay log中拿到event俺泣,然后像執(zhí)行一個原始SQL一樣在從庫上重新執(zhí)行一次,相對于物理復制完残,這種方式效率并不高伏钠,耗費資源,并且容易產(chǎn)生復制延遲谨设。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末熟掂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扎拣,更是在濱河造成了極大的恐慌赴肚,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件二蓝,死亡現(xiàn)場離奇詭異誉券,居然都是意外死亡,警方通過查閱死者的電腦和手機侣夷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門横朋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人百拓,你說我怎么就攤上這事∥酰” “怎么了衙传?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長厕九。 經(jīng)常有香客問我蓖捶,道長,這世上最難降的妖魔是什么扁远? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任俊鱼,我火速辦了婚禮,結果婚禮上畅买,老公的妹妹穿的比我還像新娘并闲。我一直安慰自己,他們只是感情好谷羞,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布帝火。 她就那樣靜靜地躺著溜徙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪犀填。 梳的紋絲不亂的頭發(fā)上蠢壹,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音九巡,去河邊找鬼图贸。 笑死,一個胖子當著我的面吹牛冕广,可吹牛的內(nèi)容都是我干的求妹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼佳窑,長吁一口氣:“原來是場噩夢啊……” “哼制恍!你這毒婦竟也來了?” 一聲冷哼從身側響起神凑,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤净神,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后溉委,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹃唯,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年瓣喊,在試婚紗的時候發(fā)現(xiàn)自己被綠了坡慌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡藻三,死狀恐怖洪橘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情棵帽,我是刑警寧澤熄求,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站逗概,受9級特大地震影響弟晚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逾苫,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一卿城、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铅搓,春花似錦瑟押、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽指煎。三九已至,卻和暖如春便斥,著一層夾襖步出監(jiān)牢的瞬間至壤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工枢纠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哼鬓,地道東北人慢逾。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓椎木,卻偏偏與公主長得像缘揪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子木西,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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