semi-sync原主库加入集群阻塞问题分析

  

  <强>
  <人力资源/>   

  
  

  

  

  前段时间支持客户处理问题的时候,发现一个semi-sync复制主从切换原主人加入集群时,复制同步阻塞,无法继续同步数据的问题,非常有参考意义,整理一下,供大家参考。   

  
  问题现象   
  

  客户在一个一主两从的半同步复制环境下做了手工切换,然后尝试把原主库加入集群中,结果发现新集群中的数据一直无法同步到奴隶(原主库)中来,查看奴隶(原主库)同步状态,IO线程和SQL线程都是是的状态,但是Seconds_Behind_Master大于0。   

  <前>         <李类=" 10 ">      李      <李类=" L1 ">      李      <李类=" L2 ">      李      <李类=" L3 ">      李      <李类=" L4 ">      李      <李类=" L5 ">      李      <李类="社会">      李      <李类=耙种啤?      李      <李类=?8”>      李      <李类=" L9 ">      李      <李类=" 10 ">      李      <李类=" L1 ">      李      <李类=" L2 ">      李      <李类=" L3 ">      李      <李类=" L4 ">      李      <李类=" L5 ">      李      <李类="社会">      李      <李类=耙种啤?      李         之前   

  查看显示processlist状态,发现SQL线程一直处于等待semi-sync ACK从奴隶状态,可是这个奴隶(原主库)下已经没有从库了。为什么还需要等待奴隶返回的ACK呢?   

  <前>         <李类=" 10 ">      李      <李类=" L1 ">      李      <李类=" L2 ">      李      <李类=" L3 ">      李      <李类=" L4 ">      李      <李类=" L5 ">      李      <李类="社会">      李      <李类=耙种啤?      李      <李类=?8”>      李         之前   
  问题分析   
  

  从SQL线程等待的的半同步问题出发,先查看semi-sync状态和设置   

  <前>         <李类=" 10 ">      李      <李类=" L1 ">      李      <李类=" L2 ">      李      <李类=" L3 ">      李      <李类=" L4 ">      李      <李类=" L5 ">      李      <李类="社会">      李      <李类=耙种啤?      李      <李类=?8”>      李      <李类=" L9 ">      李      <李类=" 10 ">      李      <李类=" L1 ">      李      <李类=" L2 ">      李      <李类=" L3 ">      李      <李类=" L4 ">      李      <李类=" L5 ">      李      <李类="社会">      李      <李类=耙种啤?      李      <李类=?8”>      李      <李类=" L9 ">      李      <李类=" 10 ">      李         之前   

  通过上面semi-sync的状态变量,可以发现semi-sync运行状态Rpl_semi_sync_master_status=, Rpl_semi_sync_slave_status=U饫镒钇婀值氖荝pl_semi_sync_master_status=?   

  

  根据半同步复制原理:主库发生数据变更写binlog,然后等待从库接收并返回ACK,最后在存储引擎层提交数据。这也就是为什么在从库(原主库)一直查不到新主库变更后的数据原因。在默认情况下,半同步复制只有在等待ACK超出rpl_semi_sync_master_timeout设置的时间才会自动降为异步复制。   

  

  这里奴隶(原主库)被认为是半同步的主人,但是没有从库连接他,所以一直在等待从库返回的ACK。等待的时间我们查看rpl_semi_sync_master_timeout变量取的值   

  <前>         <李类=" 10 ">      李      <李类=" L1 ">      李

semi-sync原主库加入集群阻塞问题分析