中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

【MySQL】MHA源代碼之主庫選取(二)

發布時間:2020-08-08 21:08:04 來源:ITPUB博客 閱讀:151 作者:風塵_NULL 欄目:MySQL數據庫

MHA 選舉主庫所維護的數組

在講MHA選擇 master的代碼中,我們必須把維護的四個數組的來龍去脈講清楚

(1) Alive_slaves 數組 :

server不是 master,且從庫正常, latest數組中的 server有足夠的中繼日志恢復這個落后的從庫 (追上主庫 ),則放入這個 Alive_slaves的數組中 (此段代碼在 ServerManager.pminit_servers函數 )

    if ( $server->{dead} ) {
      $self->add_dead_server($server);
    }
    elsif ( $server->{unmanaged} ) {
      $self->add_unmanaged_slave($server);
    }
    #不是dead或者unmanaged就加入alive_server數組,如果show slave status 不是返回0E0,且這個server不是原來的主庫,并且sql線程無誤且可以用中繼日志來恢復,就加入alive_slave數據,否則加入failed——slave數組
    else {
      $self->add_alive_server($server);
      if ( $server->{not_slave} eq '0' && !$server->{orig_master} ) {
        if ( !$server->is_sql_thread_error() && !$server->{lack_relay_log} ) {
          $self->add_alive_slave($server);
        }
        else {
          $self->add_failed_slave($server);
        }
      }
}

(2)Latest 數組

alive_slaves數組中選取 relaylog最新的 server,這個數組如果有多個 server,serverRead_master_log_pos,master_log_file一定相等(此段代碼在 ServerManager.pmidentify_latest_slaves函數)

 

 my @slaves = $self->get_alive_slaves();
  my @latest = ();
  foreach (@slaves) {
    my $a = $latest[0]{Master_Log_File};
    my $b = $latest[0]{Read_Master_Log_Pos};
    if (
      #find_oldest=0,即我們取的最全relaylog的slave,至于這里為什么是數組,是因為有最新的relaylog的不只有一個,可能有多個((即數組里邊邊的slave,具有一樣的Read_Master_Log_     Pos位置))
      !$find_oldest
      && (
           ( !$a && !defined($b) )
        || ( $_->{Master_Log_File} gt $latest[0]{Master_Log_File} )
        || ( ( $_->{Master_Log_File} ge $latest[0]{Master_Log_File} )
          && $_->{Read_Master_Log_Pos} > $latest[0]{Read_Master_Log_Pos} )
      )
      )
    {
      @latest = ();
      push( @latest, $_ );
}

(3)Perf 數組

這個無需多解釋,就是MHA配置文件中配置了 candidate_master的值,這個可以大于 1

(4)Bad 數組: ( 代碼見: ServerManager.pm:get_bad_candidate_masters)

1) 檢測有故障的server

2) MHA 配置文件設置了 no_master server

3)log_bin 沒有打開的server

4) 版本不兼容的server (高版本復制到低版本是沒問題的,但是如果低版本的選為為主庫,嘿嘿)

5) 復制落后太多的server

MHA 主庫的選舉

(1) 指定主庫切換的,優先級最高(通常這是在手動切換)

(2) 如果server latest 數組中,且在 perf 數組中,則優先返回

(3) 如果server alive_servers 數組中,且在 perf 數組中,則優先返回

(4) 如果server lastest 中,則優先返回

(5) 如果server alive_servers 中,則返回

(6) 否則選舉失敗

這里優先級為1->6,具體實現在 (ServerManager.pm: select_new_master)

sub select_new_master {
  my $self                    = shift;
  my $prio_new_master_host    = shift;
  my $prio_new_master_port    = shift;
  my $check_replication_delay = shift;
  $check_replication_delay = 1 if ( !defined($check_replication_delay) );
 
  my $log    = $self->{logger};
  my @latest = $self->get_latest_slaves();
  my @slaves = $self->get_alive_slaves();
 
  my @pref = $self->get_candidate_masters();
  my @bad =
    $self->get_bad_candidate_masters( $latest[0], $check_replication_delay );
  #切換指定了master,即優先級最高的
  if ( $prio_new_master_host && $prio_new_master_port ) {
    my $new_master =
      $self->get_alive_server_by_hostport( $prio_new_master_host,
      $prio_new_master_port );
    if ($new_master) {
      my $a = $self->get_server_from_by_id( \@bad, $new_master->{id} );
      unless ($a) {
        $log->info("$prio_new_master_host can be new master.");
        return $new_master;
      }
      else {
        $log->error("$prio_new_master_host is bad as a new master!");
        return;
      }
    }
    else {
      $log->error("$prio_new_master_host is not alive!");
      return;
    }
  }
 
  $log->info("Searching new master from slaves..");
  $log->info(" Candidate masters from the configuration file:");
  $self->print_servers( \@pref );
  $log->info(" Non-candidate masters:");
  $self->print_servers( \@bad );
  #如果perf(candidate_master沒設置)以及沒有不符合(主從延遲,版本等)的slave,并且lastest[0]設置有優先級的話,就返回
  return $latest[0]
    if ( $#pref < 0 && $#bad < 0 && $latest[0]->{latest_priority} );
  #如果設置了優先級,則從lastest數組中選擇是canidate_master的,有就返回(隱含lastest[0]優先,如果lastest[0]同時是canidate_master,那肯定是優先返回的)
  #latest_priority默認設置為1
  if ( $latest[0]->{latest_priority} ) {
    $log->info(
" Searching from candidate_master slaves which have received the latest relay log events.."
    ) if ( $#pref >= 0 );
    foreach my $h (@latest) {
      foreach my $p (@pref) {
        if ( $h->{id} eq $p->{id} ) {
          return $h
            if ( !$self->get_server_from_by_id( \@bad, $p->{id} ) );
        }
      }
    }
    $log->info("  Not found.") if ( $#pref >= 0 );
  }
 
  #new master is not latest
  #這里選擇的是candidate_master,單不是latest數組中的master
  $log->info(" Searching from all candidate_master slaves..")
    if ( $#pref >= 0 );
  foreach my $s (@slaves) {
    foreach my $p (@pref) {
      if ( $s->{id} eq $p->{id} ) {
        my $a = $self->get_server_from_by_id( \@bad, $p->{id} );
        return $s unless ($a);
      }
    }
  }
  $log->info("  Not found.") if ( $#pref >= 0 );
  #其次是優先在lastest數組中,但不在candidate_master中的
  if ( $latest[0]->{latest_priority} ) {
    $log->info(
" Searching from all slaves which have received the latest relay log events.."
    );
    foreach my $h (@latest) {
      my $a = $self->get_server_from_by_id( \@bad, $h->{id} );
      return $h unless ($a);
    }
    $log->info("  Not found.");
  }
 
  # none of latest servers can not be a master
  $log->info(" Searching from all slaves..");
  foreach my $s (@slaves) {
    my $a = $self->get_server_from_by_id( \@bad, $s->{id} );
    return $s unless ($a);
  }
  $log->info("  Not found.");
 
  return;
}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东明县| 遂溪县| 吉木萨尔县| 邓州市| 连平县| 文登市| 阜城县| 湾仔区| 大田县| 新闻| 德令哈市| 忻州市| 航空| 高州市| 江津市| 和林格尔县| 百色市| 绥德县| 右玉县| 沭阳县| 汕头市| 平凉市| 措勤县| 台中县| 泽普县| 泸定县| 昌都县| 马山县| 河曲县| 工布江达县| 东安县| 忻州市| 吉首市| 内丘县| 大新县| 阳曲县| 洱源县| 长子县| 涡阳县| 平安县| 金秀|