読者です 読者をやめる 読者になる 読者になる

Hina-Mode

とある呑んだくれエンジニアの気が向いた時に書く戯言

MySQLの自動負荷検知&再起動のスクリプト組んでみた

Linux

これも必要にかられて。。。。
週末プログラマだと平日会社に要るときに異常があってDB死んだりしたら即終了(というか実際に起きたんですが)なので、
取り急ぎやばそうだった
LA、メモリ利用量、スレッド数
の3点をチェックし、超えていたら再起動をかけてやむなきを得(れたらいいな)るようにしてみました。
参考までに下に内容を載せておきます。

#!/bin/bash

#setting
mailto="hoge@fuga.com"
sbj="From db load monitoring tool."

# limitation num
thread_limit=150
la_limit=10
mem_limit=16

# common function
send_mail() {
  from=$1
  to=$2
  inputEncoding="utf-8"
  outputEncoding="iso-2022-jp"
  subjectHead="=?${outputEncoding}?B?"
  subjectBody="`echo "$3" | iconv -f ${inputEncoding} -t ${outputEncoding} | base64 | tr -d '\n'`"
  subjectTail="?="
  subject=${subjectHead}${subjectBody}${subjectTail}
  contents="`echo -e $4 | iconv -f ${inputEncoding} -t ${outputEncoding}`"
  echo "$contents" | mail -s "$subject" "$to" -- -f "$from"
  return $?
}


thread=`echo "show global status like 'Threads_connected%';" | ~/bin/mysql_connect.sh | grep connected | cut -f2`
ret=`echo "${thread} > ${thread_limit}" | bc`
if [ ${ret} -eq 1 ]; then
  send_mail "$mailto" "$mailto" "$sbj" "too many connection. mysql will be restart automatically."
  /etc/init.d/mysqld restart
  exit
fi

la=`uptime | sed -e "s/.\+load average: //g" | cut -f1 -d" " | cut -f1 -d","`
ret=`echo "${la} > ${la_limit}" | bc`
if [ ${ret} -eq 1 ]; then
  send_mail "$mailto" "$mailto" "$sbj" "load average is over. mysql will be restart automatically."
  /etc/init.d/mysqld restart
  exit
fi

mem=`free | grep Mem: | sed -e "s/ \+/\t/g" | cut -f3 | xargs -i ksh -c 'echo "scale=2;{}/1024/1024" | bc'`
ret=`echo "${mem} > ${mem_limit}" | bc`
if [ ${ret} -eq 1 ]; then
  send_mail "$mailto" "$mailto" "$sbj" "memory using rate is 50% over. mysql will be restart automatically."
  /etc/init.d/mysqld restart
  exit
fi

DRY的な観点でいうともっと簡素に書けやって感じなんですが
取り急ぎなスクリプトなのでもうこれでいいや。。。

そんな感じです。