github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/deploy/apecloud-mysql/scripts/switchover-without-candidate.sh (about)

     1  #!/bin/bash
     2  set -ex
     3  
     4  if [ ! -z $MYSQL_ROOT_PASSWORD ]; then
     5    password_flag="-p$MYSQL_ROOT_PASSWORD"
     6  fi
     7  global_info=`mysql -h$KB_CONSENSUS_LEADER_POD_FQDN -uroot $password_flag 2>/dev/null -e "select IP_PORT from information_schema.wesql_cluster_global order by MATCH_INDEX desc;"`
     8  global_info_arr=($global_info)
     9  leader_ip_port=$KB_CONSENSUS_LEADER_POD_FQDN:13306
    10  try_times=10
    11  
    12  for((i=1;i<${#global_info_arr[@]};i++)) do
    13    if [ "$leader_ip_port" == "${global_info_arr[i]}" ];then
    14      echo "do not transfer to leader, leader:${global_info_arr[i]}"
    15    else
    16      # get currently leader weight
    17      leader_weight_info=`mysql -h$KB_CONSENSUS_LEADER_POD_FQDN -uroot $password_flag 2>/dev/null -e "select ELECTION_WEIGHT from information_schema.wesql_cluster_global where IP_PORT='$leader_ip_port' limit 1;"`
    18      leader_weight_arr=($leader_weight_info)
    19      leader_weight=${leader_weight_arr[1]}
    20      echo "leader_weight=$leader_weight"
    21  
    22      # get current follower weight
    23      current_follower_weight_info=`mysql -h$KB_CONSENSUS_LEADER_POD_FQDN -uroot $password_flag 2>/dev/null -e "select ELECTION_WEIGHT from information_schema.wesql_cluster_global where IP_PORT='${global_info_arr[i]}' limit 1;"`
    24      current_follower_weight_arr=($current_follower_weight_info)
    25      current_follower_weight=${current_follower_weight_arr[1]}
    26      echo "current_follower_weight=$current_follower_weight"
    27      if [ $current_follower_weight -lt $leader_weight ];then
    28         echo "leader weight larger than follower weight, update leader weight to current follower weight! leader:$leader_ip_port, leader weight:$leader_weight, follower:${global_info_arr[i]}, follower weight:$current_follower_weight"
    29         mysql -h$KB_CONSENSUS_LEADER_POD_FQDN -uroot $password_flag -e "call dbms_consensus.configure_follower('$leader_ip_port', $current_follower_weight, 0);" 2>&1
    30      fi
    31      mysql -h$KB_CONSENSUS_LEADER_POD_FQDN -uroot $password_flag -e "call dbms_consensus.change_leader('${global_info_arr[i]}');" 2>&1
    32      sleep 5
    33      role_info=`mysql -h$KB_CONSENSUS_LEADER_POD_FQDN -uroot $password_flag 2>/dev/null -e "select ROLE from information_schema.wesql_cluster_local;"`
    34      role_info_arr=($role_info)
    35      real_role=${role_info_arr[1]}
    36      if [ "$real_role" == "Follower" ];then
    37        echo "transfer successfully"
    38        new_leader_host_and_port=${global_info_arr[i]}
    39        new_leader_host=${new_leader_host_and_port%%:*}
    40        echo "new_leader_host=$new_leader_host"
    41        break
    42      fi
    43    fi
    44    ((try_times--))
    45    if [ $try_times -le 0 ];then
    46      break
    47    fi
    48  done