千家信息网

MySQL MHA 重要配置

发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,1、集群信息[root@es3 local]# cat /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localho
千家信息网最后更新 2024年11月11日MySQL MHA 重要配置

1、集群信息

[root@es3 local]# cat /etc/hosts127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4::1         localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.56.14 es1192.168.56.15 es2192.168.56.16 es3

2、MySQL配置:

[root@es3 local]# grep -v ^# /etc/my.cnf[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.socksymbolic-links=0log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pidserver_id = 3log-bin=mysqlbinbinlog_format = rowlog_slave_updates = 1enforce_gtid_consistency = ONgtid_mode = ONslave-parallel-type=LOGICAL_CLOCKslave-parallel-workers=16master_info_repository=TABLErelay_log_info_repository=TABLErelay_log_recovery=ONrpl_semi_sync_master_enabled = 1rpl_semi_sync_master_timeout = 1000rpl_semi_sync_slave_enabled = 1[root@es3 local]#

3、app1.cnf信息

[root@es3 ~]# cat app1.cnf [server default] master_ip_failover_script=/usr/local/bin/master_ip_failovermaster_ip_online_change_script= /usr/local/bin/master_ip_online_changereport_script=/usr/local/bin/send_reportshutdown_script=/usr/local/bin/power_manageruser=repl password=123456ssh_user=root manager_workdir=/data/managerremote_workdir=/tmprepl_user=repl repl_password=123456 secondary_check_script=masterha_secondary_check -s 192.168.56.16 -s 192.168.56.15[server1] hostname=es1port=3306  [server2] hostname=es2port=3306 [server3] hostname=es3port=3306 [root@es3 ~]#

4、master_ip_failover脚本

#!/usr/bin/env perluse strict;use warnings FATAL => 'all'; use Getopt::Long; my (    $command,          $ssh_user,        $orig_master_host, $orig_master_ip,    $orig_master_port, $new_master_host, $new_master_ip,    $new_master_port); my $vip = '192.168.56.191/24';  # Virtual IPmy $key = "1";my $ssh_start_vip = "/sbin/ifconfig enp0s8:$key $vip";my $ssh_stop_vip = "/sbin/ifconfig enp0s8:$key down";#my $ssh_Bcast_arp = "arping -c 3 -A 192.168.56.191";   #ARP回复模式,更新邻居。要是不加则服务器会自动等到vip缓存失效,期间VIP会有一定时间的不可用。my $ssh_Bcast_arp = "arping -c 3 -A 192.168.56.191 -I enp0s8";   #ARP回复模式,更新邻居。要是不加则服务器会自动等到vip缓存失效,期间VIP会有一定时间的不可用$ssh_user = "root"; GetOptions(    'command=s'          => \$command,    'ssh_user=s'         => \$ssh_user,    'orig_master_host=s' => \$orig_master_host,    'orig_master_ip=s'   => \$orig_master_ip,    'orig_master_port=i' => \$orig_master_port,    'new_master_host=s'  => \$new_master_host,    'new_master_ip=s'    => \$new_master_ip,    'new_master_port=i'  => \$new_master_port,); exit &main(); sub main {     print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";     if ( $command eq "stop" || $command eq "stopssh" ) {         my $exit_code = 1;        eval {            print "Disabling the VIP on old master: $orig_master_host \n";            &stop_vip();            $exit_code = 0;        };        if ($@) {            warn "Got Error: $@\n";            exit $exit_code;        }        exit $exit_code;    }    elsif ( $command eq "start" ) {         my $exit_code = 10;        eval {            print "Enabling the VIP - $vip on the new master - $new_master_host \n";            &start_vip();            &start_arp();            $exit_code = 0;        };        if ($@) {            warn $@;            exit $exit_code;        }        exit $exit_code;    }    elsif ( $command eq "status" ) {        print "Checking the Status of the script.. OK \n";        exit 0;    }    else {        &usage();        exit 1;    }} sub start_vip() {    `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;}sub start_arp() {    `ssh $ssh_user\@$new_master_host \" $ssh_Bcast_arp \"`;}sub stop_vip() {     return 0  unless  ($ssh_user);    `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;} sub usage {    print    "Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";}

5、master_ip_online_change脚本

#!/usr/bin/env perluse strict;  use warnings FATAL =>'all';    use Getopt::Long;    my $vip = '192.168.56.191/24';  # Virtual IP  my $key = "1";  my $ssh_start_vip = "/sbin/ifconfig enp0s8:$key $vip";  my $ssh_stop_vip = "/sbin/ifconfig enp0s8:$key down";  my $exit_code = 0;  my $ssh_Bcast_arp = "arping -c 3 -A 192.168.56.191 -I enp0s8";   #ARP回复模式,更新邻居。要是不加则服务器会自动等到vip缓存失效,期间VIP会有一定时间的不可用。  my (    $command,              $orig_master_is_new_slave, $orig_master_host,    $orig_master_ip,       $orig_master_port,         $orig_master_user,    $orig_master_password, $orig_master_ssh_user,     $new_master_host,    $new_master_ip,        $new_master_port,          $new_master_user,    $new_master_password,  $new_master_ssh_user,  );  GetOptions(    'command=s'                => \$command,    'orig_master_is_new_slave' => \$orig_master_is_new_slave,    'orig_master_host=s'       => \$orig_master_host,    'orig_master_ip=s'         => \$orig_master_ip,    'orig_master_port=i'       => \$orig_master_port,    'orig_master_user=s'       => \$orig_master_user,    'orig_master_password=s'   => \$orig_master_password,    'orig_master_ssh_user=s'   => \$orig_master_ssh_user,    'new_master_host=s'        => \$new_master_host,    'new_master_ip=s'          => \$new_master_ip,    'new_master_port=i'        => \$new_master_port,    'new_master_user=s'        => \$new_master_user,    'new_master_password=s'    => \$new_master_password,    'new_master_ssh_user=s'    => \$new_master_ssh_user,  );    #my $ssh_Bcast_arp = "arping -c 3 -A 192.168.56.191";   #ARP回复模式,更新邻居。要是不加则服务器会自动等到vip缓存失效,期间VIP会有一定时间的不可用。  exit &main();    sub main {    #print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";    if ( $command eq "stop" || $command eq "stopssh" ) {            # $orig_master_host, $orig_master_ip, $orig_master_port are passed.          # If you manage master ip address at global catalog database,          # invalidate orig_master_ip here.          my $exit_code = 1;          eval {              print "\n\n\n***************************************************************\n";              print "Disabling the VIP - $vip on old master: $orig_master_host\n";              print "***************************************************************\n\n\n\n";  &stop_vip();              $exit_code = 0;          };          if ($@) {              warn "Got Error: $@\n";              exit $exit_code;          }          exit $exit_code;  }  elsif ( $command eq "start" ) {            # all arguments are passed.          # If you manage master ip address at global catalog database,          # activate new_master_ip here.          # You can also grant write access (create user, set read_only=0, etc) here.  my $exit_code = 10;          eval {              print "\n\n\n***************************************************************\n";              print "Enabling the VIP - $vip on new master: $new_master_host \n";              print "***************************************************************\n\n\n\n";  &start_vip();  &start_arp();            $exit_code = 0;          };          if ($@) {              warn $@;              exit $exit_code;          }          exit $exit_code;  }  elsif ( $command eq "status" ) {          print "Checking the Status of the script.. OK \n";          `ssh $orig_master_ssh_user\@$orig_master_host \" $ssh_start_vip \"`;          exit 0;  }  else {  &usage();          exit 1;  }  }    # A simple system call that enable the VIP on the new master  sub start_vip() {  `ssh $new_master_ssh_user\@$new_master_host \" $ssh_start_vip \"`;  }  sub start_arp() {    `ssh $new_master_ssh_user\@$new_master_host \" $ssh_Bcast_arp \"`;}# A simple system call that disable the VIP on the old_master  sub stop_vip() {  `ssh $orig_master_ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;  }    sub usage {  print  "Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";  }

6、report_script脚本

#!/bin/bashecho `hostname`   `hostname -i` >> mail.txtecho `date` >mail.txtecho "the mha has been switched" >>mail.txtmail -s "the mha has been switched on `hostname -i` " xxxxxxx@163.com 

7、power_manager 防止脑裂脚本

#!/usr/bin/env perl#  Copyright (C) 2011 DeNA Co.,Ltd.##  This program is free software; you can redistribute it and/or modify#  it under the terms of the GNU General Public License as published by#  the Free Software Foundation; either version 2 of the License, or#  (at your option) any later version.##  This program is distributed in the hope that it will be useful,#  but WITHOUT ANY WARRANTY; without even the implied warranty of#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the#  GNU General Public License for more details.##  You should have received a copy of the GNU General Public License#   along with this program; if not, write to the Free Software#  Foundation, Inc.,#  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA## Note: This is a sample script and is not complete. Modify the script based on your environment.use strict;use warnings FATAL => 'all';use Getopt::Long;use Pod::Usage;use Net::Telnet;use MHA::ManagerConst;use MHA::ManagerUtil;my $SSH_STOP_OK           = 10;my $COMMAND_NOT_SUPPORTED = 20;my $ILO_ADMIN             = 'Administrator';my $DRAC_ADMIN            = 'root';my $PASSWORD              = 'xxx';my $max_retries           = 10;exit &main();sub get_power_status_drac_internal {  my $telnet = shift;  my $prompt = shift;  $telnet->print("racadm serveraction powerstatus");  ($_) = $telnet->waitfor($prompt);  my $power_state = "void";  my @cmd_out     = split /\n/;  # discard command sent to DRAC  $_ = shift @cmd_out;  #strip ansi control chars  s/\e\[(([0-9]+;)*[0-9]+)*[ABCDfHJKmsu]//g;  s/^.*\x0D//;  foreach (@cmd_out) {    s/^\s+//g;    s/\s+$//g;    if (m/^Server power status: (\w+)/) {      $power_state = lc($1);      last;    }  }  return $power_state;}sub power_off_drac_internal {  my $telnet = shift;  my $prompt = shift;  $telnet->print("racadm serveraction powerdown");  $telnet->waitfor($prompt);}sub power_on_drac_internal {  my $telnet = shift;  my $prompt = shift;  $telnet->print("racadm serveraction powerup");  $telnet->waitfor($prompt);}sub login_drac_internal {  my $drac_addr = shift;  my $prompt    = '/admin1|\$/';  my $telnet    = new Net::Telnet(    Timeout => 10,    Prompt  => $prompt,  );  $telnet->open($drac_addr);  $telnet->waitfor('/login/i');  $telnet->print($DRAC_ADMIN);  $telnet->waitfor('/password/i');  $telnet->print($PASSWORD);  $telnet->waitfor($prompt);  return ( $telnet, $prompt );}sub power_off_drac {  my $drac_addr    = shift;  my $power_status = "void";  local $@;  eval {    my ( $telnet, $prompt ) = login_drac_internal($drac_addr);    power_off_drac_internal( $telnet, $prompt );    $power_status = get_power_status_drac_internal( $telnet, $prompt );    $telnet->close;  };  if ($@) {    warn $@;  }  return $power_status;}sub power_on_drac {  my $drac_addr    = shift;  my $power_status = "void";  local $@;  eval {    my ( $telnet, $prompt ) = login_drac_internal($drac_addr);    power_on_drac_internal( $telnet, $prompt );    $power_status = get_power_status_drac_internal( $telnet, $prompt );    $telnet->close;  };  if ($@) {    warn $@;  }  return $power_status;}sub power_status_drac {  my $drac_addr    = shift;  my $power_status = "void";  local $@;  eval {    my ( $telnet, $prompt ) = login_drac_internal($drac_addr);    $power_status = get_power_status_drac_internal( $telnet, $prompt );    $telnet->close;  };  if ($@) {    warn $@;  }  return $power_status;}sub power_status_ilo {  my $ilo_addr     = shift;  my $power_status = "void";  local $@;  eval {    my $ipmi_out =`ipmitool -H $ilo_addr -U $ILO_ADMIN -P $PASSWORD -I lanplus  power status`;    die"Failed to get power status from ipmitool. Maybe you need to upgrade ILO firmware version.\n"      if ($?);    chomp($ipmi_out);    if ( $ipmi_out =~ m/^Chassis Power is (\w+)/ ) {      $power_status = lc($1);    }  };  if ($@) {    warn $@;  }  return $power_status;}sub power_on_ilo {  my $ilo_addr     = shift;  my $power_status = "void";  local $@;  eval {    $power_status = power_status_ilo($ilo_addr);    if ( $power_status ne "off" ) {      die "Power from ipmitool is already on.\n" if ( $power_status eq "on" );      return $power_status;    }    `ipmitool -H $ilo_addr -U $ILO_ADMIN -P $PASSWORD -I lanplus  power on`;    $power_status = power_status_ilo($ilo_addr);  };  if ($@) {    warn $@;  }  return $power_status;}sub power_off_ilo {  my $ilo_addr     = shift;  my $power_status = "void";  local $@;  eval {    $power_status = power_status_ilo($ilo_addr);    if ( $power_status ne "on" ) {      die "Power from ipmitool is already off.\n" if ( $power_status eq "off" );      return $power_status;    }    `ipmitool -H $ilo_addr -U $ILO_ADMIN -P $PASSWORD -I lanplus  power off`;    $power_status = power_status_ilo($ilo_addr);  };  if ($@) {    warn $@;  }  return $power_status;}sub get_power_status {  my ( $admin_addr, $server_type ) = @_;  my $power_status = "void";  if ( $server_type eq "ilo" ) {    $power_status = power_status_ilo($admin_addr);  }  elsif ( $server_type eq "drac" ) {    $power_status = power_status_drac($admin_addr);  }  return $power_status;}sub stop {  my ( $real_host, $admin_addr, $server_type ) = @_;  my $power_status = "void";  if ( $server_type eq "ilo" ) {    $power_status = power_off_ilo($admin_addr);  }  elsif ( $server_type eq "drac" ) {    $power_status = power_off_drac($admin_addr);  }  if ( $power_status eq "off" ) {    print "Power of $real_host was successfully turned off.\n";    return 0;  }  elsif ( $power_status ne "on" ) {    return $COMMAND_NOT_SUPPORTED;  }  my $retry_count = 0;  while ( $retry_count < $max_retries ) {    $power_status = get_power_status( $admin_addr, $server_type );    last if ( $power_status eq "off" );    print"Waiting until power status becomes 'off'. Current status is $power_status ...\n";    sleep 3;    $retry_count++;  }  if ( $power_status eq "off" ) {    print "Power of $real_host was successfully turned off.\n";    return 0;  }  else {    print      "Power of $real_host was not turned off. Check the host for detail.\n";    return 1;  }}sub stopssh {  my ( $ssh_user, $real_host, $real_ip, $pid_file ) = @_;  my $ssh_user_host = $ssh_user . '@';  if ($real_ip) {    $ssh_user_host .= $real_ip;  }  else {    $ssh_user_host .= $real_host;  }  my $command;  my ( $high_ret, $low_ret );  if ($pid_file) {    $command ="\"if [ ! -e $pid_file ]; then exit 1; fi; pid=\\\`cat $pid_file\\\`; rm -f $pid_file; kill -9 \\\$pid; a=\\\`ps ax | grep $pid_file | grep -v grep | wc | awk {'print \\\$1'}\\\`; if [ \"a\\\$a\" = \"a0\" ]; then exit 10; fi; sleep 1; a=\\\`ps ax | grep $pid_file | grep -v grep | wc | awk {'print \\\$1'}\\\`; if [ \"a\\\$a\" = \"a0\" ]; then exit 10; else exit 1; fi\"";    ( $high_ret, $low_ret ) = MHA::ManagerUtil::exec_system(      "ssh $ssh_user_host $MHA::ManagerConst::SSH_OPT_CHECK $command");    if ( $high_ret == $SSH_STOP_OK && $low_ret == 0 ) {      print "ssh reachable. mysqld stopped. power off not needed.\n";      return $high_ret;    }    print "Killing mysqld instance based on $pid_file failed.\n";  }  print "Killing all mysqld instances on $real_host..\n";  $command ="\"killall -9 mysqld mysqld_safe; a=\\\`pidof mysqld\\\`; if [ \\\"a\\\$a\\\" = \\\"a\\\" ]; then exit 10; fi; sleep 1; a=\\\`pidof mysqld\\\`; if [ \\\"a\\\$a\\\" = \\\"a\\\" ]; then exit 10; else exit 1; fi\"";  ( $high_ret, $low_ret ) = MHA::ManagerUtil::exec_system(    "ssh $ssh_user_host $MHA::ManagerConst::SSH_OPT_CHECK $command");  if ( $high_ret == $SSH_STOP_OK && $low_ret == 0 ) {    print "ssh reachable. mysqld stopped. power off not needed.\n";    return $high_ret;  }  else {    print      "ssh NOT reachable. Power off needed (rc1=$high_ret, rc2=$low_ret).\n";    return 1;  }}sub start {  my ( $real_host, $admin_addr, $server_type ) = @_;  my $power_status = "void";  if ( $server_type eq "ilo" ) {    $power_status = power_on_ilo($admin_addr);  }  elsif ( $server_type eq "drac" ) {    $power_status = power_on_drac($admin_addr);  }  if ( $power_status eq "on" ) {    print "Power of $real_host was successfully turned on.\n";    return 0;  }  elsif ( $power_status ne "off" ) {    return $COMMAND_NOT_SUPPORTED;  }  my $retry_count = 0;  while ( $power_status ne "on" && $retry_count < $max_retries ) {    $power_status = get_power_status( $admin_addr, $server_type );    last if ( $power_status eq "on" );    print"Waiting until power status becomes 'on'. Current status is $power_status ...\n";    sleep 3;    $retry_count++;  }  if ( $power_status eq "on" ) {    print "Power of $real_host was successfully turned on.\n";    return 0;  }  else {    print "Power of $real_host was not turned on. Check the host for detail.\n";    return 1;  }}sub status {  my ( $real_host, $admin_addr, $server_type ) = @_;  my $power_status = get_power_status( $admin_addr, $server_type );  print "Current power status on $real_host : $power_status\n";  if ( $power_status eq "on" ) {    return 0;  }  elsif ( $power_status eq "off" ) {    return 0;  }  else {    return $COMMAND_NOT_SUPPORTED;  }}# If ssh is reachable and mysqld process does not exist, exit with 2 and# do not power off. If ssh is not reachable, do power off and exit with 0# if successful. Otherwise exit with 1.sub main {  my ( $command, $ssh_user, $host, $ip, $port, $pid_file, $help );  GetOptions(    'command=s'  => \$command,    'ssh_user=s' => \$ssh_user,    'host=s'     => \$host,    'ip=s'       => \$ip,    'port=i'     => \$port,    'pid_file=s' => \$pid_file,    'help'       => \$help,  );  if ($help) {    pod2usage(0);  }  pod2usage(1) unless ($command);  my $rc            = 1;  my $ssh_stop_fail = 0;  if ( $command eq "stopssh" || $command eq "stopssh3" ) {    pod2usage(1) unless ($ssh_user);    pod2usage(1) unless ($host);    $rc = stopssh( $ssh_user, $host, $ip, $pid_file );    if ( $rc == $SSH_STOP_OK ) {      exit $rc;    }    else {      exit 1 if ( $command eq "stopssh3" );      $ssh_stop_fail = 1;    }  }  # Get server type (ilo/drac, etc) and administrative IP address.  my ( $admin_addr, $server_type ) = FIXME_xxx( $host, $ip );  if ( $command eq "start" ) {    $rc = start( $host, $admin_addr, $server_type );  }  elsif ( $command eq "stop" || $ssh_stop_fail ) {    $rc = stop( $host, $admin_addr, $server_type );  }  elsif ( $command eq "status" ) {    $rc = status( $host, $admin_addr, $server_type );  }  else {    pod2usage(1);  }  # Do other way to stop host  if ( $rc == $COMMAND_NOT_SUPPORTED ) {    $rc = FIXME_xxx( $command, $host, $ip );  }  if ( $rc == 0 ) {    exit 0;  }  else {    exit 1;  }}#############################################################################=head1 NAMEMain purpose of this command is node fencing so that split brain never happens.=head1 SYNOPSIS# power offpower_manager --command=stop --host=master_server# killing mysqld and mysqld_safe at first. If not successful, forcing power offpower_manager --command=stopssh --host=master_server --ssh_user=root# killing mysqld and mysqld_safe. If not successful, just exit.power_manager --command=stopssh3 --host=master_server --ssh_user=root# killing mysqld with specified pid file. This is useful when you run multiple MySQL instances and want to stop only specified instancepower_manager --command=stopssh --host=master_server --ssh_user=root --pid_file=/var/lib/mysql/mysqld.pid# power onpower_manager --command=start --host=master_server# checking power statuspower_manager --command=status --host=master_server

