共計 4300 個字符,預(yù)計需要花費 11 分鐘才能閱讀完成。
這篇文章主要介紹了如何更改 /etc/init.d/mysql 并讓 HeartBeat 只是監(jiān)控 MYSQL 的狀態(tài),具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。
基于 HA 在發(fā)生切換時,都會做 STOP 本機資源,然后再 START 對方的資源。
我們的實際環(huán)境中有兩個資源:
一個是 IPaddr, 用來管理 VIP;
一個是 mysql, 用來管理 MYSQL 資源;
在實際的應(yīng)用過程中,我們發(fā)現(xiàn) MYSQL 一下子關(guān)不掉(flush dirty pages), 或啟動需要很長時間(recovery). 這樣也就大大延長了 HA 切換的時間。
所以我們在想,是不是可以讓 HA 只管理 MYSQL 的狀態(tài),而不管理 MYSQL 的啟動與 STOP 呢?
我們知道,HA 管理 lsb 類型的資源時,是調(diào)用 /etc/init.d/ 或者./resource.d/ 目錄下的該資源相關(guān)命令加參數(shù) start/stop/status.
比如,有 mysql 資源,
啟動 mysql: service mysql start
停止 mysql: service mysql stop
狀態(tài) 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 不能響應(yīng)查詢, 我們把狀態(tài)也置為 FAILED.
(如果 10 秒鐘內(nèi)臨時文件 mysql.`date +%Y%m%d%H%M%S`.$MYSQLPID 存在,并且里面的內(nèi)容必須為 aliyun.mysql , 那么 MYSQL 是正常的。)
如果上面的條件成立, MYSQL 處于無響應(yīng)狀態(tài), 程序還會寫信息到文件:/home/mysql/aliyun.mysql
HEARTBEAT 如果檢查到 MYSQL 失敗了. 會 Stop/Start mysql 資源 N 次(N 是根據(jù) cib.xml 的配置來定的),
在重啟過程中, 我們讓 stop/start 狀態(tài)直接返回 0。不去真正的關(guān)閉或啟動 mysql。
這樣做是為了讓下次 MYSQL 檢測狀態(tài)時直接返回錯誤。可以快速切換。
所以在 /etc/init.d/mysql 中我們還需要改幾個地方:
0) 把原來 mysql 的參數(shù) 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
關(guān)閉 mysql: service mysql stopdown
狀態(tài) mysql: service mysql status
service mysql start/stop
這兩個語句則啥事都不干了,就發(fā)個信息給你!
小結(jié):
這樣做了以后,不管 HEARTBEAT 怎么重啟 / 關(guān)閉,只會對 VIP 有影響。不會對 MYSQL 來直接操作。
一方面,不會因為 HEARTBEAT 工作不正常而影響 MYSQL;
另一方面,可以讓 HEARTBEAT 切換更快(因為節(jié)省啟動和關(guān)閉 MYSQL 的時間)
但這樣做有一個小缺點就是:
在 HEARTBEAT 啟動時,不會自動啟動 MYSQL。
HEARTBEAT 在啟動后會發(fā)現(xiàn) MYSQL 是失效的。然后會發(fā)生切換。
所以你必須保證在 HEARTBEAT 啟動前,至少有一個 NODE 的 MYSQL STATUS 是正常的!
感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“如何更改 /etc/init.d/mysql 并讓 HeartBeat 只是監(jiān)控 MYSQL 的狀態(tài)”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關(guān)注丸趣 TV 行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!