Oracle : le cluster de haute disponibilité le plus simple avec réplication synchrone et tolérance aux pannes

Oracle : le cluster de haute disponibilité le plus simple avec réplication synchrone et tolérance aux pannes

Evidian SafeKit apporte la haute disponibilité à Oracle. Cet article explique comment mettre en œuvre rapidement un cluster Oracle sans disque partagé et sans compétences spécifiques. Le module de haute disponibilité oracle.safe et un essai gratuit sont offerts dans la section instructions d'installation.

Cette solution de clustering est reconnue comme la plus simple à mettre en œuvre par nos clients et partenaires. C'est également une solution complète qui résout les pannes matérielles (20% des problèmes) incluant la panne complète d'une salle informatique, les défaillances logicielles (40% des problèmes) incluant le passage d'update serveur par serveur et les erreurs humaines (40% des problèmes) grâce à sa simplicité.

Comment le logiciel Evidian SafeKit met en œuvre simplement la haute disponibilité de Oracle avec réplication synchrone temps réel et tolérance aux pannes sans disque partagé

Comment Evidian SafeKit met en œuvre la haute disponibilité de Milestone XProtect avec réplication temps réel et tolérance aux pannes

Sur la figure précédente, le serveur 1 / PRIM exécute les services Oracle. Les utilisateurs sont connectés à l'adresse IP virtuelle du cluster miroir. SafeKit réplique les fichiers ouverts par les services Oracle en temps réel. Seules les modifications apportées aux fichiers sont répliquées sur le réseau, limitant ainsi le trafic (réplication de fichiers au niveau octet). Les noms des répertoires de fichiers contenant les données des services Oracle sont simplement configurés dans SafeKit. Il n'existe pas de pré-requis sur l'organisation des disques entre les deux serveurs. Les répertoires à répliquer peuvent se trouver dans le disque système. SafeKit met en œuvre une réplication synchrone sans perte de données en cas de panne, contrairement à une réplication asynchrone.

En cas de défaillance du serveur 1, il y a un basculement automatique sur le serveur 2 avec redémarrage des services Oracle. Ensuite, lorsque le serveur 1 est redémarré, SafeKit met en œuvre son retour automatique dans le cluster avec la réintégration des données sans arrêter les services Oracle sur le serveur 2. Enfin, le système retourne à la réplication synchrone entre le serveur 2 et le serveur 1. L'administrateur peut décider d'échanger le rôle du primaire et du secondaire pour revenir à un serveur 1 qui exécute les services Oracle. Ce changement de rôle peut également être fait automatiquement par configuration.

FAQ sur Evidian SafeKit

Meilleurs cas d'utilisation [+]

Clients [+]

Modules de haute disponibilité appicatifs [+]

Webinaire SafeKit [+]

Prix - Essai gratuit [+]

Comparaison avec d'autres solutions [+]

Démonstration d'un cluster miroir [+]

Quels sont les avantages du cluster miroir [+]

Quel est le temps de reprise (RTO) dans un cluster miroir [+]

Quelle est la perte de données (RPO) dans un cluster miroir [+]

Installation de SafeKit pour la haute disponibilité de Oracle avec réplication synchrone et basculement

Installation du package sur Windows

Sur les deux serveurs Windows

Installation du package sur Linux

Sur les deux serveurs Linux

Instructions de configuration

La configuration est présentée avec la console web connectée à 2 serveurs Windows mais c'est la même chose avec 2 serveurs Linux.

Important : toute la configuration est réalisée à partir d'un seul navigateur.

Lancez la console Web dans un navigateur en vous connectant à http://localhost:9010 (image suivante)

Démarrer la console Web SafeKit pour configurer Oracle

Entrez l'adresse IP du premier nœud et cliquez sur Confirm (image suivante)

Console Web SafeKit - premier nœud dans le cluster Oracle

Cliquez sur New node et entrez l'adresse IP du deuxième nœud (image suivante)

Console Web SafeKit - second nœud dans le cluster Oracle

Cliquez sur la disquette rouge pour sauvegarder la configuration (image précédente)

Dans l'onglet Configuration, cliquez sur oracle.safe puis entrez oracle comme nom du module et cliquez sur Confirm : images suivantes avec oracle au lieu de xxx

Console Web SafeKit - démarrer la configuration des services Oracle  console Web SafeKit - entrez le nom du module Oracle

Cliquez sur Validate (image suivante)

Console Web SafeKit - entrez les nœuds du module Oracle

Modifiez le chemin des répertoires répliqués uniquement si nécessaire (image suivante) et entrez une adresse IP virtuelle. Une adresse IP virtuelle est une nouvelle adresse IP inutilisée dans le même réseau IP que les adresses IP des deux nœuds. L'adresse IP virtuelle bascule automatiquement en cas de panne.

Console Web SafeKit - entrer les paramètres du module Oracle

Pour information:

Cliquez sur Validate (image précédente)

Console Web SafeKit - arrêtez le module Oracle avant la configuration

Cliquez sur Configure (image précédente)

Console Web SafeKit - vérifier le message succès vert de la configuration du module Oracle

Vérifiez le message succès vert sur les deux serveurs et cliquez sur Next (image précédente). Sous Linux, vous pouvez avoir une erreur à cette étape si les répertoires répliqués sont des points de montage. Voir cet article pour résoudre le problème.

Console Web SafeKit - sélectionnez le nœud Oracle avec les données à jour

Sélectionnez le nœud avec les répertoires répliqués les plus récents et cliquez sur Start it pour effectuer la première resynchronisation dans la bonne direction (image précédente). Avant cette opération, nous vous suggérons de faire une copie des répertoires répliqués avant de démarrer le cluster pour éviter toute erreur.

Console Web SafeKit - le premier nœud Oracle démarre en tant que primaire et est seul

Démarrer le deuxième nœud (image précédente) qui devient SECOND vert (image suivante) après la resynchronisation de tous les répertoires répliqués (copie binaire du nœud 1 vers le nœud 2).

console Web SafeKit - le second nœud Oracle démmarre en tant que SECOND

Le cluster est opérationnel avec les services Oracle s'exécutant sur le nœud PRIM et ne s'exécutant pas sur le nœud SECOND (image précédente). Seules les modifications à l'intérieur des fichiers sont répliquées en temps réel dans cet état.

Attention, les composants qui sont clients des services Oracle doivent être configurés avec l'adresse IP virtuelle. La configuration peut être effectuée avec un nom DNS (si un nom DNS a été créé et associé à l'adresse IP virtuelle).

Tests

Vérifiez avec la console Microsoft Management Console (MMC) sous Windows ou avec des lignes de commande sous Linux que les services Oracle sont démarrés sur le serveur primaire et arrêtés sur le serveur secondaire. Mettez les services Oracle avec Type de démarrage au boot = Manuel (SafeKit contrôle le démarrage des services Oracle).

Arrêtez le nœud PRIM en faisant défiler le menu du nœud primaire et en cliquant sur Stop. Vérifiez qu'il y a un basculement sur le nœud SECOND. Et vérifiez le basculement des services Oracle avec la console Microsoft Management Console (MMC) sous Windows ou avec des lignes de commande sous Linux.

Pour comprendre ce qui se passe dans le cluster, consultez les journaux SafeKit du serveur primaire et du serveur secondaire.

Pour voir le journal du module sur le serveur primaire (image suivante) :

Console Web SafeKit - Journal du module du serveur Oracle PRIM

Pour voir le journal applicatif du serveur primaire (image suivante) :

Console Web SafeKit - Application log du serveur Oracle PRIM

Pour voir les journaux du serveur secondaire (image précédente), cliquez à gauche sur W12R2server75/SECOND (il deviendra bleu) et répétez les mêmes opérations. Vous trouverez dans le log du module secondaire le volume et le temps de réintégration des données répliquées.

Configuration avancée

Dans l'onglet Advanced Configuration, vous pouvez modifier les fichiers internes au module : bin/start_prim et bin/stop_prim et conf/userconfig.xml (image suivante sur le côté gauche). Si vous faites des changements dans les fichiers internes ici, vous devez appliquer la nouvelle configuration par un clic droit sur l'icône bleue/xxx sur le côté gauche (image suivante) : l'interface vous permettra de redéployer les fichiers modifiés sur les deux serveurs.

Configure boot start (image suivante sur le côté droit) configure le démarrage automatique du module au boot du serveur. Effectuez cette configuration sur les deux serveurs une fois que la solution de haute disponibilité fonctionne correctement.

Console Web SafeKit - Démarrage automatique au boot du module Oracle

Support

Pour obtenir de l'aide sur le centre d'appel de https://support.evidian.com, prenez 2 Snaphots (2 fichiers .zip), un pour chaque serveur et téléchargez-les dans l'outil du centre d'appel (image suivante).

Console Web SafeKit - Snaphots du module Oracle pour le support

Fichiers internes au module Windows oracle.safe

userconfig.xml


<!DOCTYPE safe>
<safe>
<macro name="ORACLE_SID" value="ORACLE_SID_TO_BE_DEFINED" />
<macro name="ORACLE_HOME_NAME" value="ORACLE_HOME_NAME_TO_BE_DEFINED" />
<service mode="mirror" defaultprim="alone" maxloop="3" loop_interval="24" failover="on">
  <!-- Heartbeat Configuration -->
  <!-- Names or IP addresses on the default network are set during initialization in the console -->
  <heart pulse="700" timeout="30000">
    <heartbeat name="default" ident="flow">
    </heartbeat>
  </heart>
  <!-- Virtual IP Configuration (used by Oracle SQL*Net Listener) -->
  <!-- Replace
     * VIRTUAL_TO_BE_DEFINED by the IP address of your virtual server 
  --> 
  <vip>
    <interface_list>
        <interface check="on" arpreroute="on">
           <real_interface>
               <virtual_addr addr="VIRTUAL_TO_BE_DEFINED" where="one_side_alias" />
          </real_interface>
        </interface>
    </interface_list>
  </vip>
  <!-- Software Error Detection Configuration -->
  <errd polltimer="10">
    <!-- Oracle databases 
    For monitoring one specific oracle instance, insert the attribute
    argregex="{.*SID.*}" where SID is the name of the DataBase
    -->
    <proc name="oracle.exe" atleast="1" action="restart" class="prim" />
    <proc name="tnslsnr.exe" atleast="1" action="restart" class="prim" />
  </errd>
  <!-- File Replication Configuration -->
  <!-- Replace
     * ORACLE_DATA_TO_BE_DEFINED by the path of your Oracle database directory and transaction logs
  -->
  <rfs async="second" acl="off" nbrei="3">
    <replicated dir="ORACLE_DATA_TO_BE_DEFINED" mode="read_only" />
  </rfs>
  <!-- User scripts Configuration / Environment variables -->
  <user nicestoptimeout="300" forcestoptimeout="300" logging="userlog">
    <var name="ORACLE_SID" value="%ORACLE_SID%" /> <!-- values defined in macro above -->
    <var name="ORACLE_HOME_NAME" value="%ORACLE_HOME_NAME%" />
  </user>
</service>
</safe>

start_prim.cmd

@echo off
rem Script called on the primary server for starting application services 

rem For logging into SafeKit log use:
rem "%SAFE%\safekit" printi | printe "message"

rem stdout goes into Application log
echo "Running start_prim %*" 

set res=0

net start "OracleDbConsole%ORACLE_SID%" > nul
if not %errorlevel% == 0 goto stop
%SAFE%\safekit printi "OracleDbConsole%ORACLE_SID% started"

net start "OracleService%ORACLE_SID%" > nul
if not %errorlevel% == 0 goto stop
%SAFE%\safekit printi "OracleService%ORACLE_SID% started"

net start "Oracle%ORACLE_HOME_NAME%TNSListener" > nul
if not %errorlevel% == 0 goto stop
%SAFE%\safekit printi "Oracle%ORACLE_HOME_NAME%TNSListener started"

if %res% == 0 goto end