8、遇到问题

[root@es3 bin]# masterha_check_repl --conf=/root/app1.cnf Tue Aug 20 10:45:29 2019 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.Tue Aug 20 10:45:29 2019 - [info] Reading application default configuration from /root/app1.cnf..Tue Aug 20 10:45:29 2019 - [info] Reading server configuration from /root/app1.cnf..Tue Aug 20 10:45:29 2019 - [info] MHA::MasterMonitor version 0.58.Tue Aug 20 10:45:30 2019 - [info] GTID failover mode = 1Tue Aug 20 10:45:30 2019 - [info] Dead Servers:Tue Aug 20 10:45:30 2019 - [info] Alive Servers:Tue Aug 20 10:45:30 2019 - [info]   es1(192.168.56.14:3306)Tue Aug 20 10:45:30 2019 - [info]   es2(192.168.56.15:3306)Tue Aug 20 10:45:30 2019 - [info]   es3(192.168.56.16:3306)Tue Aug 20 10:45:30 2019 - [info] Alive Slaves:Tue Aug 20 10:45:30 2019 - [info]   es2(192.168.56.15:3306)  Version=5.7.24-log (oldest major version between slaves) log-bin:enabledTue Aug 20 10:45:30 2019 - [info]     GTID ONTue Aug 20 10:45:30 2019 - [info]     Replicating from 192.168.56.14(192.168.56.14:3306)Tue Aug 20 10:45:30 2019 - [info]   es3(192.168.56.16:3306)  Version=5.7.24-log (oldest major version between slaves) log-bin:enabledTue Aug 20 10:45:30 2019 - [info]     GTID ONTue Aug 20 10:45:30 2019 - [info]     Replicating from es1(192.168.56.14:3306)Tue Aug 20 10:45:30 2019 - [info] Current Alive Master: es1(192.168.56.14:3306)Tue Aug 20 10:45:30 2019 - [info] Checking slave configurations..Tue Aug 20 10:45:30 2019 - [info]  read_only=1 is not set on slave es2(192.168.56.15:3306).Tue Aug 20 10:45:30 2019 - [info]  read_only=1 is not set on slave es3(192.168.56.16:3306).Tue Aug 20 10:45:30 2019 - [info] Checking replication filtering settings..Tue Aug 20 10:45:30 2019 - [info]  binlog_do_db= , binlog_ignore_db= Tue Aug 20 10:45:30 2019 - [info]  Replication filtering check ok.Tue Aug 20 10:45:30 2019 - [info] GTID (with auto-pos) is supported. Skipping all SSH and Node package checking.Tue Aug 20 10:45:30 2019 - [info] Checking SSH publickey authentication settings on the current master..Tue Aug 20 10:45:31 2019 - [info] HealthCheck: SSH to es1 is reachable.Tue Aug 20 10:45:31 2019 - [info] es1(192.168.56.14:3306) (current master) +--es2(192.168.56.15:3306) +--es3(192.168.56.16:3306)Tue Aug 20 10:45:31 2019 - [info] Checking replication health on es2..Tue Aug 20 10:45:31 2019 - [info]  ok.Tue Aug 20 10:45:31 2019 - [info] Checking replication health on es3..Tue Aug 20 10:45:31 2019 - [info]  ok.Tue Aug 20 10:45:31 2019 - [info] Checking master_ip_failover_script status:Tue Aug 20 10:45:31 2019 - [info]   /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=es1 --orig_master_ip=192.168.56.14 --orig_master_port=3306 /usr/local/bin/master_ip_failover:行3: use: 未找到命令/usr/local/bin/master_ip_failover:行4: use: 未找到命令/usr/local/bin/master_ip_failover:行6: use: 未找到命令/usr/local/bin/master_ip_failover:行8: 未预期的符号 `newline' 附近有语法错误/usr/local/bin/master_ip_failover:行8: `my ('Tue Aug 20 10:45:31 2019 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln229]  Failed to get master_ip_failover_script status with return code 2:0.Tue Aug 20 10:45:31 2019 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations.  at /usr/bin/masterha_check_repl line 48.Tue Aug 20 10:45:31 2019 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.Tue Aug 20 10:45:31 2019 - [info] Got exit code 1 (Not master dead).MySQL Replication Health is NOT OK![root@es3 bin]#

