国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 課堂 > 基礎知識 > 正文

MHA源代碼之主庫采取

2024-09-12 20:29:54
字體:
來源:轉載
供稿:網友
        MHA源代碼之主庫選取:

一 、MHA 選舉主庫所維護的數組
      在講MHA選擇 master的代碼中,我們必須把維護的四個數組的來龍去脈講清楚
 
(1) Alive_slaves 數組 :
       server不是 master,且從庫正常, latest數組中的 server有足夠的中繼日志恢復這個落后的從庫 (追上主庫 ),則放入這個 Alive_slaves的數組中 (此段代碼在 ServerManager.pm: init_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,則 server的 Read_master_log_pos,master_log_file一定相等(此段代碼在 ServerManager.pm: identify_latest_slaves函數)
 
(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;
 
  # 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;

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 普安县| 西乌珠穆沁旗| 普宁市| 东方市| 疏勒县| 尼勒克县| 阿勒泰市| 西昌市| 海门市| 呼和浩特市| 安多县| 尚义县| 兴安盟| 修水县| 兰考县| 永仁县| 洛浦县| 海盐县| 安乡县| 波密县| 临朐县| 凌源市| 麻栗坡县| 泸溪县| 沅江市| 乌什县| 乌苏市| 咸阳市| 汉中市| 泾阳县| 鄂托克前旗| 汽车| 苍溪县| 苏尼特右旗| 南充市| 虹口区| 察雅县| 汉沽区| 五台县| 响水县| 江达县|