jueves, 31 de mayo de 2007

Monitorizando un Raid en Linux: Estado y Ocupación

   Enlazando con el artículo anterior del envío de alarmas al móvil utilizando el API de Google Calendar, le he dado utilidad al programa. Desde hace unos días lo utilizo para monitorizar el estado del raid 1 del servidor de backup y enterarme de manera instantánea de cualquier problema con algún disco.

   Utilizando mdadm en modo monitor lo configuré para que ejecutara un script cuando detectara algún evento del raid. De todos los eventos posibles, los que a mi me interesan son:
  • Fail: Cuando se produce un fallo en algún disco del raid.
  • DegradedArray: Si se ha producido un fallo en algún disco y se ejecuta de nuevo el mdadm, se genera este evento. El caso más típico para un raid 1 es que ha fallado un disco y hemos reiniciado la máquina y estamos trabajando sólo con el otro disco. Sirve a modo de recordatorio de que hay que cambiar el disco defectuoso y reconstruir el raid.
  • RebuildStarted: Este evento se genera cuando comienza la reconstrucción del raid.
  • RebuldFinished: Cuando se ha terminado de reconstruir el raid se lanza este evento.

  •    El resto de eventos no me afectan demasiado, así que simplemente los guardaré en un log. Para ejecutar un script cuando se produce un evento en el raid en lugar de la notificación por email, es necesario hacer un pequeño cambio en el archivo /etc/init.d/mdadm.
  • Definimos la ruta del script:
    PROGRAM=/root/scripts/monitorRaid.sh
  • En "start" cambiamos la instrucción que viene por:
    start-stop-daemon -S -p $PIDFILE -x $MDADM -- -F -i $PIDFILE -p $PROGRAM -f --scan

  •    El script monitorRaid.sh que he creado es el siguiente:
    shian:~# cat scripts/monitorRaid.sh
    #!/bin/sh
    # Script de generación de alarmas según el estado del raid
    #
    # Iván López Martín
    # http://lopezivan.blogspot.com
    #####

    RAID_EVENT=$1
    LOG_DIR=/var/local/raid
    LOG_FILE=monitor_raid.log
    SMS_PROGRAM=/root/scripts/enviaSMS.sh
    GMAIL_USER=usuario@gmail.com
    GMAIL_PASS=mipassword

    if [ $RAID_EVENT == "Fail" ]; then
    date >> $LOG_DIR/$LOG_FILE
    echo Fail >> $LOG_DIR/$LOG_FILE
    echo >> $LOG_DIR/$LOG_FILE

    # Envío del SMS
    $SMS_PROGRAM $GMAIL_USER $GMAIL_PASS "ERROR CRITICO: Ha fallado un disco del raid."

    elif [ $RAID_EVENT == "DegradedArray" ]; then
    date >> $LOG_DIR/LOG_FILE
    echo DegradedArray >> $LOG_DIR/$LOG_FILE
    echo >> $LOG_DIR/$LOG_FILE

    # Envío del SMS
    $SMS_PROGRAM $GMAIL_USER $GMAIL_PASS "RECORDATORIO: El raid está funcionando con un solo disco."

    elif [ $RAID_EVENT == "RebuildStarted" ]; then
    date >> $LOG_DIR/$LOG_FILE
    echo RebuildStarted >> $LOG_DIR/$LOG_FILE
    echo >> $LOG_DIR/$LOG_FILE

    elif [ $RAID_EVENT == "RebuildFinished" ]; then
    date >> $LOG_DIR/$LOG_FILE
    echo RebuldFinished >> $LOG_DIR/$LOG_FILE
    echo >> $LOG_DIR/$LOG_FILE

    # Envío del SMS
    $SMS_PROGRAM $GMAIL_USER $GMAIL_PASS "INFO: Ha terminado la reconstrucción del raid."

    else
    date >> $LOG_DIR/$LOG_FILE
    echo $RAID_EVENT >> $LOG_DIR/$LOG_FILE
    echo >> $LOG_DIR/$LOG_FILE
    fi

       Para probar que está todo bien configurado, podemos ejecutar el monitor del raid en modo Test:
    shian:~# mdadm -F -p /root/scripts/monitorRaid.sh --scan -t -1

    shian:~# tail -3 /var/local/raid/monitor_raid.log
    Mon May 21 18:15:17 CEST 2007
    TestMessage

       Si vemos el mensaje de prueba significa que la monitorización es correcta, ahora sólo queda esperar a que falle algún disco (ojalá no ocurra) para que el programa de alarmas por sms cumpla su función.

       Adicionalmente he creado otro script que ejecuto por medio de crontab cada 10 minutos que monitoriza la ocupación de los filesystems (en este caso sólo el del raid) y cuando se supera un umbral se envía una notificación por SMS.
    shian:~# cat monitorFS.sh
    #!/bin/sh
    # Script de monitorización del tamaño de un filesystem y envío de alarmas por SMS
    #
    # Iván López Martín
    # http://lopezivan.blogspot.com
    ######

    FILESYSTEM=$1
    TMP_DIR=/root/scripts
    SMS_PROGRAM=/root/scripts/enviaSMS.sh
    GMAIL_USER=usuario@gmail.com
    GMAIL_PASS=mipassword

    SPACE_USED=`df | grep $FILESYSTEM | awk '{print $5}' | sed 's/%//g'`

    if [ "$SPACE_USED" -gt 90 ] ; then
    if ! [ -f $TMP_DIR/.fs_90 ] ;then
    SEND_SMS=YES
    THRESHOLD=90
    touch $TMP_DIR/.fs_90
    fi
    elif [ "$SPACE_USED" -gt 80 ] ; then
    if ! [ -f $TMP_DIR/.fs_80 ] ;then
    SEND_SMS=YES
    THRESHOLD=80
    touch $TMP_DIR/.fs_80
    fi
    elif [ "$SPACE_USED" -gt 70 ] ; then
    if ! [ -f $TMP_DIR/.fs_70 ] ;then
    SEND_SMS=YES
    THRESHOLD=70
    touch $TMP_DIR/.fs_70
    fi
    elif [ "$SPACE_USED" -gt 60 ] ; then
    if ! [ -f $TMP_DIR/.fs_60 ] ;then
    SEND_SMS=YES
    THRESHOLD=60
    touch $TMP_DIR/.fs_60
    fi
    fi

    if [ "$SEND_SMS" == "YES" ] ; then
    # Envio del SMS
    $SMS_PROGRAM $GMAIL_USER $GMAIL_PASS "El filesystem" $FILESYSTEM "supera el "$THRESHOLD"%."
    fi

    12 comentarios:

    Was dijo...

    Me ha gustado mucho la idea seguro que puedo aprovecharla en algun lado.

    Saludos.

    Iván dijo...

    Hola was,

    me alegro de que te pueda resultar útil. Muchas gracias por visitar el blog.

    Saludos, Iván.

    Anónimo dijo...

    hola,
    buscando por google he encontrado tu blog.
    Me encanta!!!
    Éste articulo es MUY util.

    Mis felicitaciones :)

    Iván dijo...

    Hola Anónimo,

    muchas gracias. Espero que te haya resultado útil y lo puedas aprovechar para algo.

    Saludos, Iván.

    correoskk1234 dijo...

    Muchas gracias Ivan, he añadido un link en mi pagina a este magnifico script. Me ayudo a solventar el reventon de uno de mis discos.

    Gracias.

    Iván dijo...

    Hola correoskk1234,

    me alegro de que el script te haya servido y hayas podido recuperar de nuevo el raid.

    Muchas gracias por el enlace :-D.

    Saludos, Iván.

    Daniel dijo...

    Hola Ivan:
    queria preguntarte si este script me serviria con aix 5.2
    hay que ponerle parametros para que funcione?
    gracias.

    Iván dijo...

    Hola Daniel,

    nunca he trabajado con Aix pero como puedes ver el script no hace nada del otro mundo. Lo único más particular es el envío de los sms y para eso lo único que necesitas es instalar la máquina virtual de java en el Aix.
    Respecto a los parámetros, el único que recibe es:
    RAID_EVENT=$1

    y luego se va comparando con distintos valores para enviar la alerta concreta. El valor de ese parámetro lo genera automáticamente mdadm cuando está ejecutando en modo monitor.
    Como te he dicho no sé si Aix tendrá algo similar, pero siempre puedes tomar la idea base del script y adaptarlo a tus necesidades.

    Saludos y gracias por la visita, Iván.

    Daniel dijo...

    Muy interesante. Gracias por el artículo.

    Justamente mañana tengo que cambiar un disco de un sistema productivo que falló el viernes pasado a última hora y gracias al esquema de RAID por software que implementé, siguió tirando todo el fin de semana. Una maravilla.

    Voy a ver si pruebo este script con algunos de mis equipos que usan RAID por software. Lo que me gustaría consultarte, si es que sabés, es lo siguiente. Estaría bueno que tanto en el log como en los mensajes de texto que se envían quede registrado cuál es el dispositivo md que falló. ¿Sabés si hay alguna variable que pueda agregarse para contar con esta información también en las alertas?

    Gracias de nuevo por el artículo.

    Saludos,
    Daniel

    Iván dijo...

    Hola Daniel,

    me alegro de que te haya gustado el artículo y te pueda ser útil.

    Respecto a tu consulta, por lo que sé, sólo se envían al script los eventos que se generan en el raid, pero no qué dispositivo los genera.
    Como solución, se me ocurre que en el script de monitorización compruebes el estado de /proc/mdstat para comprobar qué raid es el que te ha fallado. Y esperemos que sólo sea uno...

    Muchas gracias por tu comentario.

    Saludos, Iván.

    Nicolas Feruglio dijo...

    Hola Ivan, tu blog me sirvio muchisimo para comenzar a trabajar con raid por soft, te comento que he tenido un problema con un raid 5 que arme con mdadm es de 4 disco, por segunda vez se me rompio un disco, el monitoreo me aviso remplace el disco y salio funcionando todo bien, hasta aqui todo perfecto, al otro dia al encender el equipo me informaba que el raid estaba inactivo pense que se solucionaba poniendo clean en el archivo array_state pero el problema es que al intentar agregar esa linea al archivo me daba un error, despues me indico que no podia reconstruir el array a partir de dos disco, me informaba que se habian roto dos discos, verifique los discos y estaban bien, buscando en internet sugerian rearmar el arreglo, al hacerlo detecto los 4 discos pero al querer montarlo no reconoce el file system pide dar formato, esperando que haya alguna alternativa todavia no le di formato al nuevo arreglo. Se te ocurre algo sobre el posible problema o la forma de solucionarlo, se que es mucho pedir pero veo que tenes experiencia con el mdadm y quizas ya hayas pasado por algo pareceido.
    muchas gracias y nuevamente felicitaciones por el blog.
    saludos
    Nicolas

    Iván dijo...

    Hola Nicolas Feruglio,

    ¡qué mala pata lo que te ha ocurrido!. Lo siento pero me temo que no te puedo ayudar. Aunque he escrito algún artículo hablando sobre el raid 5, mi experiencia con este tipo de raid por software termina ahí. Los raid que he creado y con los que más me he pegado han sido siempre de tipo raid 1.
    Espero que encuentres la manera de recuperar la información.

    Saludos, Iván.

    Publicar un comentario