您的位置:首页 > 数据库 > MySQL

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

2017-10-22 16:29 645 查看
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-sync
if (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};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: