Architecture

Le clustering permet de répartir la charge d'utilisation sur plusieurs noeuds.

Ceci a 2 impacts en terme d'architecture :

  • Mise en place d'un répartiteur (dans cet exemple, il sera basé sur le module mod_proxy proxy d'Apache)
  • Mise en place d'un cluster JBoss afin de synchroniser les traitements et les caches sur les noeuds
Il est vivement conseillé d'installer les noeuds du cluster sur un VLAN spécifique car ils peuvent générer un trafic important (surtout en configuration UDP)

Configuration proxy

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>

Configuration portail

Le cluster du portail intervient à 2 niveaux:

  • politique de Singleton : certains traitements, notamment le stockage dans la base des informations contenus dans les fichiers XML de paramétrage ne doivent être effectués qu'une fois, même si plusieurs instances sont actives
  • synchronisation des caches de données : chaque donnée modifiée sur un noeud doit donner lieu à la mise à jour des caches des autres noeuds

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 .

Il est possible de définir plusieurs initial_hosts (en les séparant par une virgule) si il y a plus de 2 noeuds

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]