摘要:本文主要向大家介绍了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频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号