MySQL半同步复制transmit_stop函数调用、代码分析
程序员文章站
2022-07-09 22:05:46
函数调用
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事务正处于等待,则将半同步关闭