更改/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') --> 'startup')
'stop') --> '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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql 的一個監控指令碼,監控heartbeatMySql指令碼
- mysql mon 的一個監控指令碼,監控heartbeatMySql指令碼
- MySQL MHA 執行狀態監控MySql
- MySQL執行狀態監控(pt-mysql-summary)MySql
- 配置CACTI監控MySQL資料庫狀態(5)增加MySQL監控模板MySql資料庫
- 7. 監控MySQL主從狀態MySql
- Galera Cluster for MySQL監控狀態說明MySql
- Shell指令碼監控MySQL主從狀態指令碼MySql
- 巧用Zabbix自定義監控Mysql效能狀態MySql
- MySQL監控SQL狀態及命中率MySql
- zabbix應用-監控mysql slave 主從狀態MySql
- 【Mysql】指定/etc/init.d/mysql載入的配置檔案MySql
- Mysql 主從延時監控(pt-heartbeat)詳解MySql
- mysql主從同步(4)-Slave延遲狀態監控MySql主從同步
- 專案實戰:zabbix監控MySQL狀態、服務資訊MySql
- 配置CACTI監控MySQL資料庫狀態(4)配置cactiMySql資料庫
- 配置CACTI監控MySQL資料庫狀態(1)準備工作MySql資料庫
- 配置CACTI監控MySQL資料庫狀態(3)配置apache模組MySql資料庫Apache
- 自己開發的MYMON工具監控MYSQL執行狀態幫助文件MySql
- Elastic 使用Heartbeat監測服務執行狀態AST
- 監控Nginx的工作狀態Nginx
- MySQL監控工具MySql
- MySQL監控--zabbixMySql
- cacti監控mysqlMySql
- memcached的執行狀態監控
- 資料庫效能大揭秘:玩轉MySQL監控指標狀態變數資料庫MySql指標變數
- linux heartbeat mysqlLinuxMySql
- Nginx服務狀態監控Nginx
- MySQL監控利器-InnotopMySql
- MySQL監控工具-orztopMySql
- MySQL監控工具-orzdbaMySql
- mysql監控指令碼MySql指令碼
- Mysql 監控系統MySql
- Mysql監控快速指南MySql
- MySQL sys效能監控MySql
- 【MySQL】second behind master不準確的處理(監控主從延遲) pt-heartbeatMySqlAST
- Nagios使用check_mysql監控mysqliOSMySql
- Docker 之 執行狀態監控Docker