Pages enfant
  • Load Balancing (esup 4)

Principe du Load Balancing

Le load balancing peut permettre à un serveur Apache

  • de répartir la charge de requêtes entre différents serveurs applicatifs Tomcat.
  • de faire du failover

Quelques explications à propos du schéma ci-dessus

  • Les flèches représentent les liens et le protocole utilisé
  • Le texte en couleur représente l'adresse de l'entité de la même couleur
  • L'emplacement des "mod_..." et des propriétés définies dans le filtre (uportal.procotol, uportal.server, ...) représentent l'emplacement de stockage de l'information
  • Le source du schéma est disponible en PJ (Logiciel DIA nécessaire)

La mise en place de ce système est très similaire à la configuration d'un serveur frontal Apache, merci de vous y référer dans un premier temps : on décrira ici simplement la façon d'ajouter un nouveau Tomcat en plus du premier déjà configuré. 

Serveurs Tomcat

Si plusieurs serveurs Tomcat sont hébergés sur la même machine, il faudra ajuster les ports 8005, 8009 (et 8080 si vous le laissez actif) dans conf/server.xml de chaque tomcat. L'idée est de donner des ports différents à chaque.

Exemple :

  1. ent1: 8105, 8180, 8109 
  2. ent2: 8205, 8280, 8209 
  3. etc...

 

On note également que contrairement à beaucoup de documentations, on n'utilisera pas ici la jvmRoute pour permettre à Apache de router et attacher un tomcat spécifique à une session utilisateur.
On utilisera en effet ici une procédure à configurer au niveau du Apache.
La technique du jvmRoute est en effet à considérer lorsque qu'on utilise également la notion de cluster Tomcat, chose qu'on ne décrira pas ici (pour l'instant en tout cas, ... appel à contributions (clin d'œil) ). 

Réglages applicatifs

Chaque Tomcat ainsi configuré va héberger une instance de l'application uPortal. Chacune de ces instance pourra être configurée de façon différente, pour refléter l'adresse réelle du serveur Tomcat, en modifiant le filtre esup.properties.

filters/esup.properties
...
################################################################################
## uPortal server configuration properties                                    ##
################################################################################
environment.build.uportal.server=https://ent.univ.fr
environment.build.real.uportal.server=https://portail1.univ.fr
environment.build.uportal.protocol=https
environment.build.uportal.context=/uPortal
environment.build.real.uportal.context=/uPortal
...

La ligne environment.build.uportal.server désigne l'adresse (et le port si nécessaire) du serveur frontal Apache.

La ligne environment.build.real.uportal.server désigne l'adresse réelle de l'application, à savoir l'adresse et le port du serveur applicatif où ce situe cette instance.

Remarque/rappel : on pourra utiliser un system property java pour environment.build.real.uportal.server ce qui nous évitera ici justement d'avoir des configurations distinctes pour chaque instance !!
CF  Apache frontal (esup 4)#Bonnepratique

 

Ce réglage real est nécessaire dans le cadre de la mise en place du load balancing et pour que le Proxy CAS puisse fonctionner : il permet de communiquer au CAS une URL d'accès sur l'ENT précis sur lequel l'utilisateur (session) est accroché.
environment.build.real.uportal.server indique donc un virtual host où il n'y a pas de répartition de charge, et lié à une seule instance du portail (on contourne ainsi le load balancing pour communiquer directement avec un ENT spécifique).
Il conditionne le bon fonctionnement du proxy CAS.

Serveur Apache

En plus du mod_proxy et mod_proxy_ajp préalablement utilisés, on va utiliser ici le mod_proxy_balancer qui assurera le transfert de charge.

On s'assure que les modules sont bien activés par la présence de ce type de configuration :

Configuration Apache
...
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
...

En lieu et place de 
ProxyPass         / ajp://tomcat1.ent.fr:8009/
dans la configuration du virtualhost on pourra préciser la configuration suivante 


Configuration Apache
<VirtualHost *:80>       
    ...
 
    ProxyPass /balancer-manager !
    #Configuration du load balancing
 
    ProxyPass / balancer://mycluster_uPortal/ 

    <Proxy balancer://mycluster_uPortal>
        # BalancerMember ajp://tomcat0.univ.fr:8009 route=ent0 timeout=60 retry=1 lbset=1
        BalancerMember ajp://tomcat1.univ.fr:8009 route=ent1 timeout=60 retry=1 
        BalancerMember ajp://tomcat2.univ.fr:8009 route=ent2 timeout=60 retry=1 
	    ProxySet stickysession=TOMCAT_STICKY nofailover=Off 
    </Proxy>
    Header add Set-Cookie "TOMCAT_STICKY=sticky.%{BALANCER_WORKER_ROUTE}e;path=/;" env=BALANCER_ROUTE_CHANGED
    
     <Location /balancer-manager>
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1 
        SetHandler balancer-manager
    </Location>
    ...
</VirtualHost>

<VirtualHost> permet de définir un hôte virtuel pour lequel les paramètres de balancing seront appliqués. Plusieurs hôtes peuvent être configurés avec des stratégies différentes.

D'ailleurs pour pouvoir atteindre en https://ent1.univ.fr le tomcat de tomcat1 on configurera un virtualhost 443 avec un ProxyPass direct sur tomcat1 (sans balancer)

La ligne <Proxy balancer> définit un cluster de balancement identifié par le nom situé après Proxy balancer:// . Chaque BalanceMember contenu dans cette balise définit un serveur vers lequel rediriger des requêtes. Ils sont définis via le protocole AJP par l'adresse vers laquelle renvoyer les requêtes. On trouve également le paramètre route qui permettra via un cookie nommé TOMCAT_STICKY ici de router toujours sur le même serveur les requêtes HTTP issues d'une même session utilisateur. La configuration donnée ci-dessus avec le nofailover=Off permet également de rebalancer l'utilisateur sur un autre tomcat en cas de défaillance de celui-ci (avec perte de session ici puisqu'on ne met pas en place la possibilité de cluster tomcat)

La ligne ProxyPass définit :

Concernant les possibilités de paramétrage (nombreuses), merci de vous référer à la doc officielle (cf références en fin de page). 

 

Le code :

<Location /balancer-manager>
     Order deny,allow
     Deny from all
     Allow from 127.0.0.1
     SetHandler balancer-manager
</Location>

définit une interface graphique permettant de visualiser la répartition des charges. Elle est accessible via l'url http://localhost/balancer-manager .
Le paramètre "Deny from all / Allow from 127.0.0.1" est une règle de sécurité qui restreint l'accès à cette interface graphique à la machine qui héberge le serveur Apache (127.0.0.1) : cela permet d'éviter un accès non voulu à la page qui pourrait entrainer un changement dans la configuration du load balancing.

Notez que /balancer-manager est donc fourni par Apache directement et non par Tomcat. La ligne "ProxyPass / balancer://mycluster_uPortal/" indique cependant à tomcat de faire du proxypass (transmettre) toutes les requêtes / au( x) Tomcat(s) (cela nous évite de de le faire pour chacun des contextes /uPortal, /esup-lecture, etc.). Aussi pour que /balancer-manager soit bien servi par apache et non transmis au Tomcat, on a dû ajouter avant ce "ProxyPass / balancer://mycluster_uPortal/" un "ProxyPass /balancer-manager !".

 

 

  • Aucune étiquette