当前位置: 移动技术网 > IT编程>数据库>Mysql > MySQL半同步复制transmit_stop函数调用、代码分析

MySQL半同步复制transmit_stop函数调用、代码分析

2017年12月28日  | 移动技术网IT编程  | 我要评论
函数调用 mysql_binlog_send->(void) RUN_HOOK(binlog_transmit, transmit_stop, (thd, flags))-
函数调用

mysql_binlog_send->(void) RUN_HOOK(binlog_transmit, transmit_stop, (thd, flags))->

repl_semi_binlog_dump_end

代码分析
int repl_semi_binlog_dump_end(Binlog_transmit_param *param)
{
  //至少有一个slave开启了半同步
  bool semi_sync_slave= repl_semisync.is_semi_sync_slave();

  if (semi_sync_slave)
  {
    /* One less semi-sync slave */
    repl_semisync.remove_slave();
  }
  return 0;
}
void ReplSemiSyncMaster::remove_slave()
{
  //锁内减一
  lock();
  rpl_semi_sync_master_clients--;

  /* master开启着半同步,并且半同步复制状态正常 */
  if (getMasterEnabled() && is_on())
  {
    //如果(不需要再开启半同步 或者server down掉)&&没有master事务正处于等待,则将半同步关闭
    if (rpl_semi_sync_master_clients == 0 &&
        (!rpl_semi_sync_master_wait_no_slave || abort_loop))
    {
      switch_off();
    }
  }
  unlock();
}

注:

rpl_semi_sync_master_wait_no_slave:默认是on。表示每个事务都必须等待超时时间。默认打开,表示当备库起来后,

并跟上主库时,自动切换到半同步模式,如果关闭,即使备库起来并跟上了,也不会启用半同步;

rpl_semi_sync_master_wait_for_slave_count:master继续处理事务必须等待slave ACK的个数。

总结

1、该函数在主库向slave发送binlog结束之后。

2、在LOCK_binlog_锁内进行操作。首先将rpl_semi_sync_master_clients减一

3、如果(不需要再开启半同步 或者server down掉)&&没有master事务正处于等待,则将半同步关闭

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网