Apache : le cluster le plus simple avec équilibrage de charge et haute disponibilité

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

Evidian SafeKit apporte l'équilibrage de charge réseau et la haute disponibilité à Apache (HTTP Server). Cet article explique comment mettre en œuvre rapidement un cluster Apache avec équilibrage de charge sans boîtiers réseaux, ni serveurs proxy dédiés au load balancing. SafeKit est installé directement sur les serveurs Apache. Le module de haute disponibilité apache_farm.safe et un essai gratuit sont offerts dans la section installation.

Notez que vous pouvez mettre en œuvre avec le même produit la réplication en temps réel et le basculement de l'application back-end comme Microsoft SQL Server, PostgreSQL ou d'autres applications : voir des exemples de modules miroirs ici.

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é d'administration.

Comment le logiciel Evidian SafeKit met en œuvre simplement l'équilibrage de charge Apache et la haute disponibilité sans boîtiers réseaux, ni serveurs proxy dédiés

Comment Evidian SafeKit met en œuvre l'équilibrage de charge Windows et la haute disponibilité

Sur la figure précédente, l'application Apache tourne sur les 3 serveurs. Les utilisateurs sont connectés à une adresse IP virtuelle qui est configurée localement sur chaque serveur de la ferme.

Le trafic du réseau à destination de l'adresse IP virtuelle est reçu par l'ensemble des serveurs. Puis ce trafic est distribué entre les serveurs grâce à un filtre chargé dans le noyau du système d'exploitation de chaque serveur.

L'algorithme de load balancing dans le filtre est basé sur l'identité des paquets client (adresse IP client, port TCP client). Suivant l'identité du paquet client en entrée, seul un filtre dans un serveur accepte le paquet ; les autres filtres dans les autres serveurs le rejettent.

Une fois un paquet accepté par le filtre sur un serveur, seuls le CPU et la mémoire de ce serveur sont utilisés par l'application Apache qui répond à la requête du client. Les messages de retour de l'application Apache sont envoyés directement du serveur vers le client.

Lorsqu'un serveur est défaillant, le protocole de gestion du groupe des serveurs en vie reconfigure les filtres pour redistribuer le trafic vers les serveurs disponibles.

Démonstration d'un module ferme

Cette démonstration d'un module ferme générique farm.safe est réalisée avec la configuration d'Apache mais la configuration est la même avec d'autres applications. Notez qu'avec le module apache_farm.safe à la place du module générique, les scripts de redémarrage sont préconfigurés pour Apache.

Clients

Différenciateurs clés de la solution d'équilibrage de charge et de haute disponibilité Apache avec le cluster ferme d'Evidian SafeKit

Cluster ferme d'Evidian SafeKit avec load balancing et reprise sur panne

Pas de load balancer, ni de serveur proxy dédié, ni d'adresse Ethernet multicast spéciale No load balancer or dedicated proxy servers

Like   La solution ne nécessite pas de load balancer, ni de serveur proxy en amont de la ferme pour implémenter le load balancing. SafeKit est installé directement sur les serveurs applicatifs à load balancer. Le load balancing est basé sur une adresse IP virtuelle/adresse MAC Ethernet standard et fonctionne avec des serveurs physiques et des machines virtuelles sur Windows et Linux sans configuration réseau spéciale

Dislike  Ce n'est pas le cas avec les load balancers réseau

Dislike  Ce n'est pas le cas avec les proxys dédiés sur Linux

Dislike  Ce n'est pas le cas avec une adresse Ethernet multicast spéciale sur Windows

Toutes les fonctionnalités de clustering All clustering features

Like   La solution inclut toutes les fonctionnalités de clustering : adresse IP virtuelle, load balancing sur adresse IP client ou sur sessions, surveillance des pannes de serveurs, surveillance des pannes réseaux, surveillance des pannes logicielles, redémarrage automatique de Apache avec un temps de reprise rapide, une option de réplication avec un module miroir

Dislike  Ce n'est pas le cas avec les autres solutions de load balancing. Elles sont capables de réaliser le load balancing mais elle n'inclut pas une solution de clustering complète avec des scripts de redémarrage et un redémarrage automatique de Apache en cas de défaillance. Elles n'offrent pas l'option de réplication

Like   La configuration du cluster est très simple et réalisée au moyen d'un module de haute disponibilité applicatif. Il n'y a pas de contrôleur de domaine et d'Active Directory à configurer sur Windows. La solution fonctionne sur Windows et Linux

Sites distants Remote sites

Like   Si les serveurs sont connectés au même réseau IP via un réseau local étendu entre des sites distants, l’adresse IP virtuelle de SafeKit fonctionne avec un équilibrage de charge au niveau 2

Like   Si les serveurs sont connectés à des réseaux IP différents entre des sites distants, l'adresse IP virtuelle peut être configurée au niveau d'un load balancer. SafeKit propose un "health check": le load balancer est configuré avec une URL gérée par SafeKit qui renvoie OK sur les serveurs UP et NOT FOUND sinon. Cette solution est implémentée pour SafeKit dans le Cloud mais elle peut être également mise en œuvre avec un load balancer sur site. Ainsi, vous pouvez profiter de toutes les fonctionnalités de clustering de SafeKit, y compris une administration facile du cluster via la console Web de SafeKit