:stop
set res=%errorlevel%
%SAFE%\safekit printi "Oracle start failed"

rem uncomment to stop SafeKit when critical
rem %SAFE%\safekit stop -i "start_prim"

:end

stop_prim.cmd

@echo off
rem Script called on the primary server for stopping application services 

rem ----------------------------------------------------------
rem
rem 2 stop modes:
rem
rem - graceful stop
rem   call standard application stop with net stop
rem
rem - force stop (%1=force)
rem   kill application's processes
rem
rem ----------------------------------------------------------

rem For logging into SafeKit log use:
rem "%SAFE%\safekit" printi | printe "message"

rem stdout goes into Application log
echo "Running stop_prim %*" 

set res=0

rem default: no action on forcestop
if "%1" == "force" goto end

net stop OracleService%ORACLE_SID% > nul
%SAFE%\safekit printi "OracleService%ORACLE_SID% stopped"

net stop  OracleDBConsole%ORACLE_SID% > nul
%SAFE%\safekit printi "OracleDBConsole%ORACLE_SID% stopped"

net stop  Oracle%ORACLE_HOME_NAME%TNSListener > nul
%SAFE%\safekit printi "Oracle%ORACLE_HOME_NAME%TNSListener stopped"

rem wait a little for a real stop of services
%SAFEBIN%\sleep 10

:end

Fichiers internes au module Linnux oracle.safe

userconfig.xml

<!DOCTYPE safe>
<safe>
<macro name="ORACLE_HOME" value="PATH_TO_BE_DEFINED" />
<macro name="ORACLE_DBA" value="USER_TO_BE_DEFINED" />
<service mode="mirror" defaultprim="alone" maxloop="3" loop_interval="24" failover="on">
  <!-- Heartbeat Configuration -->
  <!-- Names or IP addresses on the default network are set during initialization in the console -->
  <heart pulse="700" timeout="30000">
    <heartbeat name="default" ident="flow">
    </heartbeat>
  </heart>
  <!-- Virtual IP Configuration (used by Oracle SQL*Net Listener) -->
  <!-- Replace
  * VIRTUAL_TO_BE_DEFINED by the IP address of your virtual server
  -->
  <vip>
    <interface_list>
      <interface check="on" arpreroute="on">
        <real_interface>
          <virtual_addr addr="VIRTUAL_TO_BE_DEFINED" where="one_side_alias" />
        </real_interface>
      </interface>
    </interface_list>
  </vip>
  <!-- Software Error Detection Configuration -->
  <errd polltimer="10">
    <!-- Oracle databases
    For monitoring one specific oracle instance, insert the attribute
    argregex=".*SID$" where SID is the name of the DataBase
    -->
    <proc name="oracle" nameregex="ora_.*" atleast="1" action="restart" class="prim" />
    <proc name="tnslsnr" atleast="1" action="restart" class="prim" />
  </errd>
  <!-- File Replication Configuration -->
  <!-- Replace
  * ORACLE_DATA_TO_BE_DEFINED by the path of your Oracle database directory and transaction logs
  -->
  <rfs mountover="off" packetsize="32768" async="second" acl="off" nbrei="3">
    <replicated dir="ORACLE_DATA_TO_BE_DEFINED" mode="read_only" />
  </rfs>
  <!-- User scripts Configuration / Environment variables -->
  <user nicestoptimeout="300" forcestoptimeout="300" logging="userlog">
    <var name="ORACLE_HOME" value="%ORACLE_HOME%" /> <!-- values defined in macro above -->
    <var name="ORACLE_DBA" value="%ORACLE_DBA%" />
  </user>
</service>
</safe>

start_prim

#!/bin/sh
# Script called on the primary server for starting applications

# For logging into SafeKit log use:
# $SAFE/safekit printi | printe "message" 

