MySQL半同步复制--transmit_stop

来源:互联网 发布:网络惊魂 电影 2016 编辑:程序博客网 时间:2024/06/05 09:42

函数调用

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事务正处于等待,则将半同步关闭


原创粉丝点击