原因:文件多了一个空行,这个错误我犯了好多次,哎……

[root@es3 bin]# masterha_check_repl --conf=/root/app1.cnf Tue Aug 20 10:49:24 2019 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.Tue Aug 20 10:49:24 2019 - [info] Reading application default configuration from /root/app1.cnf..Tue Aug 20 10:49:24 2019 - [info] Reading server configuration from /root/app1.cnf..Tue Aug 20 10:49:24 2019 - [info] MHA::MasterMonitor version 0.58.Tue Aug 20 10:49:25 2019 - [info] GTID failover mode = 1Tue Aug 20 10:49:25 2019 - [info] Dead Servers:Tue Aug 20 10:49:25 2019 - [info] Alive Servers:Tue Aug 20 10:49:25 2019 - [info]   es1(192.168.56.14:3306)Tue Aug 20 10:49:25 2019 - [info]   es2(192.168.56.15:3306)Tue Aug 20 10:49:25 2019 - [info]   es3(192.168.56.16:3306)Tue Aug 20 10:49:25 2019 - [info] Alive Slaves:Tue Aug 20 10:49:25 2019 - [info]   es2(192.168.56.15:3306)  Version=5.7.24-log (oldest major version between slaves) log-bin:enabledTue Aug 20 10:49:25 2019 - [info]     GTID ONTue Aug 20 10:49:25 2019 - [info]     Replicating from 192.168.56.14(192.168.56.14:3306)Tue Aug 20 10:49:25 2019 - [info]   es3(192.168.56.16:3306)  Version=5.7.24-log (oldest major version between slaves) log-bin:enabledTue Aug 20 10:49:25 2019 - [info]     GTID ONTue Aug 20 10:49:25 2019 - [info]     Replicating from es1(192.168.56.14:3306)Tue Aug 20 10:49:25 2019 - [info] Current Alive Master: es1(192.168.56.14:3306)Tue Aug 20 10:49:25 2019 - [info] Checking slave configurations..Tue Aug 20 10:49:25 2019 - [info]  read_only=1 is not set on slave es2(192.168.56.15:3306).Tue Aug 20 10:49:25 2019 - [info]  read_only=1 is not set on slave es3(192.168.56.16:3306).Tue Aug 20 10:49:25 2019 - [info] Checking replication filtering settings..Tue Aug 20 10:49:25 2019 - [info]  binlog_do_db= , binlog_ignore_db= Tue Aug 20 10:49:25 2019 - [info]  Replication filtering check ok.Tue Aug 20 10:49:25 2019 - [info] GTID (with auto-pos) is supported. Skipping all SSH and Node package checking.Tue Aug 20 10:49:25 2019 - [info] Checking SSH publickey authentication settings on the current master..Tue Aug 20 10:49:26 2019 - [info] HealthCheck: SSH to es1 is reachable.Tue Aug 20 10:49:26 2019 - [info] es1(192.168.56.14:3306) (current master) +--es2(192.168.56.15:3306) +--es3(192.168.56.16:3306)Tue Aug 20 10:49:26 2019 - [info] Checking replication health on es2..Tue Aug 20 10:49:26 2019 - [info]  ok.Tue Aug 20 10:49:26 2019 - [info] Checking replication health on es3..Tue Aug 20 10:49:26 2019 - [info]  ok.Tue Aug 20 10:49:26 2019 - [info] Checking master_ip_failover_script status:Tue Aug 20 10:49:26 2019 - [info]   /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=es1 --orig_master_ip=192.168.56.14 --orig_master_port=3306 IN SCRIPT TEST====/sbin/ifconfig enp0s8:1 down==/sbin/ifconfig enp0s8:1 192.168.56.191/24===Checking the Status of the script.. OK Tue Aug 20 10:49:26 2019 - [info]  OK.Tue Aug 20 10:49:26 2019 - [info] Checking shutdown script status:Tue Aug 20 10:49:26 2019 - [info]   /usr/local/bin/stop_report --command=status --ssh_user=root --host=es1 --ip=192.168.56.14 Tue Aug 20 10:49:26 2019 - [info]  OK.Tue Aug 20 10:49:26 2019 - [info] Got exit code 0 (Not master dead).MySQL Replication Health is OK.[root@es3 bin]#


0