Cómo monitorear los volúmenes de glusterfs

12

Glusterfs, si bien es un buen sistema de archivos distribuido, casi no proporciona forma de monitorear su integridad. Los servidores pueden ir y venir, los ladrillos pueden ponerse obsoletos o fallar y me da miedo saberlo cuando probablemente sea demasiado tarde.

Recientemente tuvimos un extraño fallo cuando todo parecía funcionar, pero un ladrillo se cayó del volumen (encontrado por pura coincidencia).

¿Existe una forma simple y confiable (secuencia de comandos cron?) Que me permita conocer el estado de salud de mi volumen GlusterFS 3.2 ?

Arie Skliarouk
fuente
Por ahora usamos una supervisión basada en script de shell sucio: check_gluster.sh
Arie Skliarouk
Eche un vistazo a glfs-health.sh .
quanta
1
Revisé glfs-health.sh y parece que es para versiones antiguas de glusterfs, que estaban controladas por archivos de configuración. Aclararé mi pregunta para representar a los glusterfs 3.2.
Arie Skliarouk

Respuestas:

3

Esta ha sido una solicitud a los desarrolladores de GlusterFS desde hace un tiempo y no hay una solución inmediata que pueda usar. Sin embargo, con algunos scripts no es imposible.

Casi todo el sistema Gluster es administrado por un solo comando de Gluster y con algunas opciones, puede escribir scripts de monitoreo de salud. Consulte aquí para obtener información de la lista de ladrillos y volúmenes: http://gluster.org/community/documentation/index.php/Gluster_3.2:_Displaying_Volume_Information

Para monitorear el rendimiento, mire este enlace: http://gluster.org/community/documentation/index.php/Gluster_3.2:_Monitoring_your_GlusterFS_Workload

ACTUALIZACIÓN: considere actualizar a http://gluster.org/community/documentation/index.php/About_GlusterFS_3.3

Siempre es mejor estar en la última versión, ya que parecen tener más correcciones de errores y están bien respaldados. Por supuesto, ejecute sus propias pruebas antes de pasar a una versión más reciente: http://vbellur.wordpress.com/2012/05/31/upgrading-to-glusterfs-3-3/ :)

Hay una guía de administración con una sección específica para monitorear su instalación de GlusterFS 3.3 en el Capítulo 10 - http://www.gluster.org/wp-content/uploads/2012/05/Gluster_File_System-3.3.0-Administration_Guide-en-US .pdf

Vea aquí otro script nagios: http://code.google.com/p/glusterfs-status/

Chida
fuente
Gracias Chida, supongo que lo que me tiene colgado es que algunas personas ( github.com/semiosis/puppet-gluster ) están monitoreando gluster a través de la tabla de proceso ('--with-brick', etc.) y archivos de registro (egrep 'E' por error), y algunas personas están usando la CLI y no tengo idea de cuál es más probable que informe con precisión el estado de Gluster.
r_2
Recomiendo usar la CLI, ya que esa es la que recomienda GlusterFS y está destinada a estar actualizada.
Chida
2

Consulte el script adjunto en https://www.gluster.org/pipermail/gluster-users/2012-June/010709.html para ver el gluster 3.3; Probablemente sea fácilmente adaptable a Gluster 3.2.

#!/bin/bash

# This Nagios script was written against version 3.3 of Gluster.  Older
# versions will most likely not work at all with this monitoring script.
#
# Gluster currently requires elevated permissions to do anything.  In order to
# accommodate this, you need to allow your Nagios user some additional
# permissions via sudo.  The line you want to add will look something like the
# following in /etc/sudoers (or something equivalent):
#
# Defaults:nagios !requiretty
# nagios ALL=(root) NOPASSWD:/usr/sbin/gluster peer status,/usr/sbin/gluster volume list,/usr/sbin/gluster volume heal [[\:graph\:]]* info
#
# That should give us all the access we need to check the status of any
# currently defined peers and volumes.

