cluster Tomcat 6 Configuration d?un cluster Tomcat 6

Transcription

cluster Tomcat 6 Configuration d?un cluster Tomcat 6
Clustertomcat6
cluster Tomcat 6
Configuration d?un cluster Tomcat 6
Lors de la mise en place d?un cluster avec Tomcat 6, il est indispensable de garantir l?intégrité des applications
entre les instances. En effet, il n?y a pas à l?heure actuelle d?outil d?administration permettant de déployer les
applications Web dans un cluster Tomcat 6, les applications doivent être installées individuellement sur chacune
des instances de serveur.
Un tel outil possède évidement une très grande valeur ajoutée car il permet la distribution automatique des
applications vers toutes les instances, y compris si elles se trouvent sur des machines différentes.
Consciente de ce manque, l?équipe de développeurs de Tomcat s?est penché sur la question et un outil de ce type
devrait apparaître dans les prochaines versions de Tomcat.
Installer plusieurs instances de Tomcat 6 sur la même machine
Pour permettre à plusieurs instances de Tomcat 6 de s?exécuter sur la même machine, l?installation des instances
du serveur est un peu particulière. En effet, une première contrainte impose à chacune des instances d?utiliser des
ports TCP/IP distincts pour éviter les conflits, mais il n?est pas possible de simplement décompresser l?archive ZIP
du serveur à deux endroits différents pour avoir deux instances, car il ne peut y avoir qu?une seule variable
d?environnement CATALINA_HOME.
La solution consiste à utiliser la variable d?environnement CATALINA_BASE. Cette variable permet de faire
référence au répertoire contenant la configuration spécifique d?une instance. Lorsqu?une seule instance de Tomcat
6 fonctionne, la valeur de cette variable est copiée de CATALINA_HOME.
Dans le cas où, par exemple, deux instances de serveur doivent fonctionner sur la même machine, les deux
instances partageront la même variable CATALINA_HOME, mais auront chacune une variable
CATALINA_BASE. Il y a donc une partie commune à ces instances, et une partie qui leur est propre.
Chaque instance de serveur doit posséder :
sa propre configuration (le répertoire conf/),
son propre répertoire logs/,
ses propres répertoires temporaires (work/ et temp/).
Les autres répertoires, c?est-à-dire bin/ et lib/, peuvent être commun, ainsi, les librairies du serveur ne sont pas
dupliquées. Voici un exemple d?arborescence de cluster Tomcat 6 : 08RI01.png
Il faut ensuite créer des scripts de démarrage et d?arrêt spécifiques pour chacune des deux instances, l?objectif est
de positionner la variable CATALINA_BASE puis d?invoquer le script startup.bat ou shutdown.bat, chacun de ces
scripts devant se trouver dans CATALINA_HOME/bin.
Installer plusieurs instances de Tomcat 6 sur la même machine
1
Clustertomcat6
Le script de démarrage de la première instance peut par exemple être nommé startTomcat1.bat, il contient les
lignes suivantes :
set CATALINA_BASE=C:\Cluster\tomcat1 call startup
Le script d?arrêt stopTomcat1.bat :
set CATALINA_BASE=C:\Cluster\tomcat1 call shutdown
Les scripts de la deuxième instance sont identiques, à la valeur près de CATALINA_BASE.
La version Linux de ces scripts n?est pas plus compliquée, par exemple, le script de démarrage de la première
instance peut s?appeler startTomcat1.sh et il contient les lignes suivantes :
1. ! /bin/bash
export CATALINA_BASE=/usr/cluster/tomcat1 . $CATALINA_HOME/bin/startup.sh
Le script d?arrêt quant à lui peut s?appeler stopTomcat1.sh :
1. ! /bin/bash
export CATALINA_BASE=/usr/cluster/tomcat1 . $CATALINA_HOME/bin/shutdown.sh
Ces deux exemples supposent que CATALINA_HOME pointe vers /usr/cluster/.
La dernière étape consiste à faire en sorte que chacune des instances utilise des ports distincts pour le connecteur
HTTP, le connecteur JK, et le port d?arrêt du serveur.
Les deux instances peuvent maintenant être démarrées, en cas de problème, les fichiers journaux de chacune des
instances sont suffisamment explicites sur les erreurs de configuration.
Répartition de charge avec les modules JK
Le chapitre Le serveur Apache Tomcat 6 - Installation et configuration aborde la configuration de Tomcat 6 avec
un serveur frontal Apache HTTP Server ou Microsoft IIS, les modules JK respectifs pour ces serveurs, mod_jk
pour Apache, et le redirecteur ISAPI pour IIS, permettent la mise en ?uvre d?une solution de répartition de charge
et de tolérance de panne.
D?un point de vue de la répartition de charge, les modules JK utilisent un algorithme de répartition de type
Round-Robin , c?est-à-dire que les requêtes sont envoyées alternativement sur chacune des instances, et ce,
toujours dans le même ordre.
Cet algorithme est un des plus utilisé dans le domaine de la répartition de charge car il permet d?équilibrer la
charge sur chacune des instances, il est cependant possible d?affecter un poids plus important à une instance, si elle
se trouve sur une machine plus puissante que les autres par exemple.
Répartition de charge avec les modules JK
2
Clustertomcat6
Cependant, un problème survient lorsqu?il s?agit de gérer les sessions utilisateurs, qui sont conservées sur le
serveur (voir le chapitre La plate-forme JEE 5). En effet, en supposant qu?un client émette une première requête et
qu?il soit dirigé vers la première instance, cette requête va lui créer une session, qui sera conservée dans la
mémoire de la Machine Virtuelle Java de cette instance. Ensuite, si ce même client émet une deuxième requête,
l?algorithme de Round-Robin peut très bien envoyer cette requête vers une autre instance dans ce cas, la session de
ce client est perdue.
Pour éviter ce phénomène, les modules JK utilisent un mécanisme appelé affinité de session . L?affinité de session
permet de garantir qu?à partir du moment où un client se connecte à une application qui utilise les sessions, ce
client sera toujours dirigé vers la même instance de serveur.
Du coté de la tolérance de panne, si une instance de serveur Tomcat 6 ne répond pas à un envoi de requête fait par
le module JK, alors cette instance est marquée indisponible, et le module tente d?envoyer cette requête sur une
autre instance. Répartition de charge et de tolérance de panne avec les modules JK : 08RI02.png
L?objectif est maintenant d?étendre la configuration étudiée au chapitre Le serveur Apache Tomcat 6 - Installation
et configuration pour faire cohabiter plusieurs serveurs Tomcat 6 avec un serveur Web. Les fichiers de
configuration sont les mêmes que ceux qui ont déjà été mis en ?uvre pour une configuration avec un serveur
Tomcat 6 unique.
Configuration avec Apache HTTP Server
Apache utilise son propre fichier de configuration httpd.conf ainsi que le fichier workers.properties pour
communiquer avec Tomcat 6.
Voici, à titre de rappel, un exemple de configuration.
Le fichier de configuration d?Apache httpd.conf :
JkWorkersFile conf/workers.properties JkLogFile logs/mod_jk.log JkLogLevel info JkMount /ListeEmployes
worker1
Le fichier workers.properties :
worker.list=worker1 worker.worker1.type=ajp13 worker.worker1.host=localhost worker.worker1.port=8009
En reprenant l?exemple de cluster proposé au point Configuration d?un cluster Tomcat 6 - Installer plusieurs
instances de Tomcat sur la même machine de ce chapitre, il faut modifier la configuration de telle sorte que
chacune des instances soit associée à un travailleur : voici le fichier workers.properties à utiliser pour cette
configuration :
Pour plus de clarté, les travailleurs portent le nom des instances.
worker.list=tomcat1, tomcat2
worker.tomcat1.type=ajp13 worker.tomcat1.host=localhost worker.tomcat1.port=8109
worker.tomcat2.type=ajp13 worker.tomcat2.host=localhost worker.tomcat2.port=8209
Configuration avec Apache HTTP Server
3
Clustertomcat6
Dans cet exemple, le serveur Web ainsi que les deux instances de Tomcat 6 sont sur la même machine physique,
d?où l?utilisation de la valeur localhost en tant que nom d?hôte, il faut bien sûr adapter ces valeurs en fonction de
l?architecture mise en ?uvre, et utiliser de préférence des adresses IP plutôt que des noms de machines.
Les travailleurs pour chacune des deux instances étant maintenant déclarés, il faut maintenant ajouter un travailleur
supplémentaire responsable de la répartition de charge avec l?algorithme Round-Robin. Ce travailleur est
particulier, car son type n?est pas ajp13, mais lb dans la mesure où il ne communique pas avec Tomcat 6 mais fait
simplement la répartition des requêtes (lb = Load-Balancing). En plus d?avoir un type différent, ce travailleur
utilise un attribut permettant de faire référence à tous les travailleurs qui participent à la répartition de charge, c?est
l?attribut balanced_workers.
Voici le fichier workers.properties modifié avec l?ajout du travailleur supplémentaire, il est nommé balancer. Les
lignes modifiées sont en gras.
worker.list=tomcat1, tomcat2, balancer
worker.tomcat1.type=ajp13 worker.tomcat1.host=localhost worker.tomcat1.port=8109
worker.tomcat2.type=ajp13 worker.tomcat2.host=localhost worker.tomcat2.port=8209
worker.balancer.type=lb worker.balancer.balanced_workers=tomcat1,tomcat2
Il est également possible d?ajouter un attribut supplémentaire sur les travailleurs de type ajp13, l?attribut lbfactor
permet d?affecter un poids aux travailleurs, par défaut cet attribut vaut 1, chaque travailleur reçoit donc une
quantité identique de requête. En donnant la valeur 1 pour cet attribut au travailleur tomcat1, et la valeur 2 au
travailleur tomcat2, le premier reçoit alors deux fois moins de requêtes que le second.
Une fois le fichier workers.properties modifié, la configuration du serveur Apache doit, elle aussi, subir un petit
changement. En effet, le travailleur associé aux applications doit être le travailleur responsable de la répartition de
charge.
Le fichier httpd.conf précédent doit donc être modifié comme ceci :
JkWorkersFile conf/workers.properties JkLogFile logs/mod_jk.log JkLogLevel info JkMount /ListeEmployes
balancer
La configuration du côté du serveur Web est maintenant terminée.
La topologie de cluster présentée précédemment dans ce chapitre est quasiment opérationnelle, il manque
simplement un élément pour permettre l?affinité de session. Il s?agit d?un attribut de configuration à rajouter sur
l?élément <Engine> de chaque instance, c?est l?attribut jvmRoute. Cet attribut doit prendre comme valeur le nom
du travailleur Tomcat 6 qui sera amené à envoyer des requêtes sur cette instance. Il faut donc éditer les fichiers
server.xml des deux instances pour ajouter cet attribut.
Fichier server.xml de la première instance (C:\Cluster\tomcat1\conf\server.xml) :
... <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"> ...
Fichier server.xml de la seconde instance (C:\Cluster\tomcat2\conf\server.xml) :
Configuration avec Apache HTTP Server
4
Clustertomcat6
... <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2"> ...
À noter qu?il n?y a rien de particulier à faire du coté du module JK ou d?Apache pour activer l?affinité de session :
elle l?est par défaut. Par contre, s?il est nécessaire de désactiver ce mécanisme, il faut ajouter l?attribut de
configuration sticky_session sur le travailleur de type lb dans le fichier workers.properties, et lui donner la valeur 0
(Il vaut 1 par défaut).
Exemple :
worker.balancer.sticky_session=0
La configuration est maintenant terminée. Pour la tester, il faut utiliser plusieurs clients, et vérifier que chacun est
bien envoyé sur une instance différente.
Pour tester ce fonctionnement, il suffit juste d?ajouter une page HTML à l?application en cluster, mais qui aura un
contenu différent sur la première instance et sur la seconde, elle peut afficher le nom de l?instance par exemple.
Ensuite, la procédure suivante permet de tester que la tolérance de panne fonctionne correctement.
Démarrer les deux instances de serveur Tomcat 6.
Ouvrir un navigateur Web et demander la page ajoutée précédemment.
Arrêter l?instance qui a servi cette page.
Rafraîchir l?affichage dans le navigateur Web, il doit maintenant afficher la page de l?autre
Configuration avec Microsoft IIS
La configuration avec le serveur Web de Microsoft diffère assez peu de celle réalisée pour Apache, dans la mesure
où IIS utilise également le fichier workers.properties avec exactement la même syntaxe.
La différence réside dans la manière de mettre en relation les applications Web avec les travailleurs, en effet, IIS
utilise pour ceci le fichier uriworkermap.properties. Pour utiliser la même configuration de cluster Tomcat 6 que
précédemment, le fichier uriworkermap.properties doit contenir la ligne suivante :
/ListeEmployes/*=balancer
Pour tester la configuration, la procédure décrite avec Apache fonctionne également très bien avec IIS.
Configuration d?un cluster Tomcat 6 en mode maître/esclave
Avec les versions récentes de mod_jk, il est également possible de configurer un cluster Tomcat 6 en mode
maître/esclave. Dans ce mode de fonctionnement avec deux instances de serveurs par exemple, une seule des deux
instances est active pour satisfaire les demandes utilisateur, la deuxième instance sert uniquement à remplacer la
première en cas de défaillance.
Configuration d?un cluster Tomcat 6 en mode maître/esclave
5
Clustertomcat6
Pour mettre en ?uvre une telle configuration, peu de modifications doivent être apportées à la configuration de
répartition de charge étudiée précédemment, il suffit simplement d?ajouter deux directives au fichier
workers.properties.
Exemple de configuration avec deux serveurs :
worker.list=tomcat1, tomcat2, balancer
worker.tomcat1.type=ajp13 worker.tomcat1.host=localhost worker.tomcat1.port=8109
1. Spécifier quelle instance doit prendre
2. le relais en cas de défaillance (maître)
worker.tomcat1.redirect=tomcat2
worker.tomcat2.type=ajp13 worker.tomcat2.host=localhost worker.tomcat2.port=8209
1. Spécifier que cette instance n?est qu?une instance
2. de secours (esclave)
worker.tomcat2.activation=disabled
worker.balancer.type=lb worker.balancer.balanced_workers=tomcat1,tomcat2
Dans cette configuration, une seule instance est sollicitée pour satisfaire les requêtes utilisateur (tomcat1), la
deuxième (tomcat2) prend le relais en cas de défaillance de la première. Ce type de fonctionnement d?un cluster
Tomcat 6 peut bien sûr être mis en ?uvre avec un nombre de serveurs plus important.
Configuration d?un cluster Tomcat 6 en mode maître/esclave
6