bns techlog

Skrypt sprawdzający stan replikacji baz MySQL

Niedawno sytuacja wymusiła na mnie potrzebę monitorowania statusu replikacji baz danych MySQL, a że lubię automatyzować sobie pracę i nie marnować jej na powtarzalne rzeczy, powstał mechanizm robiący to za mnie :)

Poniżej przepis na zaadoptowanie tego u siebie.

Dla celów przykładowych mamy tak skonfigurowane środowisko:

Adres IP serwera „Master„: 192.168.1.11
Adres IP serwera „Slave„: 192.168.2.22

Replikujemy MySQL z Master na Slave.

Skrypt sprawdzający stan replikacji będzie uruchamiał się o 7:00 w każdy poniedziałek na Master oraz wysyłał mail ze statusem (zawsze, nawet jak będzie wszystko OK).

Tworzymy użytkownika sprawdzającego stan

W konsoli MySQL na Master wydajemy polecenie

GRANT REPLICATION CLIENT ON *.* TO 'check-repl'@'localhost' IDENTIFIED BY PASSWORD 'SuperTajneHaslo';

adekwatnie na Slave

GRANT REPLICATION CLIENT ON *.* TO 'check-repl'@'192.168.1.11' IDENTIFIED BY PASSWORD 'SuperTajneHaslo';

Piszemy skrypt

Poniższy kod zapisujemy do pliku check-mysql-repl.sh, np. do lokalizacji /root/bin/check-mysql-repl.sh

#!/bin/bash
# ==============================================
#
# Skrypt sprawdzajacy stan replikacji MySQL
#   version: 0.1
#    author: lukasz/at/banasiak.me
#
# CHANGELOG
#  0.1 - init
#
# ==============================================
# variables
mysql_username=check-repl
mysql_password="SuperTajneHaslo"
master=localhost
slave=192.168.2.22
logfile="/tmp/check-mysql-repl.txt"
email_subject="[status] MySQL replication"
email_to="alerts@example.com"
email_from="mysql-repl-notice@example.com"
# log
exec 3>&1                         # tworzy pipe (kopie stdout)
exec 1>$logfile                   # przekazanie stdout do pliku
exec 2>&1                         # stderr
# Log File
master_Log_File=$(mysql -Bse "show master status\G" -u ${mysql_username} -p${mysql_password} -h $master | grep File | awk '{ print $2 }';)
slave_Log_File=$(mysql -Bse "show slave status\G" -u ${mysql_username} -p${mysql_password} -h $slave | grep "\ Master_Log_File" | awk '{ print $2 }';)
# Log Position
master_Log_Position=$(mysql -Bse "show master status\G" -u ${mysql_username} -p${mysql_password} -h $master | grep Position | awk '{ print $2 }';)
slave_Log_Position=$(mysql -Bse "show slave status\G" -u ${mysql_username} -p${mysql_password} -h $slave | grep Read_Master_Log_Pos | awk '{ print $2 }';)
# IO Running
slave_Slave_IO_Running=$(mysql -Bse "show slave status\G" -u ${mysql_username} -p${mysql_password} -h $slave | grep Slave_IO_Running | awk '{ print $2 }';)
# SQL Running
slave_Slave_SQL_Running=$(mysql -Bse "show slave status\G" -u ${mysql_username} -p${mysql_password} -h $slave | grep Slave_SQL_Running | awk '{ print $2 }';)
echo "Master: $master"
echo "Slave : $slave"
echo "Date  : `date "+%F %k:%M:%S"`"
echo "-------------------------------------------";
echo "Master Log File : $master_Log_File"
echo "Slave Log File  : $slave_Log_File"
echo ""
echo "Master Log Position : $master_Log_Position"
echo "Slave Log Position  : $slave_Log_Position"
echo ""
echo "Slave_IO_Running  : $slave_Slave_IO_Running"
echo "Slave_SQL_Running : $slave_Slave_SQL_Running"
echo "-------------------------------------------";
if [ "$master_Log_File" == "$slave_Log_File" ] && [ "$master_Log_Position" == "$slave_Log_Position" ] && [ "$slave_Slave_IO_Running" == "Yes" ] && [ "$slave_Slave_SQL_Running" == "Yes" ];
then
    echo "Status: OK";
    /usr/bin/mail -r $email_from -s "OK $email_subject" "$email_to" < $logfile
else
    echo "Status: FAIL";
    /usr/bin/mail -r $email_from -s "ERROR      $email_subject" "$email_to" < $logfile
fi
#EOF

Zapętlamy to w cron’ie

Edytujemy tablicę cron użytkownika, na którym ma się wykonywać skrypt, poleceniem crontab -e
Dodajemy na końcu poniższą linijkę

00 7 * * 1    /root/bin/check-mysql-repl.sh

Koniec

Co poniedziałek, po przyjściu do pracy, sprawdzamy skrzynkę odbiorczą i możemy dalej w spokoju przeglądać zdjęcia kotów w internecie :)

Przykładowa treść powiadomienia

Master: localhost
Slave : 192.168.2.22
Date  : 2013-01-14 13:34:28
-------------------------------------------
Master Log File : mysql-bin.000010
Slave Log File  : mysql-bin.000010
Master Log Position : 10656258
Slave Log Position  : 10656258
Slave_IO_Running  : Yes
Slave_SQL_Running : Yes
-------------------------------------------
Status: OK

Categories: Wpis

YAPA – kolejna aplikacja do Pomodoro » « „Zabezpieczenie” pliku PST hasłem – jaki to ma sens?

6 Comments

  1. W debianie musiałem zmienić linię wysyłającą email:

    mail -s „OK $email_subject” „$email_to” < $logfile

    nie wiem dlaczego ale nierozpoznana była opcja "-r"…

  2. Nawet jak nagios Ci nie pasi to nagiosowe styczki można łatwo podpiac pod cokolwiek innego bo zwracają tekst + error code, tylko sparsować

  3. … która oprócz tego robi tysiąc innych rzeczy i ma lepiej zaimplementowaną obsługę ostrzeżeń :>

Dodaj komentarz

Your email address will not be published.

*

Powiadom mnie mailowo o nowych komentarzach. Możesz również zapisać się bez zostawiania komentarza.

Copyright © 2017 bns techlog

Theme by Anders NorenUp ↑