最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

MySQL多个Slave同一server_id的冲突原因分析

来源:懂视网 责编:小采 时间:2020-11-09 13:19:25
文档

MySQL多个Slave同一server_id的冲突原因分析

MySQL多个Slave同一server_id的冲突原因分析:本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/database/mysql_multi_slave_same_serverid.html 今天分析一个诡异问题,一个模拟Slave线程的程序,不断
推荐度:
导读MySQL多个Slave同一server_id的冲突原因分析:本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/database/mysql_multi_slave_same_serverid.html 今天分析一个诡异问题,一个模拟Slave线程的程序,不断

本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/database/mysql_multi_slave_same_serverid.html 今天分析一个诡异问题,一个模拟Slave线程的程序,不断的被Master Ser

本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/database/mysql_multi_slave_same_serverid.html

今天分析一个诡异问题,一个模拟Slave线程的程序,不断的被Master Server给kill掉,最终发现是因为有两个Slave使用同样一个server id去连接Master Server,为什么两个Slave用同一个server id会被Master Server给Kill呢?分析了源码,这源于MySQL Replication的重连机制。

我们首先看看一个Slave注册到Master会发生什么,首先Slave需要向Master发送一个COM_REGISTER_SLAVE类型的请求(sql_parse.cc)命令请求,这里Master会使用register_slave函数注册一个Slave到slave_list。

 case COM_REGISTER_SLAVE:
 {
 if (!register_slave(thd, (uchar*)packet, packet_length))
 my_ok(thd);
 break;
 }

在注册Slave线程的时候会发生什么呢?我们略去无用的代码直接看重点:(repl_failsafe.cc)

int register_slave(THD* thd, uchar* packet, uint packet_length)
{
 int res;
 SLAVE_INFO *si;
 uchar *p= packet, *p_end= packet + packet_length;
.... //省略
 if (!(si->master_id= uint4korr(p)))
 si->master_id= server_id;
 si->thd= thd;
 pthread_mutex_lock(&LOCK_slave_list);
 unregister_slave(thd,0,0); //关键在这里,先取消注册server_id相同的Slave线程
 res= my_hash_insert(&slave_list, (uchar*) si); //把新的Slave线程注册到slave_list
 pthread_mutex_unlock(&LOCK_slave_list);
 return res;
.....
}

这是什么意思呢?这就是重连机制,slave_list是一个Hash表,server_id是Key,每一个线程注册上来,需要删掉同样server_id的Slave线程,再把新的Slave线程加到slave_list表中。

线程注册上来后,请求Binlog,发送COM_BINLOG_DUMP请求,Master会发送binlog给Slave,代码如下:

 case COM_BINLOG_DUMP:
 {
 ulong pos;
 ushort flags;
 uint32 slave_server_id;
 
 status_var_increment(thd->status_var.com_other);
 thd->enable_slow_log= opt_log_slow_admin_statements;
 if (check_global_access(thd, REPL_SLAVE_ACL))
 break;
 
 /* TODO: The following has to be changed to an 8 byte integer */
 pos = uint4korr(packet);
 flags = uint2korr(packet + 4);
 thd->server_id=0; /* avoid suicide */
 if ((slave_server_id= uint4korr(packet+6))) // mysqlbinlog.server_id==0
 kill_zombie_dump_threads(slave_server_id);
 thd->server_id = slave_server_id;
 
 general_log_print(thd, command, "Log: '%s' Pos: %ld", packet+10,
 (long) pos);
 mysql_binlog_send(thd, thd->strdup(packet + 10), (my_off_t) pos, flags); //不断的发送日志给slave端
 unregister_slave(thd,1,1); //发送完成后清理Slave线程,因为执行到这一步肯定是binlog dump线程被kill了
 /* fake COM_QUIT -- if we get here, the thread needs to terminate */
 error = TRUE;
 break;
 }

mysql_binlog_send函数在sql_repl.cc,里面是轮询Master binlog,发送给Slave。

再来简单看看unregister_slave做了什么(repl_failsafe.cc):

void unregister_slave(THD* thd, bool only_mine, bool need_mutex)
{
 if (thd->server_id)
 {
 if (need_mutex)
 pthread_mutex_lock(&LOCK_slave_list);
 
 SLAVE_INFO* old_si;
 if ((old_si = (SLAVE_INFO*)hash_search(&slave_list,
 (uchar*)&thd->server_id, 4)) &&
 (!only_mine || old_si->thd == thd)) //拿到slave值
 hash_delete(&slave_list, (uchar*)old_si); //从slave_list中拿掉
 
 if (need_mutex)
 pthread_mutex_unlock(&LOCK_slave_list);
 }
}

这就可以解释同样的server_id为什么会被kill,因为一旦注册上去,就会现删除相同server_id的Slave线程,然后把当前的Slave加入,这是因为有时Slave断开了,重新请求上来,当然需要踢掉原来的线程,这就是线程重连机制。

切记,一个MySQL集群中,绝不可以出现相同server_id的实例,否则各种诡异的问题可是接踵而来。

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

MySQL多个Slave同一server_id的冲突原因分析

MySQL多个Slave同一server_id的冲突原因分析:本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/database/mysql_multi_slave_same_serverid.html 今天分析一个诡异问题,一个模拟Slave线程的程序,不断
推荐度:
标签: id 原因 多个
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top