如何更改 etc init.d mysql并让HeartBeat只是监控MYSQL的状态
发布时间:2021-12-29 06:18:41 所属栏目:MySql教程 来源:互联网
导读:这篇文章主要介绍了如何更改/etc/init.d/mysql并让HeartBeat只是监控MYSQL的状态,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 基于HA在发生切换时,都会做STOP本机资源,然后再START
这篇文章主要介绍了如何更改/etc/init.d/mysql并让HeartBeat只是监控MYSQL的状态,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 基于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 -h227.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是正常的! 感谢你能够认真阅读完这篇文章,希望小编分享的“如何更改/etc/init.d/mysql并让HeartBeat只是监控MYSQL的状态”这篇文章对大家有帮助。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |