MySQLMHA重要配置-创新互联
1、集群信息
站在用户的角度思考问题,与客户深入沟通,找到东宁网站设计与东宁网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站设计、成都网站制作、企业官网、英文网站、手机端网站、网站推广、申请域名、网络空间、企业邮箱。业务覆盖东宁地区。[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 es32、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.com7、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_server8、遇到问题
[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]#原因:文件多了一个空行,这个错误我犯了好多次,哎……
[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]#另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
分享文章:MySQLMHA重要配置-创新互联
本文路径:http://hbruida.cn/article/gpjoj.html