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事务正处于等待,则将半同步关闭
您可能感兴趣的文章:
- 安装mysql8.0.11及修改root密码、连接navicat for mysql的思路详解
- linux shell test [ ](判断方式)
- 跟着hsp一步步学mysql优化的方法
- 如何解决mysqlimport: Error: 13, Can't get stat of 的问题
- 小菜菜mysql练习解读分析2——查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )
- MySQL存储表情时报错:java.sql.SQLException: Incorrect string value:‘\xF0\x9F\x92\xA9\x0D\x0A...’的解决方法
- mysql max 与 where 间的执行问题小结
如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!
网友评论