文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

这篇文章主要介绍了如何更改/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') --&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是正常的!

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