Tecnologia

Cuando uno entra en el mundo de Oracle RAC se encuentra que muchas de las herramientas que antes usaba dejan de ser útiles o válidas.

Uno de nuestros principales retos cuando nos embarcamos en este mundo fué la monitorización del espacio. En nuestra organización no teniamos un DBA dedicado específicamente a estas tareas, con lo que la monitorización era clave para poder mantener los sistemas funcionando sin esa carga extra de trabajo para un administrador.

El problema de las instalaciones Oracle RAC es que la gestión de los discos suele basarse en Oracle ASM, y este utilitza los discos en formato RAW, de forma que el sistema operativo no sabe, ni que hay dentro de ellos, ni que espacio hay disponible. Toda esta gestión pasa a realizarse mediante las herramientas de Oracle, como puede ser el Enterprise Manager o el sufrido SQLPLUS

Con el objetivo de unificar herramientas de monitorización, desarrollé un script que consultaba mediante SQLPLUS el estado de los diskgroups, para a continuación publicarlos en una MIB, para que desde una herramienta estandard SNMP pudiese saber el estado de uso de los mismos sin tener que ir al Enterprise Manager. A continuación explico los pasos que segui para configurar, Nagios para monitorizar una instalación Oracle RAC. En mi caso me he basado en una instalación Linux, en concreto una SUSE Enterprise Linux 10, pero puede adaptarse a otras instalaciones.

 

El primer paso es realizar un script que se conecte, mediante SQLPLUS, a la instancia Oracle RAC, para a continuación obtener los resultados de espacio usado. El script es el siguiente:

 

#!/bin/bash
#set -x

if [ $# -lt 2 ]; then
echo "Usage: $0 "
exit
elif [ $# -eq 3 ]; then

if [ $1 == "DISKGROUP" ]; then
query="SELECT ROUND((TOTAL_MB-FREE_MB)*100/TOTAL_MB,0) AS $2 FROM V\$ASM_DISKGROUP WHERE NAME = '$2';";
fi;

su - asmdoc << EOF
sqlplus /nolog
conn / as sysdba
$query
exit

EOF

else
out=`$0 $1 $2 EXEC`

found=0;
value="";
for line in $out; do
word=$line
if [ $found -eq 0 ]; then
if [ $word == "$2" ]; then
found=1;
fi;
elif [ $found -eq 1 ]; then
found=2

elif [ $found -eq 2 ]; then
value=$word;
su - asmdoc << EOF
sqlplus /nolog
conn / as sysdba
$query
exit

EOF

else
out=`$0 $1 $2 EXEC`

found=0;
value="";
for line in $out; do
word=$line
if [ $found -eq 0 ]; then
if [ $word == "$2" ]; then
found=1;
fi;
elif [ $found -eq 1 ]; then
found=2

elif [ $found -eq 2 ]; then
value=$word;
found=0;
break;
fi;
done;

echo $value;

exit 0;

fi;

Hay que tener en cuenta que en mi caso, el usuario de Oracle de la instancia ASM es asmdoc, hay que sustituir ese usuario en el script con vuestro usuario ASM. Podeis probar el script llamandolo con los parametros DISKGROUP :

orarac1:/usr/local/bin # /usr/local/bin/snmpGetOracle DISKGROUP DATA_GRP
64

A continuación, hay que poner como ejecutable este script e irnos al directorio de configuración de SNMP: /etc/snmp/ y al fichero de configuración: snmpd.conf. Ahi buscaremos la sección llamada "Extensible sections", y añadiremos las siguientes entradas para añadir las nuevas claves SNMP que usará Nagios:

exec .1.3.6.1.4.1.2021.51 DATA_GRP /usr/local/bin/snmpGetOracle DISKGROUP DATA_GRP
exec .1.3.6.1.4.1.2021.52 RECOVERY_GRP /usr/local/bin/snmpGetOracle DISKGROUP RECOVERY_GRP

Ahora reiniciaremos el daemon snmp, con el comando /etc/init.d/snmp restart, y intentaremos ver si obtenemos las claves, con el comando snmpwalk:

orarac1:/usr/local/bin # snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.51
UCD-SNMP-MIB::ucdavis.51.1.1 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.51.2.1 = STRING: "DATA_GRP"
UCD-SNMP-MIB::ucdavis.51.3.1 = STRING: "/usr/local/bin/snmpGetOracle DISKGROUP DATA_GRP"
UCD-SNMP-MIB::ucdavis.51.100.1 = INTEGER: 0
UCD-SNMP-MIB::ucdavis.51.101.1 = STRING: "64"
UCD-SNMP-MIB::ucdavis.51.102.1 = INTEGER: 0
UCD-SNMP-MIB::ucdavis.51.103.1 = ""

Ahora solo nos queda añadir a Nagios el acceso a estas nuevas claves SNMP, para ello editaremos el fichero commands.cfg en conf.d de nagios y añadiremos una nueva entrada (asumo que ya teneis nagios configurado y que además teneis el plugin snmp funcionando tambien correctamente.

define command{
  command_name check_snmp_local_v1
  command_line $USER1$/check_snmp -H $HOSTADDRESS$ -C $ARG1$ -o UCD-SNMP-MIB::ucdavis.$ARG2$.101.1 -w $ARG3$ -c $ARG4$
}

Ahora, en uno de los ficheros de configuración de nagios para uno de los hosts donde tenemos el Oracle RAC, añadiremos el siguiente servicio:

define service {
name DATA_GRP
host_name ORARAC
use snmp-csi
check_command check_snmp_local_v1!status!51!90!95
service_description Disk Group DATA_GRP
servicegroups ORARAC
}

define service {
name RECOVERY_GRP
host_name ORARAC
use snmp-csi
check_command check_snmp_local_v1!status!52!90!95
service_description Disk Group RECOVERY_GRP
servicegroups ORARAC
}

Fijaos que la clave es usar el número 51 y 52 como parámetros, que son los numeros que diferencian las claves en el fichero snmpd.conf del host de Oracle RAC que hemos configurado para la monitorización.

Ahora ya podemos reinciar Nagios y disfrutar de la monitorización. Las alarmas las recibiremos de forma integrada al resto de sistemas de nuestra casa. A continuación enseño una de las gráficas de nagios de monitorización:

OracleRAC_Recover_grp_Nagios

Add comment


Security code
Refresh