Supervision d'une installation goldengate

Le logiciel Oracle goldengate est un outil de réplication entre diverses bases de données (Oracle, DB2 , SQL Server, MySQL , PostgreSQL, etc.).
Il est souvent utilisé dans des contextes de production pour alimenter un système décisionnel à partir d’un système OLTP ou pour effectuer une migration à chaud de vos bases de données (zero downtime migration).
Dans toutes les installations du logiciel goldengate, j’entends souvent la même question :
Mais comment faire pour contrôler le bon fonctionnement de ma réplication ?
Cet article propose pour celà un script de supervision qui surveille les principaux indicateurs goldengate, et a été pensé pour être compatible avec Nagios, un grand standard du monde de la supervision.
Bien sûr, il faudra peut-être l’adapter à votre environnement ou aux spécificités de votre application, mais il convient déjà à une grande majorité des installations du produit.
La surveillance proposée s’appuie sur le résultat de la commande ggsci « INFO ALL » qui ressemble à ceci :

GGSCI () 1> info all
Program   Status Group Lag at Chkpt Time Since Chkpt
MANAGER   RUNNING
EXTRACT   RUNNING EXTP1 00:00:00    00:00:00
EXTRACT   RUNNING PMPP1 00:00:00    00:00:08
REPLICAT  RUNNING REPP2 00:00:00    00:00:03

A partir de ce résultat, le script de supervision va traiter les 3 indicateurs suivants :
Status :
Il donne l’état du processus de réplication. En temps normal, cet indicateur prend la valeur RUNNING, mais s’il prend la valeur ABENDED, STOPPED ou STARTING, alors le script remonte une alerte.
Lag at Chkpt :
Affiché en heures:minutes:secondes, il indique l’éventuel retard pris par le process pour traiter une transaction (pour l’exécuter du coté REPLICAT, ou pour la collecter du coté EXTRACT).
Quand tout va bien, ce lag affiche une valeur proche de zéro (00:00:00).
Plus ce lag est important, et s’il augmente avec le temps, et plus le risque de devoir resynchroniser les bases est important également.
Une alerte remontera dans Nagios si le lag dépasse la valeur par défaut de 15 minutes (Warning) ou de 60 minutes (Critique). Ces deux seuils sont bien entendus paramétrables dans le script proposé.
Time Since Chkpt :
Affiché en heures:minutes:secondes, il témoigne d’un retard pris dans le traitement des transactions que le process doit effectuer.
En temps normal, sa valeur est proche de zéro.
Sa valeur peut croitre si le process est dans l’état ABENDED (plantage) ou STOPPED (arrêt volontaire) ou si un souci de performances affecte le process.
Une alerte remontera dans Nagios dans les mêmes conditions que pour l’indicateur précédent « Lag at Chkpt ».
En entrée du script, de 1 à 3 paramètres sont à fournir :

  • – SID de la base sur laquelle porte la réplication (requis)
  • – Seuil de Warning pour les lag (en minutes) – par défaut : 15 minutes
  • – Seuil Critique pour les lag (en minutes) – par défaut : 60 minutes

En sortie d’exécution du script , les valeurs traditionnelles sous Nagios :

  • 0 : OK
  • 1 : WARNING
  • 2 : CRITIQUE
  • 3 : Unknown

Avec le libellé de l’alerte.
Ci-dessous le détail du script pour la surveillance de votre installation Goldengate.

#!/bin/bash
#
# check_ogg
# Small Nagios Plugin aimed to check if a goldengate installation is healthy
#
#
# Input parameters :
# Database name : -d  (required)
# LAG Warning threshold (in minutes) : -w 999 (default : 15)
# LAG Critical threshold (in minutes) : -c 999 (default : 60)
#
# Output :
# RC : 0(OK), 1(Warning), 2(Critical), or 3(Unknown)
# MESSAGE : Error messages
#
# In case warning and critical messages are detected, only the highest value
# is returned.
#
###
MESSAGE=/tmp/message # To be changed, if default value is not convenient.
if [ -f $MESSAGE ];
then
 rm -f $MESSAGE
fi
export ORAENV_ASK=NO
unset OPTIND
unset MSG
unset VERBOSE
RC=0
WARN=15
CRIT=60
#----------------------------------------
# Printing output
PrintAndExit(){
if [ -f $MESSAGE ]
then
 cat $MESSAGE
else
 echo $MSG
fi
exit $RC
}
#----------------------------------------
case $1 in
 "?"|""|-h|-help)
 echo "check_ogg v1 - by EASYTEAM
Usage:
 check_ogg -d  [ -w lag warning threshold ] [ -c lag critical threshold ]
 check_ogg --help
 check_ogg --version
Check Oracle goldengate installation.
 -d Specify the SID of the Oracle database
 -w Warning Threshold, default = 15 minutes
 -c Critical Threshold, default = 60 minutes
 -h Print this help screen
 -v Verbose mode
"
 RC=4
 ;;
esac
(( RC == 4 ))&& exit
###
while getopts Dd:Ww:Cc:Vv NAME;
do
 case $NAME in
 D|d)
 SID=$OPTARG
 ;;
 W|w)
 WARN=$OPTARG
 ;;
 C|c)
 CRIT=$OPTARG
 ;;
 V|v)
 export VERBOSE="YES"
 ;;
 esac
done 2>/dev/null
if [ -z $SID ];then
 echo "No sid specified!"
 exit 14
fi
### Looking for OGG installation directory
OGGDIR=`ps -ef | grep mgr.prm | awk '{ print $10 }' | awk -Fdirprm '{ print $1 }'`
if [ ! $OGGDIR ]
then
 echo "Unable to locate goldengate installation"
 exit 2
fi
WARNH=`expr $WARN / 60`
WARNM=`expr $WARN - 60 \* $WARNH`
CRITH=`expr $CRIT / 60`
CRITM=`expr $CRIT - 60 \* $CRITH`
WARNH=`printf %02d $WARNH`
WARNM=`printf %02d $WARNM`
CRITH=`printf %02d $CRITH`
CRITM=`printf %02d $CRITM`
if [ $VERBOSE ]
then
 echo "---"
 echo "Executing $0 on SID $SID"
 echo "Goldengate installed in $OGGDIR"
 echo "WARNING if lag > $WARNH:$WARNM:00"
 echo "CRITICAL if lag > $CRITH:$CRITM:00"
 echo "---"
fi
# Checking if SID does exist
if [ `grep ^$SID /etc/oratab | wc -l` -eq 0 ]
then
 MSG="Unable to reach $ORACLE_SID database"
 RC=2
 if [ $VERBOSE ];
 then
 echo $MSG
 fi
 PrintAndExit
fi
export ORACLE_SID=$SID
. oraenv > /dev/null 2>&1
### check availability of goldengate processes
if [ $VERBOSE ]
then
 echo "./ggsci info all"
fi
cd $OGGDIR
./ggsci > /tmp/check_ogg_$SID_$$ <> $MESSAGE
 fi
 LAGH=`echo $LAGATCKPT | awk -F: '{ print $1 }'`
 LAGM=`echo $LAGATCKPT | awk -F: '{ print $2 }'`
 TIMH=`echo $TIMSINCKPT | awk -F: '{ print $1 }'`
 TIMM=`echo $TIMSINCKPT | awk -F: '{ print $2 }'`
 if [ $LAGH -ge $CRITH -a $LAGM -ge $CRITM ]
 then
 echo "CRITICAL LAG for process $PROCNAME > ${CRITH}:${CRITM}:00 ($LAGATCKPT)
" >> $MESSAGE
 else
 if [ $LAGH -ge $WARNH -a $LAGM -ge $WARNM ]
 then
 echo "WARNING LAG for process $PROCNAME > ${WARNH}:${WARNM}:00 ($LAGATCKP
T)" >> $MESSAGE
 fi
 fi
 if [ $TIMH -ge $CRITH -a $TIMM -ge $CRITM ]
 then
 echo "CRITICAL TIM for process $PROCNAME > ${CRITH}:${CRITM}:00 ($TIMSINCKPT
)" >> $MESSAGE
 else
 if [ $TIMH -ge $WARNH -a $TIMM -ge $WARNM ]
 then
 echo "WARNING TIM for process $PROCNAME > ${WARNH}:${WARNM}:00 ($TIMSINCK
PT)" >> $MESSAGE
 fi
 fi
done
if [ -f $MESSAGE ]
then
 if [ `grep ^CRIT $MESSAGE | wc -l` -ne 0 ]
 then
 RC=2
 else
 RC=1
 fi
else
 MSG="OK Goldengate is running on $SID"
 RC=0
fi
rm /tmp/check_ogg_$SID_$$
PrintAndExit