MySQLMHA重要配置

1、集群信息

10年积累的网站设计制作、成都网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有港口免费网站建设让你可以放心的选择与我们合作。

[root@es3 local]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.56.14 es1
192.168.56.15 es2
192.168.56.16 es3

2、MySQL配置:

[root@es3 local]# grep -v ^# /etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

server_id = 3
log-bin=mysqlbin
binlog_format = row
log_slave_updates = 1

enforce_gtid_consistency = ON
gtid_mode = ON

slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON

rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 1000
rpl_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_failover

master_ip_online_change_script= /usr/local/bin/master_ip_online_change

report_script=/usr/local/bin/send_report

shutdown_script=/usr/local/bin/power_manager
user=repl 
password=123456
ssh_user=root 
manager_workdir=/data/manager
remote_workdir=/tmp
repl_user=repl 
repl_password=123456 
secondary_check_script=masterha_secondary_check -s 192.168.56.16 -s 192.168.56.15
[server1] 
hostname=es1
port=3306 
 
[server2] 
hostname=es2
port=3306 
[server3] 
hostname=es3
port=3306 
[root@es3 ~]#

4、master_ip_failover脚本

#!/usr/bin/env perl
use 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 IP
my $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 perl
use 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/bash

echo `hostname`   `hostname -i` >> mail.txt

echo `date` >mail.txt


echo "the mha has been switched" >>mail.txt

mail -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 NAME

Main purpose of this command is node fencing so that split brain never happens.

=head1 SYNOPSIS

# power off

power_manager --command=stop --host=master_server

# killing mysqld and mysqld_safe at first. If not successful, forcing power off

power_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 instance

power_manager --command=stopssh --host=master_server --ssh_user=root --pid_file=/var/lib/mysql/mysqld.pid

# power on

power_manager --command=start --host=master_server

# checking power status

power_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 = 1
Tue 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:enabled
Tue Aug 20 10:45:30 2019 - [info]     GTID ON
Tue 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:enabled
Tue Aug 20 10:45:30 2019 - [info]     GTID ON
Tue 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]#

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

        MySQL MHA 重要配置

MySQL MHA 重要配置

[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 = 1
Tue 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:enabled
Tue Aug 20 10:49:25 2019 - [info]     GTID ON
Tue 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:enabled
Tue Aug 20 10:49:25 2019 - [info]     GTID ON
Tue 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]#

当前名称:MySQLMHA重要配置
网站路径:http://hbruida.cn/article/ggpdos.html