mysql heartbeat_更改/etc/init.d/mysql,让HeartBeat只是监控MYSQL的状态

基于HA在发生切换时,都会做STOP本机资源,然后再START对方的资源。

我们的实际环境中有两个资源:

一个是IPaddr,用来管理VIP;

一个是mysql, 用来管理MYSQL资源;

在实际的应用过程中,我们发现MYSQL一下子关不掉(flush dirty pages),或启动需要很长时间(recovery).这样也就大大延长了HA切换的时间。

所以我们在想,是不是可以让HA只管理MYSQL的状态,而不管理MYSQL的启动与STOP呢?[@more@]

我们知道,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') --&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是正常的!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值