#---------- Clean Oracle residual processes and shared memory
# Call this function before starting any Oracle databases 
# to clean eventual resual Oracle processes and IPC
clean_oracle()
{
  retval=0

  $SAFE/safekit printw "Cleaning Oracle processes and shared memory"

  # kill started Oracle databases
  ps -e -o pid,comm |grep ora | $AWK '{print "kill " $1}'| sh >/dev/null 2>&1

  # delete oracle shared memory to start in a clean state
  case $OSNAME in
 	   Linux)
	        ipcs -m |grep oracle |$AWK '{print "shm "$2 | "xargs ipcrm"}' >/dev/null 2>&1
		ipcs -s |grep oracle |$AWK '{print "sem "$2 | "xargs ipcrm"}' >/dev/null 2>&1
		;;
 	   *)
	        ipcs -m |grep oracle |$AWK '{print "-m "$2 | "xargs ipcrm"}' >/dev/null 2>&1
		ipcs -s |grep oracle |$AWK '{print "-s "$2 | "xargs ipcrm"}' >/dev/null 2>&1
		;;
  esac

  if [ -f $ORACLE_HOME/dbs/sgadef*.dbf ]; then          
    rm $ORACLE_HOME/dbs/sgadef*.dbf                   
  fi                                               

  return $retval
}

#---------- Oracle Databases
# Call this function for starting Oracle Databases        
start_oracle()
{
  retval=0

  $SAFE/safekit printw "Starting Oracle databases"

  # Oracle - Database Starting 
  /bin/su - $ORACLE_DBA -c "$ORACLE_HOME/bin/dbstart $ORACLE_HOME" #> /dev/console 2>&1   
  if [ $? -ne 0 ] ; then 
    $SAFE/safekit printw "Oracle databases start failed"
#    retval=1
  else
    $SAFE/safekit printw "Oracle databases started"
  fi

  return $retval
}

#---------- Oracle SQL*Net Listener
# Call this function for starting Oracle Listener
start_listener()
{
  retval=0

  # Oracle - Listener Starting
  LISTENER_STATE=`$SAFEBIN/killit list tnslsnr`     
  if [ "$LISTENER_STATE" != "" ]; then              
    $SAFE/safekit printw "Oracle Listener already started"         
    return $retval                                  
  fi                                                

  $SAFE/safekit printw "Starting Oracle Listener"
  /bin/su - $ORACLE_DBA -c "$ORACLE_HOME/bin/lsnrctl start" #> /dev/console 2>&1
  if [ $? -ne 0 ] ; then
    $SAFE/safekit printw "Oracle Listener start failed"
  else
    $SAFE/safekit printw "Oracle Listener started"
  fi

  return $retval
}

# stdout goes into Application log
echo "Running start_prim $*" 

res=0

[ -z "$OSNAME" ] && OSNAME=`uname -s`
OSNAME=`uname -s`
case "$OSNAME" in
    Linux)
	AWK=/bin/awk
	;;
    *)
	AWK=/usr/bin/awk
	;;
esac

# stdout goes into Application log
echo "Running start_prim $*" 

# TODO
# remove oracle boot start  

# WARNING: all databases defined in /etc/oratab are started
#

# Clean Oracle residual processes and shared memory to start Oracle databases in a clean state
clean_oracle || res=$?

# Start Oracle databases
start_oracle || res=$?

# Start SQL*Net Listener Oracle
start_listener || res=$?

if [ $res -ne 0 ] ; then
  $SAFE/safekit printi "start_prim failed"

  # uncomment to stop SafeKit when critical
  # $SAFE/safekit stop -i "start_prim"
fi

exit 0

stop_prim

#!/bin/sh
# Script called on the primary server for stopping applications

# For logging into SafeKit log use:
# $SAFE/safekit printi | printe "message" 

#----------------------------------------------------------
#
# 2 stop modes:
#
# - graceful stop
#   call standard application stop
#
# - force stop ($1=force)
#   kill application's processes
#
#----------------------------------------------------------

