Le module Apache nouvellement découvert mod_cluster semble offrir de nombreux avantages par rapport à mod_jk qui pourrait être utilisé dans le nouvel environnement Apache/Jboss.
Les fonctionnalités suivantes sont répertoriées :
– Configuration dynamique des travailleurs httpd
– Calcul du facteur d'équilibrage de charge côté serveur
– Contrôle précis du cycle de vie des applications Web
– AJP est facultatif
/>– Compatible à partir de JBoss 4.2.x
Autres liens utiles :
http://www.jboss.org/mod_cluster
http://anonsvn.jboss.org/repos/mod_cluster/tags/release/
http://docs.jboss.org /mod_cluster/1.2.0/html/
Les instructions de démarrage se trouvent à :
http://docs.jboss.org/mod_cluster/1.2.0/html/Quick_Start_Guide.html#d0e357
Environnement de test :
Liste des composants d'un environnement de test :
1 VM avec Apache et mod_cluster nouvellement compilés
2 VM avec une application JBoss identique
Créé trois VM comme suit : Hostname Function IP HTTP-Port AJP-Port
testweb APACHE 192.168.100.1 80 n/a
backend1 JVM1 192.168.100.2 6003 6001
backend2 JVM2 192.168.100.3 6003 6001
Test manuel de l'accès direct aux backends :
http://backend1.mondomaine.srv:6003/sysnode/
http://backend2.mondomaine.srv:6003/sysnode/
Créez un nouvel hôte virtuel Apache comme suit : ########################
# Relevant part of httpd.conf
#######################
# Extra modules needed for mod_cluster
LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule slotmem_module modules/mod_slotmem.so
LoadModule manager_module modules/mod_manager.so
LoadModule advertise_module modules/mod_advertise.so
Ajout au contenu de /etc/hosts 192.168.100.1 vhost-01
Contenu de vhosts.conf LogLevel debug
Listen vhost-01:80
NameVirtualHost vhost-01:80
#
#------------ Directives for mod_cluster only---------------
<ifmodule proxy_cluster_module>
# Displays the first 100 sessions IDs in manager interface
# Turn on the session ID display of 100 in the mod_cluster-manager page
MaxsessionId 10000
CreateBalancers 2
MaxContext 10000
</ifmodule>
#
# ------ Build the MCPM Connector and advertize connector on Web server
<ifmodule manager_module>
Listen vhost-01:8081
<Virtualhost vhost-01:8081>
# MCPM configuration
KeepAliveTimeout 60
MaxKeepAliveRequests 0
EnableMCPMReceive
#
CustomLog /www/http_logs/MCPM_connector_acc.log j_common
ErrorLog /www/http_logs/MCPM_connector_err.log
</virtualhost>
</ifmodule>
#
#---------- Managemant console interface ----------------------
<ifmodule manager_module>
Listen vhost-01:8000
<Virtualhost vhost-01:8000>
# mod_cluster Manager interface
<Location /mcm>
SetHandler mod_cluster-manager
Order deny,allow
Deny from all
Allow from env=IP_ALLOWED
# Displays verbose extra info about the mod_cluster config
AllowDisplay On
</Location>
CustomLog /www/http_logs/cluster_manager_acc.log j_common
ErrorLog /www/http_logs/cluster_manager_err.log
</virtualhost>
</ifmodule>
#
# --------------------- CLIENT Virtual Host 1----------------------------
#
# http://test1.mydomain.srv
<Virtualhost vhost-01:80>
ServerName test1.mydomain.srv
DocumentRoot /www/htdocs1
#
#------------ Directives for mod_cluster ---------------
<ifmodule proxy_cluster_module>
ProxyRequests Off
UseCanonicalName On
ProxyPreserveHost On
# Allowing all proxy requests
<proxy balancer://jboss.web1>
AddDefaultCharset off
Order deny,allow
Allow from All
</proxy>
ProxyPass / balancer://jboss.web1/ stickysession=JSESSIONID|jsessionid nofailover=On
ProxyPassReverse / balancer://jboss.web1/
</ifmodule>
#
CustomLog /www/http_logs/test1.mydomain.srv_acc.log j_common
ErrorLog /www/http_logs/test1.mydomain.srv_err.log
</virtualhost>
#
# --------------------- CLIENT Virtual Host 2----------------------------
# http://test2.mydomain.srv
<virtualhost vhost-01:80>
ServerName test2.mydomain.srv
DocumentRoot /www/htdocs2
#
#------------ Directives for mod_cluster ---------------
<ifmodule proxy_cluster_module>
ProxyRequests Off
UseCanonicalName On
ProxyPreserveHost On
# Allowing all proxy requests
<proxy balancer://jboss.web2>
AddDefaultCharset off
Order deny,allow
Allow from All
</proxy>
ProxyPass / balancer://jboss.web2/ stickysession=JSESSIONID|jsessionid nofailover=On
ProxyPassReverse / balancer://jboss.web2/
</ifmodule>
#
CustomLog /www/http_logs/test2.mydomain.srv_acc.log j_common
ErrorLog /www/http_logs/test2.mydomain.srv_err.log
</virtualhost>
Le mod-cluster a maintenant été testé avec les conditions suivantes :
– Lorsqu'une application a fini de démarrer, il faut environ 3 à 5 secondes avant qu'Apache n'enregistre l'APP
– Le les requêtes envoyées à Apache étaient alors bien équilibrées entre les applications enregistrées et envoyées au client d'applications vhost.
Mise à niveau en direct d'un serveur d'application principal :
Enregistrez les 4 APP sur le même cluster et testez les performances de l'enregistrement des nouvelles APP et de la désinscription des APP en cours d'exécution.
Méthode suggérée pour effectuer une mise à niveau de l'APP.
– Démarrez les nouvelles applications et attendez qu'elles soient toutes opérationnelles.
– Les nouvelles demandes seront dirigées vers les anciennes et les nouvelles applications.
– Désactivez les anciennes applications avec élégance depuis la gestion console. Cela empêchera les nouvelles requêtes d'être envoyées aux anciennes applications.
– À partir de ce moment, toutes les nouvelles requêtes ne seront envoyées qu'aux nouvelles applications.
– Ensuite, le nombre de connexions encore ouvertes vers les anciennes applications augmentera dynamiquement affiché jusqu'à ce que les anciennes applications ne reçoivent plus de nouvelles demandes.
– Lorsque ces chiffres pour toutes les anciennes applications sont réduits à '0', vous pouvez supprimer les anciennes applications.
REMARQUE 1 :
Pendant le test, nous avons eu des problèmes pour rediriger l'ancien SSID vers de nouveaux nœuds lorsque l'ancien nœud servant le SSID n'était plus disponible.
Le mod_cluster créait une erreur "Service indisponible".
Pour résoudre ce problème, les propriétés JBOSS suivantes (postSetEnv.sh) ont été définies :export JAVA_OPTS="${JAVA_OPTS} -Djboss.mod_cluster.stickySessionRemove=true"
export JAVA_OPTS="${JAVA_OPTS} -Djboss.mod_cluster.stickySessionForce=false"
Voici l'ensemble complet des propriétés liées à mod_cluster :export JAVA_OPTS="${JAVA_OPTS} -Djboss.mod_cluster.balancer=jboss.web1"
(value here has to be modified to a node name variable)
export JAVA_OPTS="${JAVA_OPTS} -Djboss.mod_cluster.proxyList=192.168.100.1:8081"
(values to be set to the proper web server's internal LAN IP)
VALEURS FIXES export JAVA_OPTS="${JAVA_OPTS} -Djboss.mod_cluster.enable=true"
export JAVA_OPTS="${JAVA_OPTS} -Djboss.mod_cluster.advertise=false"
export JAVA_OPTS="${JAVA_OPTS} -Djboss.mod_cluster.excludedContexts="
export JAVA_OPTS="${JAVA_OPTS} -Djboss.mod_cluster.stickySessionRemove=true"
export JAVA_OPTS="${JAVA_OPTS} -Djboss.mod_cluster.stickySessionForce=false"