欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-31 10:12:14
函数调用 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事务正处于等待,则将半同步关闭