#---------- Clean Oracle residual processes and shared memory
# Call this function on force stop 
# to clean eventual resual Oracle processes and IPC
clean_oracle()
{
  retval=0

  $SAFE/safekit printw "Cleaning Oracle processes and shared memory"

  # kill started Oracle databases
  ps -e -o pid,comm |grep ora | $AWK '{print "kill -9 " $1}'| sh >/dev/null 2>&1

  # delete oracle shared memory to start in a clean state
  case $OSNAME in
 	   Linux)
	        ipcs -m |grep oracle |$AWK '{print "shm "$2 | "xargs ipcrm"}' >/dev/null 2>&1
		ipcs -s |grep oracle |$AWK '{print "sem "$2 | "xargs ipcrm"}' >/dev/null 2>&1
		;;
 	   *)
	        ipcs -m |grep oracle |$AWK '{print "-m "$2 | "xargs ipcrm"}' >/dev/null 2>&1
		ipcs -s |grep oracle |$AWK '{print "-s "$2 | "xargs ipcrm"}' >/dev/null 2>&1
		;;
  esac

  if [ -f $ORACLE_HOME/dbs/sgadef*.dbf ]; then          
    rm $ORACLE_HOME/dbs/sgadef*.dbf                   
  fi                                               

  return $retval
}

#---------- Oracle SQL*Net Listener
# Call this function for stopping Oracle Listener
stop_listener()
{
  retval=0

  if [ "$1" = "force" ] ; then
    # Oracle Listener force stop
    $SAFEBIN/killit +KILL tnslsnr 1>/dev/null 2>&1
    return $retval
  fi

  # Oracle - Listener stopping
  LISTENER_STATE=`$SAFEBIN/killit list tnslsnr`            
  if [ "$LISTENER_STATE" = "" ]; then                      
    $SAFE/safekit printw "Oracle Listener already stoppped"               
    return $retval                                         
  fi            

  $SAFE/safekit printw "Stopping Oracle Listener"
  /bin/su - $ORACLE_DBA -c "$ORACLE_HOME/bin/lsnrctl stop" #> /dev/console 2>&1
  if [ $? -ne 0 ] ; then
    $SAFE/safekit printw "Oracle Listener stop failed"
  else
    $SAFE/safekit printw "Oracle Listener stopped"
  fi

  return $retval
}

#---------- Oracle databases
# Call this function for stopping Oracle databases
stop_oracle()
{
  retval=0

  if [ "$1" = "force" ] ; then
    # Oracle databases force stop
    clean_oracle
    return $retval
  fi

  # Oracle databases gracefull stop

  # First stop the startup - shutdown command if it is running
  $SAFEBIN/killit +TERM dbstart dbshut> /dev/null 2>&1 

  # Kill oracle connections that prevent Oracle from stopping gracefully   
  ps -e -o pid,args |grep LOCAL=NO |$AWK '{print "kill " $1}'| sh > /dev/null 2>&1        
  ps -e -o pid,args |grep LOCAL=YES |$AWK '{print "kill " $1}'| sh > /dev/null 2>&1        

  $SAFE/safekit printw "Stopping Oracle databases"  
  /bin/su - $ORACLE_DBA -c "$ORACLE_HOME/bin/dbshut $ORACLE_HOME" #> /dev/console 2>&1
  if [ $? -ne 0 ] ; then 
    $SAFE/safekit printw "Oracle databases stop failed"
  else
    $SAFE/safekit printw "Oracle databases stopped"  
  fi

  return $retval
}

# stdout goes into Application log
echo "Running stop_prim $*" 

res=0

[ -z "$OSNAME" ] && OSNAME=`uname -s`
case "$OSNAME" in
    Linux)
	AWK=/bin/awk
	;;
    *)
	AWK=/usr/bin/awk
	;;
esac

mode=
if [ "$1" = "force" ] ; then
  mode=force
  shift
fi

# WARNING: all databases defined in /etc/oratab are stopped                    

# Stop Oracle SQL*Net Listener
stop_listener $mode || res=$?

# Stop Oracle databases 
stop_oracle $mode || res=$?

[ $res -ne 0 ] && $SAFE/safekit printi "stop_prim failed"

exit 0
contact
CONTACT
Démonstration

Evidian SafeKit Prix





Livres blancs

NEWS

Pour recevoir des informations d'Evidian, veuillez remplir le formulaire suivant.