异常故障恢复
并行复制总是存在一个不可避免的问题,那就是在从库并行执行的过程中,如果数据库或操作系统挂了,那么此时每个线程执行的点就都是不确定的。也就是说顺序的binlog被分发出去了之后,从最小位置到最大位置之间这块连续的内容之间存在断点的。如此一来,从库恢复之后,开始执行时就需要准确无误地还原哪些已经执行,哪些还没有执行。
一个正在并行执行的事物队列,也可以说这些事务的last_committed都是相同的,并且从前到后。此外sequence_number是顺序增长的,也就是说以binlog文件内容的顺序排列的。
整个队列被分配之后,在某一时刻,队列执行的状态,假设从库挂了,,那么在次启动之后,如何继续执行?
mysql为了实现对执行状态的记录,做了很多工作,首先就是维护一个队列,这个队列叫做GAQ,group assigned queue,SQL线程在分配某一个事务时,首先会将这个事物加入到这个队列,之后系统会将当前事物分发到一个线程来执行。可以想到,在某一个时刻,任务队列GAQ及每个线程的执行队列,每一个事物,在分发之后,都会有一个标号,这个标号在某一段时间内,都是相对固定的,这个编号在某一时间段内都是相对固定的如图:
每一