2010年2月18日木曜日

HeartbeatでMySQL止めたらフェイルオーバー(その1)

スズキです。

以下で、Heartbeat&DRBD&MySQLまで実現して、
http://blog.suz-lab.com/2010/02/drbdlinks.html
試しにMySQLが稼動しているマシンで"/etc/init.d/mysqld stop"してみたら、
MySQLがフェールオーバーなどをせず、
Heartbeatが固まったような感じになってしまいました。

で、いろいろ調べたところ、以下のように、
mysqldスクリプトがLSBのルールに違反していたのが原因のようです。
http://blog.suz-lab.com/2010/02/lsb.html

具体的には、MySQLが停止している状態で、
"/etc/init.d/mysqld stop"したら、本来は終了ステータスが"0"でないといけないのが
"1"になってしまっていたということです。

なので、以下のようにstop関数の、最後の"ret=1"と代入している部分を、
"ret=0"と修正することで、対応してみました。

--------【mysqld】--------
...
stop(){
  MYSQLPID=`cat "$mypidfile" 2>/dev/null `
  if [ -n "$MYSQLPID" ]; then
    /bin/kill "$MYSQLPID" >/dev/null 2>&1
    ret=$?
    if [ $ret -eq 0 ]; then
      STOPTIMEOUT=60
      while [ $STOPTIMEOUT -gt 0 ]; do
        /bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
        sleep 1
        let STOPTIMEOUT=${STOPTIMEOUT}-1
      done
      if [ $STOPTIMEOUT -eq 0 ]; then
        echo "Timeout error occurred trying to stop MySQL Daemon."
        ret=1
        action $"Stopping $prog: " /bin/false
      else
        rm -f /var/lock/subsys/mysqld
        rm -f "$socketfile"
        action $"Stopping $prog: " /bin/true
      fi
    else
      action $"Stopping $prog: " /bin/false
    fi
  else
    ret=0
    action $"Stopping $prog: " /bin/false
  fi
  return $ret
}
...
--------

この状態で、再度、Heartbeatが起動している状態で、稼動しているMySQLを停止させると、
「無事、フェイルオーバー!」と思いきや、
そうではなく、同じマシンでMySQLが再度起動してしまいました。
(本当はもう一方のマシンにフェイルオーバーしたいのですが...)

ということで、もう一方のマシンへのフェイルオーバーは、「その2」です。

--------
http://www.suz-lab.com

0 コメント: