本节包含一个笔记如下:
https://www.jianshu.com/p/071dd72bb3ac
一、正常的STOP SLAVE流程
为了更加清楚的说明从库异常恢复的流程,我们需要先知道正常关闭从库做了哪些工作,也就是‘stop slave’命令发起后做了哪些工作。我就以单SQL线程模式下SQL线程如何响应‘stop slave’命令为例进行解释,IO线程也差不多并且更加简单,而MTS中更加复杂但是基本原理一致。
在前面23节的流程图中我们可以看到单SQL线程会以Event为单位进行应用,最前面有一层循环用于循环读取Event并且应用。响应‘stop slave’正是在这个循环的判断条件中。
实际上‘stop slave’ 命令是用户线程发起的,它需要作用于SQL线程和IO线程,他们之间一定要有传递的介质如下:
- SQL线程:mi->rli->abort_slave
- IO线程:mi->abort_slave
而IO线程和SQL线程要到达判断点,需要将上一个Event处理完成再次循环的时候才能进行。其次如果IO线程和SQL线程没有正常终止,那么用户线程执行的‘stop slave’命令需要一直堵塞等待其完成(SQL线程由rli->run_lock和rli->stop_cond实现)。但是参数rpl_stop_slave_timeout可以控制到底等待多久,需要注意的是虽然使用这个参数可以让用户线程退出,但是实际IO线程和SQL线程的关闭操作可能还是没有完成,他们还在继续关闭。
下面是我以SQL线程为例画了一个简单的示意图。图中忽略了IO线程,因为IO线程一般不会是问题(图25-1):
网友评论