首页 > 学院 > 综合知识 > 正文

MHA源代码之主库采取

2022-07-28 22:40:39
字体:
来源:转载
供稿:网友
        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;

(编辑:错新网)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表