systemadmin.es > DBA > Comprobación del estado de un slave de MySQL con Nagios

Comprobación del estado de un slave de MySQL con Nagios

En un post anterior comenté que no es suficiente mirar el Seconds_Behind_Master para saber si se esta replicando correctamente un MySQL, por lo que las herramientas de monitorización se deben adaptar a esto.

El siguiente script comprueba no sólo Seconds_Behind_Master, sino también Last_Errno para dar por buena la sincronización entre master y slave. Los dos únicos parámetros que debemos definir en el script son:

  • SBMLIMIT: Número de segundos de retraso máximo que permitimos, no nos interesa que por una pequeña desincronización puntual nos este avisando
  • AUTOSTARTSLAVE: Si debe intentar arrancar el slave en caso que se lo encuentre parado

Por otro lado, espera que el password de root en el fichero /var/mysql/.mysql.root.pass.

Se puede descargar directamente con:

# wget systemadmin.es/wp-content/uploads/check_slave_mysql

El script para Nagios es el siguiente:

#!/bin/bash

SBMLIMIT=8000
AUTOSTARTSLAVE=1

PATHMYSQLCMD=$(which mysql 2>/dev/null)

if [ -z "$PATHMYSQLCMD" ];
then
	echo "mysql NOT FOUND"
	exit 2
fi

BACKUP=0

ps -fea | grep [m]ylvmbackup >/dev/null 2>&1
if [ $? -eq 0 ];
then
	BACKUP=1
fi

ps -fea | grep [m]ysqldump >/dev/null 2>&1
if [ $? -eq 0 ];
then
        BACKUP=1
fi

ps -fea | grep [m]ysqlhotcopy >/dev/null 2>&1
if [ $? -eq 0 ];
then
        BACKUP=1
fi


$PATHMYSQLCMD -uroot -p$(cat /var/mysql/.mysql.root.pass) -e "quit" > /dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "CRITICAL - MySQL DOWN"
    exit 2
fi

SBMRES=$($PATHMYSQLCMD -uroot -p$(cat /var/mysql/.mysql.root.pass) -e "show slave status\G" | grep "Seconds_Behind_Master" | sed "s/.*Master: \([^$]*\)$/\1/g")

if [ "$SBMRES" == "NULL" ];
then
	if [ $AUTOSTARTSLAVE -eq 1 ];
	then
		$PATHMYSQLCMD -uroot -p$(cat /var/mysql/.mysql.root.pass) -e "start slave;"
		#retry
		SBMRES=$($PATHMYSQLCMD -uroot -p$(cat /var/mysql/.mysql.root.pass) -e "show slave status\G" | grep "Seconds_Behind_Master" | sed "s/.*Master: \([^$]*\)$/\1/g")
	else
                ERRORSIOSQL=$($PATHMYSQLCMD -uroot -p$(cat /var/mysql/.mysql.root.pass) -e "show slave status\G" | grep "Last_\(SQL\|IO\)_Error:")
                ERRORIO=$(echo "$ERRORSIOSQL" | head -1 | sed "s/.*: \([^$]*\)$/\1/g")
                ERRORSQL=$(echo "$ERRORSIOSQL" | tail -1 | sed "s/.*: \([^$]*\)$/\1/g")
                echo "CRITICAL - $ERRORIO - $ERRORSQL"
                exit 2

	fi
fi

case $SBMRES in
  "0")
     echo "OK - Slave SBM=0 | slavemysql=0"
     exit 0
     ;;

  "NULL")
    ERRORSIOSQL=$(mysql --socket=$socket -uroot -p$(cat /var/mysql/.mysql.root.pass) -e "show slave status\G" | grep "Last_\(SQL\|IO\)_Error:")
    ERRORIO=$(echo "$ERRORSIOSQL" | head -1 | sed "s/.*: \([^$]*\)$/\1/g")
    ERRORSQL=$(echo "$ERRORSIOSQL" | tail -1 | sed "s/.*: \([^$]*\)$/\1/g")
    echo "CRITICAL - $ERRORIO - $ERRORSQL"
    exit 2
    ;;
  *)
    LASTERRNO=$($PATHMYSQLCMD -uroot -p$(cat /var/mysql/.mysql.root.pass) -e "show slave status\G" | grep "Last_Errno" | sed "s/.*: \([^$]*\)$/\1/g")
	
    if [ $LASTERRNO -ne 0 ];
    then
		ERRORSIOSQL=$($PATHMYSQLCMD -uroot -p$(cat /var/mysql/.mysql.root.pass) -e "show slave status\G" | grep "Last_\(SQL\|IO\)_Error:")
		ERRORIO=$(echo "$ERRORSIOSQL" | head -1 | sed "s/.*: \([^$]*\)$/\1/g")
		ERRORSQL=$(echo "$ERRORSIOSQL" | tail -1 | sed "s/.*: \([^$]*\)$/\1/g")
		echo "CRITICAL - $ERRORIO - $ERRORSQL"
		exit 2
    fi
	
    esac
    if [ $SBMRES -le $SBMLIMIT ]; then
      echo "OK - Slave SBM=$SBMRES | slavemysql=$SBMRES"
      exit 0
    fi
    if [ $BACKUP -eq 1 ]; then
        echo "OK - Slave SBM=$SBMRES (backup) | slavemysql=$SBMRES"
        exit 0
    else
        echo "WARNING - Slave SBM=$SBMRES | slavemysql=$SBMRES"
        exit 1
    fi
    ;;
esac

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>