• HeartBeat启动关闭mysqld服务的脚本修改


    基于HA在发生切换时,都会做STOP本机资源,然后再START对方的资源。
    我们的实际环境中有两个资源:
    一个是IPaddr,用来管理VIP;
    一个是mysql, 用来管理MYSQL资源;
    在实际的应用过程中,我们发现MYSQL一下子关不掉(flush dirty pages),或启动需要很长时间(recovery).这样也就大大延长了HA切换的时间。
    所以我们在想,是不是可以让HA只管理MYSQL的状态,而不管理MYSQL的启动与STOP呢?
    我们知道,HA管理lsb类型的资源时,是调用/etc/init.d/或者./resource.d/ 目录下的该资源相关命令加参数start/stop/status.
    比如,有mysql资源,
    启动mysql: service mysql start
    停止mysql: service mysql stop
    状态mysql: service mysql status
    为了达到目的,我们可以修改SHELL脚本:/etc/init.d/mysql
    ====================================
    ‘status’)
    # First, check to see if pid file exists
    if test -s “$server_pid_file” ; then
    read mysqld_pid < $server_pid_file
    if kill -0 $mysqld_pid 2>/dev/null ; then
    log_success_msg “MySQL running ($mysqld_pid)”
    exit 0
    else
    log_failure_msg “MySQL is not running, but PID file exists”
    exit 1
    fi
    else
    # Try to find appropriate mysqld process
    mysqld_pid=`pidof $sbindir/mysqld`
    if test -z $mysqld_pid ; then
    if test “$use_mysqld_safe” = “0″ ; then
    lockfile=/var/lock/subsys/mysqlmanager
    else
    lockfile=/var/lock/subsys/mysql
    fi
    if test -f $lockfile ; then
    log_failure_msg “MySQL is not running, but lock exists”
    exit 2
    fi
    log_failure_msg “MySQL is not running”
    exit 3
    else
    log_failure_msg “MySQL is running but PID file could not be found”
    exit 4
    fi
    fi
    ;;
    ====================================>>>>
    这一段改为:
    ================================================================
    ‘status’)
    # First, check to see if pid file exists
    if test -s “$server_pid_file” ; then
    read mysqld_pid < $server_pid_file
    if kill -0 $mysqld_pid 2>/dev/null ; then
    # ————————————————— Modi-1
    . /root/.bash_profile
    MYSQLPID=$$
    STAT_FILE=/home/mysql/mysql.`date +%Y%m%d%H%M%S`.$MYSQLPID
    mysql -uroot -h127.0.0.1 -s -e “select \”aliyun.mysql\” ;” > $STAT_FILE 2>&1 &
    CNT=1
    MYSQLSTATUS=UNKNOWN
    while [ "$MYSQLSTATUS" = "UNKNOWN" ]
    do
    if test -f $STAT_FILE
    then
    read CONTENT < $STAT_FILE
    if [ "$CONTENT" = "aliyun.mysql" ]
    then
    MYSQLSTATUS=OK
    log_success_msg “MySQL running ($mysqld_pid)”
    \rm -f $STAT_FILE
    exit 0
    elif [ "$CONTENT" != "" ]; then
    ERROR_CNT=`grep -i “error” $STAT_FILE | grep -v “using password” | wc -l`
    if [ "$ERROR_CNT" -ge "1" ];then
    log_failure_msg “MySQL status Warning in logfile $STAT_FILE ”
    fi
    exit 0
    fi
    fi
    sleep $CNT
    CNT=`expr $CNT + 2`
    if [ $CNT -gt 5 ]; then
    MYSQLSTATUS=ERROR
    log_failure_msg “MySQL running ($mysqld_pid),But no respond”
    echo “ERROR: MySQL running ($mysqld_pid),But no respond” >> /var/log/messages
    exit 1
    fi
    done
    #————————————————— /Modi-1
          else
    log_failure_msg “MySQL is not running, but PID file exists”
    exit 1
    fi
    else
    # Try to find appropriate mysqld process
    mysqld_pid=`pidof $sbindir/mysqld`
    if test -z $mysqld_pid ; then
    if test “$use_mysqld_safe” = “0″ ; then
    lockfile=/var/lock/subsys/mysqlmanager
    else
    lockfile=/var/lock/subsys/mysql
    fi
    if test -f $lockfile ; then
    log_failure_msg “MySQL is not running, but lock exists”
    exit 2
    fi
    log_failure_msg “MySQL is not running”
    exit 3
    else
    log_failure_msg “MySQL is running but PID file could not be found”
    exit 4
    fi
    fi
    ;;
    ============================================================
    以上的改动, 意思是运行service msyql status 的时候,
    如果主机HANG住了,MYSQL进程还在,但MYSQL不能响应查询, 我们把状态也置为FAILED.
    (如果10秒钟内临时文件mysql.`date +%Y%m%d%H%M%S`.$MYSQLPID 存在,并且里面的内容必须为”aliyun.mysql”,那么MYSQL是正常的。)
    如果上面的条件成立, MYSQL处于无响应状态, 程序还会写信息到文件:/home/mysql/aliyun.mysql
    HEARTBEAT 如果检查到MYSQL失败了.会Stop/Start mysql 资源N次(N是根据cib.xml的配置来定的),
    在重启过程中,我们让stop/start状态直接返回0。不去真正的关闭或启动mysql。
    这样做是为了让下次MYSQL检测状态时直接返回错误。可以快速切换。
    所以在/etc/init.d/mysql中我们还需要改几个地方:
    0) 把原来mysql的参数start/stop 改成 startup/stopdown
    ‘start’)  –>   ‘startup’)
    ‘stop’)   –>   ‘stopdown’)
    1)新加 start 段
    ===========================================
    ‘start’)
    # Start daemon
    log_success_msg “Mysql Start failed with /etc/init.d/mysql in HA Mode !”
    exit 0
    ;;
    ===========================================
    2) 新加 stop 段
    ===========================================
    ‘stop’)
    # Stop daemon.
    log_success_msg “Mysql Stop failed with /etc/init.d/mysql in HA Mode !”
    exit 0
    ;;
    ===========================================
    测试:
    启动mysql: service mysql startup
    关闭mysql: service mysql stopdown
    状态mysql: service mysql status
    service mysql start/stop
    这两个语句则啥事都不干了,就发个信息给你!
    小结:
    这样做了以后,不管HEARTBEAT怎么重启/关闭,只会对VIP有影响。不会对MYSQL来直接操作。
    一方面,不会因为HEARTBEAT工作不正常而影响MYSQL;
    另一方面,可以让HEARTBEAT切换更快(因为节省启动和关闭MYSQL的时间)但这样做有一个小缺点就是:
    在HEARTBEAT启动时,不会自动启动MYSQL。
    HEARTBEAT在启动后会发现MYSQL是失效的。然后会发生切换。
    所以你必须保证在HEARTBEAT启动前,至少有一个NODE的MYSQL STATUS是正常的!
    以上脚本已经在linux rhel5.3 , Heartbeat 2.1.4环境上测试成功。
  • 相关阅读:
    JSP学习
    Maven
    Android开发环境搭建
    Java Spring MVC
    you don't know js -- Scope and Closures学习笔记——第五章(闭包) 下篇
    you don't know js -- Scope and Closures学习笔记——第五章(闭包) 上篇
    you don't know js -- Scope and Closures学习笔记——第四章(声明提升 Hoisting)
    you don't know js -- Scope and Closures学习笔记——第三章(函数VS块作用域)
    you don't know js -- Scope and Closures学习笔记——第二章(词法作用域)
    you don't know js -- Scope and Closures学习笔记——第一章(什么是作用域)
  • 原文地址:https://www.cnblogs.com/ylqmf/p/2217540.html
Copyright © 2020-2023  润新知