MySQLの自動負荷検知&再起動のスクリプト組んでみた
これも必要にかられて。。。。
週末プログラマだと平日会社に要るときに異常があって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的な観点でいうともっと簡素に書けやって感じなんですが
取り急ぎなスクリプトなのでもうこれでいいや。。。
そんな感じです。