更改/etc/init.d/mysql,讓HeartBeat只是監控MYSQL的狀態

Steven1981發表於2009-11-24

基於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是正常的!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/703656/viewspace-1029003/,如需轉載,請註明出處,否則將追究法律責任。

相關文章