Linux上のMySQLマスター同期監視スクリプトの実装

3145 ワード

前の会社のB 2 BプラットフォームのMySQL私は主従の同期を配合して、いわゆる主従の同期、同じく主従の複製を叫んで、など、主なサーバーの上のデータベースと1台の予備のサーバーの上のデータベースを同期して、主なサーバーのデータの更新はMySQLのbinlogを通じて(通って)サーバーから同期して、主な同期を通じて(通って)またデータベースの読み書きの分離をすることができます会社B 2 Bプラットフォームの業務が非常に少ないため、完全な読み書き分離を行わず、メインデータベースのデータ更新をデータベースから同期させる.このほか、主従双方向同期を行い、サーバからメールサービスを配布し、タスクスキャンテーブルでメールを送信し、メール状態を更新するので、データベースからもこの点を書く操作があるので、主従双方向同期も行いました.配置したばかりの时はあまり考えていませんでしたが、后でいくつかの问题に遭遇しました.例えば、一方が书き込み中に问题が発生して主従が同期して切れました(しかし、この时私はまだ分かりません.会社の业务のお姉さんになぜ引合が少なくなったのかと闻きました.私は急いでデータベースを见てslaveの状态を见て、意外にも何日も切れました.会社の业务量が少ないのは幸いです).それから私は、主従に同期して監視し、自動的に回復し、メールを送るべきだと思っていました.そこで、このブログの由来があり、記録しました.
へへへ、下はシナリオで、実は考え方はとても简単で、MySQLの主従の状态を见てすべてできるべきで、MySQLに入って、それからshow master statusとshow slave statusG、それから私がしなければならないのは実はシナリオのタイミングを通じてMySQLに入ってそれから状态を见て情报を得て、grepとawkを通じてテキストに対して解析を行って、それから肝心なslave_sql_running、slave_io_runningとlast_error、最後に一定のフォーマットでログに印刷します.ps:ネット上でいくつかのシナリオを探して、しかしすべて使うことができなくて、自分でgrepとawkの使い方を学んで、学芸は精巧ではありませんて、間に合わせて使うのはできるべきで、指摘を歓迎します
#!/bin/sh
# monitor_mysql_slave status
ip=192.168.1.191
cmd=/usr/bin/mysql
mysqluser=user
mysqlpwd=password
log=/mnt/b2bhome/log/mysql-monitor/monitor.log
while true
do
  datetime=`date '+%Y-%m-%d %H:%M:%S'`
  # echo $datetime
  array=$($cmd -u$mysqluser -p$mysqlpwd -e "show slave status\G"|grep -iE "_running|last_error")
  # echo $array
  io_running=`echo $array|grep -i slave_io_running|awk '{print $2}'`
  # echo $io_running
  sql_running=`echo $array|grep -i slave_sql_running|awk '{print $2}'`
  # echo $sql_running
  last_error=`echo $array|grep -i last_error|awk '{print $2}'`
  # echo $last_error
  if [ "$io_running" == "Yes" -a "$sql_running" == "Yes" ]
  then
    echo "$datetime | OK | Slave is running!" >> $log
  else
    echo "$datetime | FAIL | Slave is not running!" >> $log
    echo "$datetime | FAIL | $last_error" >> $log
    $cmd -u$mysqluser -p$mysqlpwd -e "stop slave;set global sql_slave_skip_counter=1;start slave;exit;"
    char="$datatime $ip MySQL slave is not running"
    echo "$last_error"|mail -s "$char" 1******[email protected]
    break
  fi
  sleep 20
done

前のip、cmd、mysqluser、mysqlpass、logはすべて定義の定数で、自機ip、mysqlのコマンドディレクトリ、mysqlユーザーパスワード、出力ログファイル、下のshellは先にMySQLに登録して、更にスレーブの状態を照会して、そしてslave_io_running、slave_sql_running、last_errorの値はarray文字列にgrepでarrayをフィルタリングし、-iは大文字と小文字を区別せずに上記のフィールドを含む行をフィルタリングします.このときフィルタリングした結果はKey:Valueの形式で、awkで解析します.print$2は2番目の位置のフィールドを表します.このような特殊な記号は区切り記号とみなされるのでvalueは$2です.これで取れました.最後にslave_io_runningとslave_sql_runningは判断して、二人だけがyesが正常な状態で、okログを出力して、さもなくば、failログを出力して、そしてMySQLに入って、slaveを消して、sql_を設定しますslave_skip_counterは1で、エラーの行binlogをスキップしてslaveを再開し、Linuxシステムのsendmailサービスを呼び出してメールを送信します.ところで、sleep 20は20秒休止し、20秒ごとに実行される.
grepとawkコマンドについては、私も勉強しましたが、その後もメモを書きます.注目すべきは、最後にsendmailサービスを呼び出してメールを送信したが、私はここで成功しなかった.機械hostnameの原因のようだ.その後、ログのみを印刷し、logstashを使ってエラーログを分析してキャプチャした.そして出力プラグインの中のemailを使ってメールを送信します(残念なことに、ここのemailもだめで、qqと163を使っても接続できません.最後に仕方なく第三者のメールサービスだけを使って、curlコマンドで呼び出しを要求して、logstash分析監視ログについて私は後でメモを書きます).