如何更改/etc/init.d/mysql并让HeartBeat只是监控MYSQL的状态

57次阅读
没有评论

共计 4300 个字符,预计需要花费 11 分钟才能阅读完成。

这篇文章主要介绍了如何更改 /etc/init.d/mysql 并让 HeartBeat 只是监控 MYSQL 的状态,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。

基于 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 ) — gt startup )
stop ) — gt 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 是正常的!

感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“如何更改 /etc/init.d/mysql 并让 HeartBeat 只是监控 MYSQL 的状态”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-27发表,共计4300字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)