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