MySQL半同步复制--master dump线程2

来源:互联网 发布:校宝软件 编辑:程序博客网 时间:2024/06/15 23:06
mysql_binlog_send:    //是否在binlog index文件中能够找到指定的binlog文件名    if (mysql_bin_log.find_log_pos(&linfo, name, 1))    ...    if ((file=open_binlog_file(&log, log_file_name, &errmsg)) < 0)//打开binlog文件    ...    //初始化semi-syncif (RUN_HOOK(binlog_transmit, transmit_start,thd, flags, log_ident, pos,         &observe_transmission)))    ...    while (!net->error && net->vio != 0 && !thd->killed){//进入while循环//开始发送binlog之前需要重置packet(reset_transmit_packet)    if (reset_transmit_packet(thd, flags, &ev_offset, &errmsg,observe_transmission))        //会调用RUN_HOOK(binlog_transmit, reserve_header, (thd, flags, packet)))        while (!thd->killed &&           !(error= Log_event::read_log_event(&log, packet, log_lock,                current_checksum_alg,log_file_name,&is_active_binlog))){              if (observe_transmission &&                RUN_HOOK(binlog_transmit, before_send_event,(thd, flags,                         packet, log_file_name, pos)))           ...           my_net_write(net, (uchar*) packet->ptr(), packet->length());//发送binlog           if (skip_group == false && event_type == LOAD_EVENT){               send_file(thd);//通过TCP方式发送           }              if (observe_transmission &&                RUN_HOOK(binlog_transmit, after_send_event,(thd, flags, packet,                        log_file_name, skip_group ? pos : 0)))           ...        }//end 一批        //等待master通知        ret= mysql_bin_log.wait_for_update_bin_log(thd, heartbeat_ts);        if (goto_next_binlog){//打开下一个binlog            end_io_cache(&log);            mysql_file_close(file, MYF(MY_WME));            file=open_binlog_file(&log, log_file_name, &errmsg);            ...        }    }//end while     RUN_HOOK(binlog_transmit, transmit_stop, (thd, flags));//dump停止
reset_transmit_packet(thd, flags, &ev_offset, &errmsg,observe_transmission)   
  1)observe_transmission初始为FALSE,如果是半同步,在transmit_start函数中会置成TRUE
  2)repl_semisync.reserveSyncHeader(header, size)->repl_semi_reserve_header
     用于在packet的头部预留字节,以维护和slave的交互信息,目前预留3字节
     ReplSemiSyncBase:kSyncHeader[2],这里为在packet头部拷贝2字节,
     固定值作为MAGIC NUMBER,只有slave开启semisync才会保留额外的
     packet头部比特位,不管master是否开启了semisync
     const unsigned char ReplSemiSyncBase::kPacketMagicNum = 0xef;
     const unsigned char ReplSemiSyncBase::kSyncHeader[2] ={ReplSemiSyncBase::kPacketMagicNum, 0};
原创粉丝点击