MHA 实现VIP切换用到脚本

来源:这里教程网 时间:2026-03-01 11:12:35 作者:

在MHA Manager端配置中,如果实现MHA的vip故障切换需要在配置文件/etc/masterha/app1/app1.cnf 中启用下面三个参数:

master_ip_failover_script= /etc/masterha/app1/master_ip_failover   #master failover时执行 #shutdown_script= /etc/masterha/power_manager report_script= /etc/masterha/app1/send_report    #master failover时执行 master_ip_online_change_script=/etc/masterha/app1/master_ip_online_change   #master switchover时执行 MHA配置见: http://blog.csdn.net/lichangzai/article/details/50470771

脚本具体内容如下:

master_ip_failover(perl)脚本

[root@host8 app1]# cat 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 = '10.1.5.21/24';  # Virtual IP my $key = "1"; my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip"; my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down"; my $exit_code = 0;   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" ) {           # $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();             $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 $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 $ssh_user\@$new_master_host \" $ssh_start_vip \"`; } # A simple system call that disable the VIP on the old_master sub stop_vip() { `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=po rt –new_master_host=host –new_master_ip=ip –new_master_port=port\n"; }

master_ip_online_change(perl)脚本

[root@host8 app1]# cat master_ip_online_change #!/usr/bin/env perl use strict; use warnings FATAL =>'all';   use Getopt::Long;   my $vip = '10.1.5.21/24';  # Virtual IP my $key = "1"; my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip"; my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down"; my $exit_code = 0;   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, );     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();             $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 \"`; } # 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=po rt –new_master_host=host –new_master_ip=ip –new_master_port=port\n"; }

master_ip_online_change(shell)脚本

# 以下是重用写的master_ip_online_change(shell) 脚本 [root@host8 app1]# cat master_ip_online_change.sh #/bin/bash source /root/.bash_profile   vip=`echo '10.1.5.21/24'`  # Virtual IP key=`echo '1'`   command=`echo "$1" | awk -F = '{print $2}'` orig_master_host=`echo "$2" | awk -F = '{print $2}'` new_master_host=`echo "$7" | awk -F = '{print $2}'` orig_master_ssh_user=`echo "${12}" | awk -F = '{print $2}'` new_master_ssh_user=`echo "${13}" | awk -F = '{print $2}'`   stop_vip=`echo "ssh root@$orig_master_host /sbin/ifconfig  eth0:$key  down"` start_vip=`echo "ssh root@$new_master_host /sbin/ifconfig  eth0:$key  $vip"`   if [ $command = 'stop' ]    then    echo -e "\n\n\n***************************************************************\n"    echo -e "Disabling the VIP - $vip on old master: $orig_master_host\n"    $stop_vip    if [ $? -eq 0 ]       then       echo "Disabled the VIP successfully"    else       echo "Disabled the VIP failed"    fi    echo -e "***************************************************************\n\n\n\n" fi   if [ $command = 'start' -o $command = 'status' ]    then    echo -e "\n\n\n***************************************************************\n"    echo -e "Enabling the VIP - $vip on new master: $new_master_host \n"    $start_vip    if [ $? -eq 0 ]       then       echo "Enabled the VIP successfully"    else       echo "Enabled the VIP failed"    fi    echo -e "***************************************************************\n\n\n\n" fi

send_report(shell)脚本

[root@host8 app1]# cat send_report #/bin/bash source /root/.bash_profile   orig_master_host=`echo "$1" | awk -F = '{print $2}'` new_master_host=`echo "$2" | awk -F = '{print $2}'` new_slave_hosts=`echo "$3" | awk -F = '{print $2}'` subject=`echo "$4" | awk -F = '{print $2}'` body=`echo "$5" | awk -F = '{print $2}'`   #判断日志结尾是否有successfully,有则表示切换成功,成功与否都发邮件。 tac /etc/masterha/app1/manager.log | sed -n 2p | grep 'successfully' > /dev/null if [ $? -eq 0 ]     then     echo -e "MHA $subject 主从切换成功\n master:$orig_master_host --> $new_master_host \n $body \n 当前从库:$new_slave_hosts" | mutt  -s "MySQL实例宕掉,MHA $subject 切换成功" -- 94097532@qq.com else     echo -e "MHA $subject 主从切换失败\n master:$orig_master_host --> $new_master_host \n $body" | mutt -s "MySQL实例宕掉,MHA $subje ct 切换失败" -- 94097532@qq.com fi

相关推荐