详解MySQL半同步before_send_event实例
Vivian 2018-06-12 来源 : 阅读 1426 评论 0

摘要:本文主要向大家介绍了MySQL半同步before_send_event实例,通过具体的代码向大家展示,希望对大家学习MySQL有所帮助。

本文主要向大家介绍了MySQL半同步before_send_event实例,通过具体的代码向大家展示,希望对大家学习MySQL有所帮助。

mysql_binlog_send-->before_send_event --> repl_semi_before_send_event

--> repl_semisync.updateSyncHeader


int repl_semi_before_send_event(Binlog_transmit_param *param,
                                unsigned char *packet, unsigned long len,
                                const char *log_file, my_off_t log_pos)
{
  return repl_semisync.updateSyncHeader(packet,
                    log_file,
                    log_pos,
                    param->server_id);
}

    

   

int ReplSemiSyncMaster::updateSyncHeader(unsigned char *packet,
                     const char *log_file_name,
                     my_off_t log_file_pos,
                     uint32 server_id)
{
  const char *kWho = "ReplSemiSyncMaster::updateSyncHeader";
  int  cmp = 0;
  bool sync = false;
 
  /*
  1、如果master没有开启半同步或者slave没有开启半同步,直接返回
  */
  if (!getMasterEnabled() || !is_semi_sync_slave())
    return 0;
 
  function_enter(kWho);
  /*
  2、LOCK_binlog_锁内,下面代码串行,再次判断master是否开启半同步并且半同步是否正常
  */
  lock();
  /* This is the real check inside the mutex. */
  if (!getMasterEnabled())
    goto l_end; // sync= false at this point in time
  if (is_on())
  {
    /*
    1、当前的event的Log_file_name和pos小于reply值,表示这个event已经收到ack了,不需要再等
    */
    if (reply_file_name_inited_)
    {
      cmp = ActiveTranx::compare(log_file_name, log_file_pos,
                                 reply_file_name_, reply_file_pos_);
      if (cmp <= 0)
      {
        /* If we have already got the reply for the event, then we do
         * not need to sync the transaction again.
         */
        goto l_end;
      }
    }
    /*
    2、如果当前event的位置大于最小等待事务ack的位置,说明这个event可能也需要等待ack
    */
    if (wait_file_name_inited_)
    {
      cmp = ActiveTranx::compare(log_file_name, log_file_pos,
                                 wait_file_name_, wait_file_pos_);
    }
    else
    {
      cmp = 1;
    }
    /*
    2.1 只有cmp>=0时,才需要进行判断该event是不是事务的最后一个event。只有事务的最后一个event
        才需要等待接收ACK
    */
    if (cmp >= 0)
    {
      /*
      注:active_tranxs_管理的是事务的最后一个event。通过当前event的位置hash到active_tranxs节点中
          entry->hash_next_管理的是同一个hash key的事务的最后一个event,所以需要这个链表进行遍历
      */
      assert(active_tranxs_ != NULL);
      sync = active_tranxs_->is_tranx_end_pos(log_file_name,
                                               log_file_pos);
    }
  }
  /*
  3、半同步发生异常,变成异步了:当前event已经是当前最新的binlog位置,表示slave已经跟上master?
     这个event需要等待ACK
      
  */
  else
  {
    if (commit_file_name_inited_)
    {
      int cmp = ActiveTranx::compare(log_file_name, log_file_pos,
                                     commit_file_name_, commit_file_pos_);
      sync = (cmp >= 0);
    }
    else
    {
      sync = true;
    }
  }
l_end:
  unlock();
 
  /*
  4、设置包头,添加semi-sync的flag,表示需要进行等待ACK,即slave也需要回复ack
  */
  if (sync)
  {
    (packet)[2] = kPacketFlagSync;
  }
 
  return function_exit(kWho, 0);
}

   

以上就介绍了MySQL的相关知识,希望对MySQL有兴趣的朋友有所帮助。了解更多内容,请关注职坐标数据库MySQL频道!

本文由 @Vivian 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程