zoukankan      html  css  js  c++  java
  • MHA 实现VIP切换用到脚本

    在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 " IN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip=== ";
         
        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 " *************************************************************** ";
                    print "Disabling the VIP - $vip on old master: $orig_master_host ";
                    print "*************************************************************** ";
        &stop_vip();
                    $exit_code = 0;
                };
                if ($@) {
                    warn "Got Error: $@ ";
                    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 " *************************************************************** ";
                    print "Enabling the VIP - $vip on new master: $new_master_host ";
                    print "*************************************************************** ";
        &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 ";
                `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 ";
        }



    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 " IN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip=== ";
         
        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 " *************************************************************** ";
                    print "Disabling the VIP - $vip on old master: $orig_master_host ";
                    print "*************************************************************** ";
        &stop_vip();
                    $exit_code = 0;
                };
                if ($@) {
                    warn "Got Error: $@ ";
                    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 " *************************************************************** ";
                    print "Enabling the VIP - $vip on new master: $new_master_host ";
                    print "*************************************************************** ";
        &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 ";
                `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 ";
        }



    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 " *************************************************************** "
           echo -e "Disabling the VIP - $vip on old master: $orig_master_host "
           $stop_vip
           if [ $? -eq 0 ]
              then
              echo "Disabled the VIP successfully"
           else
              echo "Disabled the VIP failed"
           fi
           echo -e "*************************************************************** "
        fi
         
        if [ $command = 'start' -o $command = 'status' ]
           then
           echo -e " *************************************************************** "
           echo -e "Enabling the VIP - $vip on new master: $new_master_host "
           $start_vip
           if [ $? -eq 0 ]
              then
              echo "Enabled the VIP successfully"
           else
              echo "Enabled the VIP failed"
           fi
           echo -e "*************************************************************** "
        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 主从切换成功 master:$orig_master_host --> $new_master_host $body 当前从库:$new_slave_hosts" | mutt
         -s "MySQL实例宕掉,MHA $subject 切换成功" -- 94097532@qq.com
        else
            echo -e "MHA $subject 主从切换失败 master:$orig_master_host --> $new_master_host $body" | mutt -s "MySQL实例宕掉,MHA $subje
        ct 切换失败" -- 94097532@qq.com
        fi





    ---------------------
    作者:常飞梦
    来源:CSDN
    原文:https://blog.csdn.net/lichangzai/article/details/50503960
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    12/21
    和寶寶在一起3/10
    11/23
    c#windows应用程序窗体间传值
    用OWC做统计图
    javascript 创建字典
    .NetCom双向数据交换的实现(RecordSet与.Net DataSet的转化)
    JScript 方法 indexOf 方法
    详尽解析window.event对象
    Window.Open详解
  • 原文地址:https://www.cnblogs.com/zping/p/9908685.html
Copyright © 2011-2022 走看看