# define some variables
ME=$(basename -- $0)
SUDO="/usr/bin/sudo"
PIDOF="/sbin/pidof"
GLUSTER="/usr/sbin/gluster"
PEERSTATUS="peer status"
VOLLIST="volume list"
VOLHEAL1="volume heal"
VOLHEAL2="info"
peererror=
volerror=

# check for commands
for cmd in $SUDO $PIDOF $GLUSTER; do
    if [ ! -x "$cmd" ]; then
        echo "$ME UNKNOWN - $cmd not found"
        exit 3
    fi
done

# check for glusterd (management daemon)
if ! $PIDOF glusterd &>/dev/null; then
    echo "$ME CRITICAL - glusterd management daemon not running"
    exit 2
fi

# check for glusterfsd (brick daemon)
if ! $PIDOF glusterfsd &>/dev/null; then
    echo "$ME CRITICAL - glusterfsd brick daemon not running"
    exit 2
fi

# get peer status
peerstatus="peers: "
for peer in $(sudo $GLUSTER $PEERSTATUS | grep '^Hostname: ' | awk '{print $2}'); do
    state=
    state=$(sudo $GLUSTER $PEERSTATUS | grep -A 2 "^Hostname: $peer$" | grep '^State: ' | sed -nre 's/.* \(([[:graph:]]+)\)$/\1/p')
    if [ "$state" != "Connected" ]; then
        peererror=1
    fi
    peerstatus+="$peer/$state "
done

# get volume status
volstatus="volumes: "
for vol in $(sudo $GLUSTER $VOLLIST); do
    thisvolerror=0
    entries=
    for entries in $(sudo $GLUSTER $VOLHEAL1 $vol $VOLHEAL2 | grep '^Number of entries: ' | awk '{print $4}'); do
        if [ "$entries" -gt 0 ]; then
            volerror=1
            let $((thisvolerror+=entries))
        fi
    done
    volstatus+="$vol/$thisvolerror unsynchronized entries "
done

# drop extra space
peerstatus=${peerstatus:0:${#peerstatus}-1}
volstatus=${volstatus:0:${#volstatus}-1}

# set status according to whether any errors occurred
if [ "$peererror" ] || [ "$volerror" ]; then
    status="CRITICAL"
else
    status="OK"
fi

# actual Nagios output
echo "$ME $status $peerstatus $volstatus"

# exit with appropriate value
if [ "$peererror" ] || [ "$volerror" ]; then
    exit 2
else
    exit 0
fi
S19N
fuente
1

@Arie Skliarouk, tu check_gluster.shtiene un error tipográfico; en la última línea, prefieres en exitstlugar de exist. Seguí adelante y lo reescribí para que fuera un poco más compacto, y para eliminar el requisito de un archivo temporal.

#!/bin/bash

# Ensure that all peers are connected
gluster peer status | grep -q Disconnected && echo "Peer disconnected." && exit 1

# Ensure that all bricks have a running log file (i.e., are sending/receiving)
for vol in $(gluster volume list); do
  for brick in $(gluster volume info "$vol" | awk '/^Brick[0-9]*:/ {print $2}'); do
    gluster volume log locate "$vol" "$brick";
  done;
done |
 grep -qE "does not (exist|exitst)" &&
 echo "Log file missing - $vol/$brick ." &&
 exit 1
BMDan
fuente
1
El error tipográfico "exitst" es lo que está escrito en los registros. No compro la ventaja "compacta": el guión es mucho más difícil de entender cuando las líneas están sobrecargadas. El archivo temporal es un precio barato a pagar por el código fácil de entender.
Arie Skliarouk
@ArieSkliarouk: actualizado para cubrir ambos casos, pero tenga en cuenta que el mensaje relevante se eliminó en noviembre de 2011; ver git.gluster.org/… . Por lo tanto, es probable que esto no funcione en Glusters más nuevos. Si encuentra que el código más corto es más difícil de entender, está bien, pero es significativamente más robusto que usar un archivo temporal, así que considere refactorizarlo para facilitar su lectura en lugar de descartarlo por la falta percibida de ese atributo.
BMDan
1
Un editor anónimo señaló que gluster volume info | awk ...se puede abreviar gluster volume list.
Lekensteyn