I. Introduction▲
Ce cours introduit les bases vous permettant de comprendre les concepts et de faire du clustering sous Glassfish 2.1.
L'ensemble des tests a été effectué sur une machine Windows Vista et une machine OpenSolaris (sous VirtualBox).
II. Utilité du clustering▲
En Java EE, on parle de clustering de serveurs d'applications pour parler de la mise en relation d'un certain nombre de serveurs entre eux. Une application Java serveur (EJB, application web, etc.) sera déployée sur l'ensemble des serveurs en parallèle.
Les principaux avantages d'un cluster sont :
- de mieux supporter la charge (scalability et load balancing) ;
- d'avoir une plus haute disponibilité en cas de panne de certains serveurs (high avaibility et fail over) ;
- de mieux gérer des problématiques de bande passante dans le cas où l'application est utilisée dans de nombreux endroits.
Par rapport à un simple déploiement d'une même application sur différents serveurs, le clustering en Java EE va permettre :
- d'avoir des sessions et des configurations cohérentes (réplication) ;
- de distribuer des données de manière automatique entre les serveurs (cache distribué).
III. Un peu de vocabulaire▲
Quand on parle de cluster, on parle souvent de nœud, d'agent, de node agent, de DAS et évidemment de cluster.
III-A. Cluster▲
Un cluster est un ensemble d'instances de serveurs qui appartiennent à différents nœuds.
III-B. Nœud▲
Un nœud représente un serveur physique. Un nœud regroupe un ensemble d'instances de serveurs qui partagent la même configuration.
III-C. DAS▲
Le DAS (Domain Administration Server) est le serveur principal qui permet de configurer et de mettre en relation pour la première fois tous les nœuds. Dès que le cluster est démarré, le DAS peut tomber en panne sans que cela n'affecte les autres nœuds du cluster.
III-D. Node Agent▲
Un Node Agent est un processus léger associé à un nœud du cluster (en relation avec le DAS) qui permet notamment de :
- démarrer et arrêter le nœud du cluster ;
- synchroniser le nœud courant avec le DAS (indiquer son existence, synchroniser les données, etc.)
IV. Prérequis▲
Avant de commencer, il est nécessaire de vérifier certains points.
IV-A. Configuration de Glassfish▲
Il est préférable que l'ensemble des serveurs ait la même version du serveur d'applications (ici Glassfish).
Par défaut, après l'installation de Glassfish, le clustering est désactivé. Sur la page d'accueil de la console d'administration, il faut activer cette fonctionnalité.
IV-B. IP et domaines▲
Vérifier que l'ensemble des serveurs sont « pingables » entre eux (IP), surtout si vous effectuez des tests au sein de plusieurs machines virtuelles.
Vérifier que l'ensemble des serveurs sont « pingables » avec le nom du serveur. En effet, lors de la communication entre les nœuds, Glassfish utilisera non pas l'IP de la machine, mais le nom de la machine. En cas de problème, il est éventuellement nécessaire d'ajouter dans le fichier hosts les IP de toutes les machines (même la sienne).
Exemple de fichier hosts sous Windows (Windows\System32\drivers\,etc\hosts) :
127.0.0.1 localhost
192.168.1.117 serveur
::1 localhost
192.168.1.69 opensolaris
Exemple de fichier hosts sous Solaris (/,etc/hosts ou /,etc/init/hosts) :
::1 opensolaris opensolaris.local localhost loghost
192.168.1.69 opensolaris.local opensolaris localhost loghost
192.168.1.117 serveur
V. Configuration et clustering▲
L'ensemble des tests a été effectué sur :
- une machine Windows Vista (machine nommée serveur d'IP 192.168.1.117) ;
- une machine virtuelle (VirtualBox) sous OpenSolaris (machine nommée opensolaris d'IP 192.168.1.69) jouant le rôle du DAS.
V-A. Configuration initiale du DAS▲
Dans un premier temps, il est nécessaire de définir quel serveur sera utilisé pour configurer et administrer le cluster (le DAS). Une fois choisi, démarrez-le afin d'accéder à la console d'administration.
Sous Windows, le démarrage de Glassfish peut se faire via le menu Démarrer/Démarrer le serveur par défaut. Dans le répertoire d'installation de Glassfish, il est possible d'utiliser la commande suivante :
./bin/asadmin start-domain domain1
L'accès à la console d'administration se fait via un navigateur Web. En général, l'URL est http://localhost:4848. À noter que le port est affiché dans la console suite à l'exécution de la commande de démarrage.
Starting Domain domain1, please wait.
Default Log location is C:\Java\GlassFish2.1\domains\domain1\logs\server.log.
Redirecting output to C:/Java/GlassFish2.1/domains/domain1/logs/server.log
Domain domain1 started.
Domain [domain1] is running [Sun GlassFish Enterprise Server v2.1 (9.1.1) (build
b60e-fcs)] with its configuration and logs at: [C:\Java\GlassFish2.1\domains].
Admin Console is available at [http://localhost:50035].
Use the same port [50035] for "asadmin" commands.
User web applications are available at these URLs:
[http://localhost:50034 https://localhost:8181 ].
Following web-contexts are available:
[/web1 /__wstx-services ].
Standard JMX Clients (like JConsole) can connect to JMXServiceURL:
[service:jmx:rmi:///jndi/rmi://192.168.1.117:50043/jmxrmi] for domain management
purposes.
Domain listens on at least following ports for connections:
[50034 8181 50035 3700 3820 3920 50043 ].
Domain supports application server clusters and other standalone instances.
V-B. Création des NodeAgents▲
Afin de mettre en relation les différents nœuds du cluster, il est nécessaire de créer un node agent sur chaque nœud pointant vers le DAS.
Pour tous les nœuds, il est nécessaire d'exécuter la commande suivante (le login et le password de l'administrateur seront demandés) :
./asadmin create-node-agent --host ipDAS --port portAdminDAS agentName
Dans mon exemple, j'ai exécuté les commandes suivantes :
//sur le serveur non DAS
./asadmin create-node-agent --host 192.168.1.69 --port 4848 agent_serveur
//sur le DAS opensolaris
./asadmin create-node-agent agentsolaris
Sur le DAS, il est possible de voir la présence des NodeAgent dans la console d'administration.
Il peut être utile de savoir que la création d'un NodeAgent :
- sur le nœud, crée le répertoire « nodeagents\agent_serveur\agent » qui contiendra des données sur le DAS et le nœud ;
- sur le DAS, ajoute dans le fichier « domains/domain1/config/domain.xml » une entrée node-agent.
V-C. Démarrage des NodeAgents▲
Une fois les NodeAgents créés, il est nécessaire de les démarrer via la commande suivante :
//sur le serveur non DAS
./asadmin start-node-agent agent_serveur
//sur le DAS opensolaris
./asadmin start-node-agent agentsolaris
En cas d'échec du démarrage, il est possible qu'il y ait des problèmes de connexions entre les nœuds du cluster ou qu'un port soit déjà utilisé. Pour vérifier cela, il est nécessaire de lire le fichier de log indiqué par l'erreur lors du démarrage de l'agent.
V-D. Création du cluster▲
Maintenant que tous les nœuds sont en relation avec le DAS, il est possible de créer le cluster sur Glassfish.
Pour cela, il y a deux manières.
Soit via la console d'administration (Cluster/Créer cluster)
Soit en exécutant la commande suivante :
>./asadmin create-cluster courscluster
Le reste de la création se fait via la console d'administration. Dans Clusters/Instances, il est nécessaire de créer les instances de serveurs que vous souhaitez pour le cluster. Chaque nœud (représenté par un NodeAgent) peut héberger plusieurs instances.
Si vous cliquez sur New (Server Instances), il vous sera possible de créer une instance du cluster en l'associant à un NodeAgent.
Une fois toutes les instances du cluster créées, vous pourrez visualiser le cluster complet dans la console d'administration. L'état des instances dépend de si vous avez ou non démarré les Node Agents.
Si vous allez dans le répertoire : « nodesagents/nomagent », vous verrez la présence des instances de serveurs. Ce répertoire est structuré de la même manière d'un répertoire de domaine, à savoir :
- applications : contient les applications déployées ;
- config : configuration de l'instance (ports, etc.) ;
- lib : pour les bibliothèques partagées et internes.
À chaque démarrage, ces répertoires sont synchronisés avec le DAS.
V-E. Démarrage du cluster▲
Une fois le cluster créé, démarrer le cluster via la console d'administration (Cluster/General/Start cluster) ou via la commande (sur le DAS) :
>./asadmin start-cluster nomcluster
Afin de connaître les ports écoutés par chaque instance, il suffit d'aller dans la console d'administration, puis Cluster/Instances puis cliquer sur l'instance du nœud.
Le port d'écoute correspond au deuxième port indiqué (38081).
À ce moment, il est possible de déployer la même application de manière synchronisée sur l'ensemble des instances de serveurs :
- http://opensolaris:38080
- http://opensolaris:38081
- http://serveur:38082
- http://serveur:38081
VI. Déploiement d'une application de tests▲
Nous pouvons désormais tester le cluster. Lors de l'installation de Glassfish 2.1, un ensemble d'applications de tests est ajouté dans le répertoire « samples\quickstart », et notamment l'application clusterjsp qui permet de tester les sessions utilisateurs en mode cluster.
Le déploiement d'une application s'effectue de la même manière que dans le cas de serveur standalone.
Dans la console d'administration, Clusters, sélectionnez le cluster, Applications puis « Deploy ». Pour l'exemple, il est nécessaire de déployer le fichier clusterjsp.ear. Il faut également cocher la case : « Avaibility » qui permet la synchronisation des données entre les instances.
Une fois l'application déployée, vous pouvez appeler l'URL : http://ip:port/clusterjsp/
On peut constater que les données de sessions et la clef de session sont synchronisées entre les différents serveurs.
VII. Quelques réglages pour la réplication▲
Dans la console d'administration, Configuration/cluster/Availability Service, il est possible de définir certains réglages pour la réplication des sessions pour le conteneur Web, le conteneur EJB et le conteneur de messaging.
Pour le type de persistance :
- memory : cela revient à déployer les serveurs de manière indépendante. Il n'y a aucune réplication ;
- replicated : il y a réplication.
Pour la fréquence des réplications :
- web-method (WebContainer) : à la fin de chaque appel d'une servlet, la session est répliquée (meilleure solution) ;
- time-based : la session est répliquée toutes les n secondes. Le temps se définit en ajoutant la propriété : reapIntervalSeconds.
Le Persistence Scope permet de définir ce qui est répliqué :
- session : toute la session et les données sont répliquées tout le temps ;
- modified-session : toute la session et les données sont répliquées uniquement si un attribut a changé (via setAttribute) ;
- modified-attribute : les données seulement sont répliquées uniquement si un attribut a changé.
VIII. Astuces▲
VIII-A. Quelques commandes▲
VIII-A-1. Création d'un domaine▲
>./asadmin create-domain --adminport adminPort nomdomain
Exemple :
C:\Java\GlassFish2.1\bin>asadmin.bat create-domain --adminport 4242 domain2
Please enter the admin user name>admin
Please enter the admin password>
Please enter the admin password again>
Please enter the master password [Enter to accept the default]:>
Please enter the master password again [Enter to accept the default]:>
Using port 4242 for Admin.
Using default port 8080 for HTTP Instance.
Using default port 7676 for JMS.
Using default port 3700 for IIOP.
Using default port 8181 for HTTP_SSL.
Using default port 3820 for IIOP_SSL.
Using default port 3920 for IIOP_MUTUALAUTH.
Using default port 8686 for JMX_ADMIN.
Domain being created with profile:developer, as specified by variable AS_ADMIN_P
ROFILE in configuration file.
The file in given locale [fr_FR] at: [C:\Java\GlassFish2.1\lib\install\templates
\locales\fr_FR\index.html] could not be found. Using default (en_US) index.html
instead.
Security Store uses: JKS
Domain domain2 created.
VIII-A-2. Démarrage d'un domaine▲
>./asadmin start-domain nomdomaine
Exemple :
C:\Java\GlassFish2.1\bin>asadmin.bat start-domain domain1
Starting Domain domain1, please wait.
Default Log location is C:\Java\GlassFish2.1\domains\domain1\logs\server.log.
Redirecting output to C:/Java/GlassFish2.1/domains/domain1/logs/server.log
Domain domain1 started.
Domain [domain1] is running [Sun GlassFish Enterprise Server v2.1 (9.1.1) (build
b60e-fcs)] with its configuration and logs at: [C:\Java\GlassFish2.1\domains].
Admin Console is available at [http://localhost:50035].
Use the same port [50035] for "asadmin" commands.
User web applications are available at these URLs:
[http://localhost:50034 https://localhost:8181 ].
Following web-contexts are available:
[/web1 /__wstx-services ].
Standard JMX Clients (like JConsole) can connect to JMXServiceURL:
[service:jmx:rmi:///jndi/rmi://192.168.1.117:50043/jmxrmi] for domain management
purposes.
Domain listens on at least following ports for connections:
[50034 8181 50035 3700 3820 3920 50043 ].
Domain supports application server clusters and other standalone instances.
VIII-A-3. Suppression d'un domaine▲
>./asadmin delete-domain nomdomain
Exemple :
C:\Java\GlassFish2.1\bin>asadmin.bat delete-domain domain2
Domain domain2 deleted.
VIII-A-4. Lister les domaines▲
>./asadmin list-domains
VIII-A-5. Création d'un Node Agent▲
>./asadmin create-node-agent --host DAS --port adminDASPort nomagent
Exemple :
C:\Java\GlassFish2.1\bin>asadmin.bat create-node-agent --host 192.168.1.117 --po
rt 50035 coursagent
Please enter the admin user name>admin
Please enter the admin password>
Command create-node-agent executed successfully.
VIII-A-6. Démarrage d'un Node Agent▲
>./asadmin start-node-agent nomagent
Ou :
>./asadmin start-node-agent --startinstances=false monagent
>./asadmin start-instance nomagent
Exemple :
C:\Java\GlassFish2.1\bin>asadmin.bat start-node-agent coursagent
Please enter the admin user name>admin
Please enter the admin password>
Please enter the master password [Enter to accept the default]:>
Redirecting output to C:/Java/GlassFish2.1/nodeagents/coursagent/agent/logs/serv
er.log
Redirecting application output to C:/Java/GlassFish2.1/nodeagents/coursagent/age
nt/logs/server.log
Command start-node-agent executed successfully.
VIII-A-7. Arrêt d'un agent▲
>./asadmin stop-node-agent nomagent
Exemple :
C:\Java\GlassFish2.1\bin>asadmin.bat stop-node-agent coursagent
Command stop-node-agent executed successfully.
VIII-A-8. Suppression d'un agent▲
>./asadmin delete-node-agent nomagent
Exemple :
C:\Java\GlassFish2.1\bin>asadmin.bat delete-node-agent coursagent
Command delete-node-agent executed successfully.
IX. Remerciements▲
Je tiens à remercier romaintaz pour toutes les corrections apportées.