第20节:从库MTS多线程并行回放(二)
本节包含一个笔记如下:
https://www.jianshu.com/p/e920a6d33005
这一节会先描述MTS的工作线程执行Event的大概流程。然后重点描述一下MTS中检查点的概念。在后面的第
25节我们可以看到,MTS的异常恢复很多情况下需要依赖这个检查点,从检查点位置开始扫描relay log做恢复
操作,但是在GTID AUTO_POSITION MODE模式且设置了recovery_relay_log=1的情况下这种依赖将会弱
化。
一、工作线程执行Event
前面我们已经讨论了协调线程分发Event的规则,实际上协调线程只是将Event分发到了工作线程的执行队列
中。那么工作线程执行Event就需要从执行队列中拿出这些Event,然后进行执行。整个过程可以参考函数
slave_worker_exec_job_group。因为这个流程比较简单,因此就不需要画图了,但是我们需要关注一些点如
下:
(1)从执行队列中读取Event。注意这里如果执行队列中没有Event那么就进入空闲等待,也就是工作线程处于
无事可做的状态,等待状态为‘Waiting for an event from Coordinator’。
(2)如果执行到XID_EVENT那么说明事务已经结束了那么需要完成内存信息更新操作。可参考
Slave_worker::slave_worker_exec_event和Xid_apply_log_event::do_apply_event_worker函数。更新内存相
关信息可参考函数commit_positions函数。下面是一些更新的信息,我们可以看到和slave_worker_info表中的
信息基本一致,如下:
1、更新当前信息
strmake(group_relay_log_name, ptr_g->group_relay_log_name,
sizeof(group_relay_log_name) - 1);
group_relay_log_pos= ev->future_event_relay_log_pos;
set_group_master_log_pos(ev->common_header->log_pos);
set_group_master_log_name(c_rli->get_group_master_log_name());
2、将检查点信息进行写入:
strmake(checkpoint_relay_log_name, ptr_g-
>checkpoint_relay_log_name,sizeof(checkpoint_relay_log_name) - 1);
checkpoint_relay_log_pos= ptr_g->checkpoint_relay_log_pos;
strmake(checkpoint_master_log_name, ptr_g-
>checkpoint_log_name,sizeof(checkpoint_master_log_name) - 1);
checkpoint_master_log_pos= ptr_g->checkpoint_log_pos;
3、设置GAQ序号:
checkpoint_seqno= ptr_g->checkpoint_seqno;
更新整个BITMAP,可能已经由检查点进行GAQ出队:
for (uint pos= ptr_g->shifted; pos < c_rli->checkpoint_group; pos++)
//重新设置位图 因为checkpoint已经
{
评论