Le clustering permet de répartir la charge d'utilisation sur plusieurs noeuds.
Ceci a 2 impacts en terme d'architecture :
Il faut définir au niveau d'Apache la stratégie de balancing, ainsi que les noeuds du cluster.
Ceci est une exemple de configuration basé sur la version 2.2.15 d'Apache. Elle se base sur le module mod_proxy de Apache.
Dans un premier temps, associer les ProxyPass du portail au cluster :
<VirtualHost *:80>
#Your domain name
ServerName my-domain
ProxyPreserveHost On
DirectoryIndex /portal
ProxyPass /portal balancer://clusterportal/portal stickysession=ROUTEID nofailover=On
ProxyPassMatch ^/(portal(-[a-z])+.*)$ balancer://clusterportal/$1 stickysession=ROUTEID nofailover=On
ProxyPassMatch ^/(osivia(-[a-z])+.*)$ balancer://clusterportal/$1 stickysession=ROUTEID nofailover=On
ProxyPassMatch ^/(toutatice(-[a-z])+.*)$ balancer://clusterportal/$1 stickysession=ROUTEID nofailover=On
</VirtualHost>
Il faut ensuite définir les noeuds du cluster et la stratégie du balancer
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy balancer://clusterportal>
BalancerMember http://192.168.56.201:8080 route=epjbp1
BalancerMember http://192.168.56.202:8080 route=epjbp2
Order deny,allow
Allow from all
ProxySet stickysession=ROUTEID
ProxySet lbmethod=bybusyness
</Proxy>
Il est également possible d'installer un manager pour superviser le cluster
<Location /balancer-manager>
SetHandler balancer-manager
Order Deny,Allow
Allow from all
</Location>
Le cluster du portail intervient à 2 niveaux:
Les noeuds ont donc besoin de se connaitre les uns les autres. Le protocole mis en place par défaut est TCP (possibilité de mettre en place UDP).
La configuration est faite dans le fichier /home/portal/portal.properties
L'exemple ci-dessous reprend une configuration sur 2 noeuds se basant sur le protocole TCP. Les noms utilisés cluster-1 et cluster-2 doivent pointer (dans les fichiers /etc/hosts) vers les IP respectives des 2 noeuds dans le VLAN .
Noeud1 (cluster-1)
# Cluster 1 : Cluster Web
portal.web.cluster.tcpAddr==cluster-1
portal.web.cluster.tcpPort=8930
portal.web.cluster.initial_hosts=cluster-2[8930]
# Cluster 2 : Cluster JBoss (Synchronisation des noeuds)
portal.cluster.tcpAddr=cluster-1
portal.cluster.tcpPort=8920
portal.cluster.initial_hosts=cluster-2[8920]
# Cluster 3 : Application Portail (Synchronisation applicative)
portal.custom.cache.tcpAddr=cluster-1
portal.custom.cache.tcpPort=8910
portal.custom.cache.initial_hosts=cluster-2[8910]
# Cluster 4 : Cache DB
portal.hibernate.cache.tcpAddr=cluster-1
portal.hibernate.cache.tcpPort=8900
portal.hibernate.cache.initial_hosts=cluster-2[8900]
# Cluster 5 : EJB3 Entity
portal.ejb3.entity.cache.tcpAddr=cluster-1
portal.ejb3.entity.cache.tcpPort=8940
portal.ejb3.entity.cache.initial_hosts=cluster-2[8940]
# Cluster 6 : EJB3 Stateful
portal.ejb3.sfsb.cache.tcpAddr=cluster-1
portal.ejb3.sfsb.cache.tcpPort=8950
portal.ejb3.sfsb.cache.initial_hosts=cluster-2[8950]
Noeud2 (cluster-2)
# Cluster 1 : Cluster Web
portal.web.cluster.tcpAddr=cluster-2
portal.web.cluster.tcpPort=8930
portal.web.cluster.initial_hosts=cluster-1[8930]
# Cluster 2 : Cluster JBoss (Synchronisation des noeuds)
portal.cluster.tcpAddr=cluster-2
portal.cluster.tcpPort=8920
portal.cluster.initial_hosts=cluster-1[8920]
# Cluster 3 : Application Portail (Synchronisation applicative)
portal.custom.cache.tcpAddr=cluster-2
portal.custom.cache.tcpPort=8910
portal.custom.cache.initial_hosts=cluster-1[8910]
# Cluster 4 : Cache DB
portal.hibernate.cache.tcpAddr=cluster-2
portal.hibernate.cache.tcpPort=8900
#portal.hibernate.cache.initial_hosts=cluster-1[8900]
# Cluster 5 : EJB3 Entity
portal.ejb3.entity.cache.tcpAddr=cluster-2
portal.ejb3.entity.cache.tcpPort=8940
portal.ejb3.entity.cache.initial_hosts=cluster-1[8940]
# Cluster 6 : EJB3 Stateful
portal.ejb3.sfsb.cache.tcpAddr=cluster-2
portal.ejb3.sfsb.cache.tcpPort=8950
portal.ejb3.sfsb.cache.initial_hosts=cluster-1[8950]