千家信息网

MySQL MHA 重要配置

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,1、集群信息[root@es3 local]# cat /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localho
千家信息网最后更新 2025年01月21日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]#


时间 服务器 模式 缓存 脚本 要是 邻居 更新 服务 命令 信息 错误 配置 原因 文件 空行 符号 语法 问题 集群 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 绿书签行动手抄报网络安全 软件开发技术服务合同简单版 北京物流软件开发流程 软件开发项目的成本构成 怎么查询服务器能承受多少访问量 公司产品涵盖软件开发和硬件设备 北京软件开发者小程序 网络安全包括 两个部分 软件开发的分析技术 个人彩票软件开发制定 无法将数据库数据放进数列 外卖点餐管理系统数据库 即墨区软件开发系统 违反网络安全管理制度的规定 自主手机软件开发 服务器dld什么意思 服务器搭建软件 上海中通网络技术服务有限公司 iis服务器 管理软件 网络安全学习心得一句话 服务器安全狗能防挖矿 windows是什么数据库 公司产品涵盖软件开发和硬件设备 js怎么判断数据库的空字段 互联网大会顶级科技 数据库中的记录源如何选择两个 软件开发用户关系树 服务器的管理员密码设置 高新区网络安全宣讲 百站网络技术有限公司
0