本節(jié)包含一個(gè)筆記如下:
http://www.itdecent.cn/p/071dd72bb3ac
一、正常的STOP SLAVE流程
為了更加清楚的說(shuō)明從庫(kù)異常恢復(fù)的流程,我們需要先知道正常關(guān)閉從庫(kù)做了哪些工作,也就是‘stop slave’命令發(fā)起后做了哪些工作。我就以單SQL線程模式下SQL線程如何響應(yīng)‘stop slave’命令為例進(jìn)行解釋,IO線程也差不多并且更加簡(jiǎn)單,而MTS中更加復(fù)雜但是基本原理一致。
在前面23節(jié)的流程圖中我們可以看到單SQL線程會(huì)以Event為單位進(jìn)行應(yīng)用,最前面有一層循環(huán)用于循環(huán)讀取Event并且應(yīng)用。響應(yīng)‘stop slave’正是在這個(gè)循環(huán)的判斷條件中。
實(shí)際上‘stop slave’ 命令是用戶線程發(fā)起的,它需要作用于SQL線程和IO線程,他們之間一定要有傳遞的介質(zhì)如下:
- SQL線程:mi->rli->abort_slave
- IO線程:mi->abort_slave
而IO線程和SQL線程要到達(dá)判斷點(diǎn),需要將上一個(gè)Event處理完成再次循環(huán)的時(shí)候才能進(jìn)行。其次如果IO線程和SQL線程沒(méi)有正常終止,那么用戶線程執(zhí)行的‘stop slave’命令需要一直堵塞等待其完成(SQL線程由rli->run_lock和rli->stop_cond實(shí)現(xiàn))。但是參數(shù)rpl_stop_slave_timeout可以控制到底等待多久,需要注意的是雖然使用這個(gè)參數(shù)可以讓用戶線程退出,但是實(shí)際IO線程和SQL線程的關(guān)閉操作可能還是沒(méi)有完成,他們還在繼續(xù)關(guān)閉。
下面是我以SQL線程為例畫(huà)了一個(gè)簡(jiǎn)單的示意圖。圖中忽略了IO線程,因?yàn)镮O線程一般不會(huì)是問(wèn)題(圖25-1):