Solution de haute disponibilité uniforme Uniform high availability solution

Like  SafeKit implémente un cluster ferme avec load balancing et reprise sur panne. Mais il implémente aussi un cluster miroir avec réplication et reprise sur panne. Ainsi une architecture N-tiers peut-être rendue hautement disponible et load balancée avec la même solution sur Windows et Linux (même installation, configuration, administration avec la console SafeKit ou avec les commandes en ligne). Ceci est unique sur le marché

Dislike  Ce n'est pas le cas avec une architecture mixant des technologies différentes pour le load balancing, la réplication et la reprise sur panne

FAQ sur Evidian SafeKit [+]

Installation de SafeKit pour l'équilibrage de charge de Apache avec haute disponibilité

Installation du package sur Windows

Installation du package sur 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 doit être 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 Apache

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

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

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 Apache

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

Dans l'onglet Configuration, cliquez sur apache_farm.safe (xxx.safe dans l'image suivante) puis entrez apache_farm comme nom du module et cliquez sur Confirm (la console trouve apache_farm.safe dans le répertoire demo/ que vous avez précédemment rempli)

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

Cliquez sur Validate (image suivante)

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

Définissez l'adresse IP virtuelle du cluster, le port TCP du service à load balancer et le critère sur adresse IP source ou sur port TCP source (image suivante).

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'équilibrage de charge sera fait sur l'adresse IP virtuelle/port TCP suivant le critère. Cet article explique la différence entre le critère adresse IP source et le critère port TCP source.

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

Pour information:

Cliquez sur Validate (image précédente)

Console Web SafeKit - arrêtez le module Apache 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 Apache

Vérifiez le message succès vert sur les deux serveurs et cliquez sur Next (image précédente)

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

Cliquez sur Start pour démarrer le cluster sur les deux nœuds (image précédente). Vérifiez que l'état passe à UP (vert) - UP (vert) (image suivante).

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

Le cluster est opérationnel avec les services Apache s'exécutant sur les deux nœuds UP (image précédente).

Attention, les composants qui sont clients des services Apache 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 Apache ont été démarrés sur les deux nœuds UP par le script start_both. Mettez les services Apache avec Type de démarrage au boot = Manuel (SafeKit contrôle le démarrage des services Apache dans start_both / stop_both).

Arrêtez un nœud UP en faisant défiler le menu du nœud et en cliquant sur Stop. Vérifiez que l'équilibrage de charge est reconfiguré avec uniquement l'autre nœud prenant toutes les connexions TCP. Et vérifiez que les services Apache sont arrêtés sur le nœud STOP avec la console Microsoft Management Console (MMC) sous Windows ou avec des lignes de commande sous Linux.

Journaux d'évènements du module et de l'application

Pour voir le journal du module sur le nœud 1 qui contient les évènements dans le cluster (image suivante) :

Console Web SafeKit - Journal du module du serveur Apache PRIM

Pour voir le journal applicatif du nœud 1 qui contient les messages de sortie des scripts de redémarrage start_both et stop_both (image suivante) :

Console Web SafeKit - Application log du serveur Apache PRIM

Pour voir les journaux du nœud 2 (image précédente), cliquez à gauche sur W12R2server75/UP (il deviendra bleu) et répétez les mêmes opérations.

Configuration avancée

Dans l'onglet Advanced Configuration (image suivante), vous pouvez modifier les fichiers internes du module : bin/start_both et bin/stop_both 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.

Console Web SafeKit - Configuration avancée du module Apache

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 nœuds une fois que la solution Apache d'équilibrage de charge et de haute disponibilité fonctionne correctement.

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

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 Apache pour le support

Fichiers internes au module Windows apache_farm.safe

userconfig.xml

<!DOCTYPE safe>
<safe>
<macro name="VIRTUAL_IP" value="VIRTUAL_IP_TO_BE_DEFINED" />
<macro name="APACHE_PORT" value="TCP_PORT_TO_BE_DEFINED" />
<service mode="farm" maxloop="3" loop_interval="24">
  <!-- Farm topology configuration for the membership protocol -->
  <!-- Names or IP addresses on the default network are set during initialization in the console -->
  <farm>
    <lan name="default" />
  </farm>
  <!-- Virtual IP Configuration -->
  <!-- Use VIRTUAL_IP defined in macro above -->
  <vip>
    <interface_list>
      <interface check="on" arpreroute="on">
        <virtual_interface type="vmac_directed">
          <virtual_addr addr="%VIRTUAL_IP%" where="alias"/>
        </virtual_interface>
      </interface>
    </interface_list>
    <loadbalancing_list>
      <group name="APACHE">
        <!-- Set load-balancing rule on APACHE_PORT defined in macro above -->
        <rule port="%APACHE_PORT%" proto="tcp" filter="on_addr"/>
      </group>
    </loadbalancing_list>
  </vip>
  <!-- TCP Checker Configuration -->
  <!-- Use VIRTUAL_IP and APACHE_PORT defined in macros above -->
  <check>
    <tcp ident="HTTP_APACHE" when="both">
      <to
         addr="%VIRTUAL_IP%"
         port="%APACHE_PORT%"
         interval="10"
         timeout="5"
       />
    </tcp>
  </check>
  <!-- User scripts activation -->
  <user nicestoptimeout="300" forcestoptimeout="300" logging="userlog" />
