MySQL半同步復制--transmit_stop -开发者知识库

MySQL半同步復制--transmit_stop -开发者知识库,第1张

函數調用

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事務正處於等待,則將半同步關閉


最佳答案:

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复