</service>
</safe>

start_both.cmd

@echo off

rem Script called on all servers for starting applications

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

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

set res=0

net start Apache2
if not %errorlevel% == 0 (
  %SAFE%\safekit printi "Apache start failed"
) else (
  %SAFE%\safekit printi "Apache started"
)

set res=%errorlevel%
if %res% == 0 goto end

:stop
set res=%errorlevel%
"%SAFE%\safekit" printe "start_both failed"

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

:end

stop_both.cmd

@echo off

rem Script called on all servers for stopping application

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

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 stdout goes into Application log
echo "Running stop_both %*" 

set res=0

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

%SAFE%\safekit printi "Stopping Apache..."
net stop Apache2

rem If necessary, uncomment to wait for the real stop of services
rem "%SAFEBIN%\sleep" 10

if %res% == 0 goto end

"%SAFE%\safekit" printe "stop_both failed"

:end

Fichiers internes au module Linux apache_farm.safe

userconfig.xml

<!DOCTYPE safe>
<safe>
<macro name="VIRTUAL_IP" value="VIRTUAL_IP_TO_BE_DEFINED" />
<macro name="APACHE_PORT" value="TCP_PORT_TO_BE_DEFINED" />
<service mode="farm" maxloop="3" loop_interval="24">
  <!-- Farm topology configuration for the membership protocol -->
  <!-- Names or IP addresses on the default network are set during initialization in the console -->
  <farm>
    <lan name="default" />
  </farm>
  <!-- Virtual IP Configuration -->
  <!-- Use VIRTUAL_IP defined in macro above -->
  <vip>
    <interface_list>
      <interface check="on" arpreroute="on">
        <virtual_interface type="vmac_directed">
          <virtual_addr addr="%VIRTUAL_IP%" where="alias"/>
        </virtual_interface>
      </interface>
    </interface_list>
    <loadbalancing_list>
      <group name="APACHE">
        <!-- Set load-balancing rule on APACHE_PORT defined in macro above -->
        <rule port="%APACHE_PORT%" proto="tcp" filter="on_addr"/>
      </group>
    </loadbalancing_list>
  </vip>
  <!-- TCP Checker Configuration -->
  <!-- Use VIRTUAL_IP and APACHE_PORT defined in macros above -->
  <check>
    <tcp ident="HTTP_APACHE" when="both">
      <to
         addr="%VIRTUAL_IP%"
         port="%APACHE_PORT%"
         interval="10"
         timeout="5"
       />
    </tcp>
  </check>
  <!-- User scripts activation -->
  <user nicestoptimeout="300" forcestoptimeout="300" logging="userlog" />
</service>
</safe>

start_both

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

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

#---------- Clean Apache residual processes 
# Call this function before starting Apache 
# to clean eventual resual Apache processes
clean_Apache()
{
  retval=0

  $SAFE/safekit printw "Cleaning Apache processes"

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

  return $retval
}

#---------- Apache
# Call this function for starting Apache Server
start_Apache()
{
  retval=0

  $SAFE/safekit printw "Starting Apache Server"

  # Apache - Starting 
  service httpd start   
  if [ $? -ne 0 ] ; then 
    $SAFE/safekit printw "Apache server start failed"
  else
    $SAFE/safekit printw "Apache server started"
  fi

  return $retval
}

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

res=0

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

# TODO
# remove Apache boot start 

# Clean Apache residual processes 
clean_Apache || res=$?

# Start Apache
start_Apache || res=$?

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

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

exit 0

stop_both

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

# 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 Apache residual processes
# Call this function on force stop 
# to clean eventual resual Apache processes 
clean_Apache()
{
  retval=0

  $SAFE/safekit printw "Cleaning Apache processes "

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

  return $retval
}

#---------- Apache
# Call this function for stopping Apache
stop_Apache()
{
  retval=0

  if [ "$1" = "force" ] ; then
    # Apache force stop
    clean_Apache
    return $retval
  fi

  # Apache graceful stop
  $SAFE/safekit printw "Stopping Apache server"  
  service httpd stop
  if [ $? -ne 0 ] ; then 
    $SAFE/safekit printw "Apache server stop failed"
  else
    $SAFE/safekit printw "Apache server stopped"  
  fi

  return $retval
}

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

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

# Stop Apache  server 
stop_Apache $mode || res=$?

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

exit 0