Howto: Clustering with JOnAS
This guide describes how to configure Apache, Tomcat, and JOnAS to install a
cluster.
This configuration uses the Apache/Tomcat plug-in mod_jk. This plug-in
allows use of the Apache HTTP server in front of one or several Tomcat
JSP/Servlet engines, and provides the capability of forwarding some of the
HTTP requests (typically those concerning the dynamic pages, i.e. JSP and
Servlet requests) to Tomcat instances.
It also uses the In-Memory-Session-Replication technique based on the
group communication protocol JavaGroups to provide failover at servlet/JSP
level.
For the load balancing at EJB level, a clustered JNDI called cmi is
used.
This document describes one architecture with all the clustering
functionalities available in JOnAS, the configuration of architectures
integrating one of those functionalities, and other possible
configurations.
The content of this guide is the following:
Architecture
The architecture with all the clustering functionality available in JOnAS is:
Apache as the front-end HTTP server, JOnAS/Tomcat as J2EE Container, and a
shared database. 
    At the Servlet / JSP level, the mod_jk plug-in provides
Load Balancing / High Availability and the Tomcat-Replication module provides
Failover. 
    At the EJB level, the clustered JNDI cmi provides Load
Balancing / High Availability. 
    The database is shared by the JOnAS servers. 
The versions assumed here are: Apache 2.0, JOnAS 3.1.x/Tomcat 4.1.x
package.
The architecture presented in this document is shown in the following
illustration:

This architecture provides:
  - Load balancing: Requests can be dispatched over a set of servers
    to distribute the load. This improves the "scalability" by allowing more
    requests to be processed concurrently.
 
  - High Availability (HA): having several servers able to fulfill a
    request makes it possible to ensure that, if a server dies, the request
    can be sent to an available server (thus the load-balancing algorithm
    ensures that the server to which the request will be sent is available).
    Therefore, "Service Availability" is achieved.
 
  - Failover at Servlet / JSP Level: This feature ensures that, if
    one JSP/servlet server goes down, another server is able to transparently
    take over, i.e. the request will be switched to another server without
    service disruption. This means that it will not be necessary to start
    over, thus achieving Continuity.
 
However, failover at EJB level is not available. This means that no
State Replication is provided. The mechanism to provide failover at EJB level
is under development and will be available in a coming version of JOnAS. 
Products Installation
This chapter provides information about installing Apache and JOnAS / Tomcat.
The versions assumed here are: Apache 2.0 and the package JOnAS 3.1.x /Tomcat
4.1.x.
Installing Apache
  - Download Apache HTTP server source code from the Apache site.
 
  - Extract the source code.
    gunzip httpd-2_0_XX.tar.gz 
    tar xvf httpd-2_0_XX.tar 
  - Compile and Install.
    ./configure 
    make 
    make install 
A binary version is also available for installation at the Apache site.
Installing the package JOnAS / Tomcat
Refer to Installing JOnAS with a web
container from scratch.
Load balancing at web level with
mod_jk
This chapter describes how to configure Apache, Tomcat, and JOnAS to run the
architecture shown in the following illustration:

Configuring the JK Module
JK module principles
Mod_jk is a plug-in that handles the communication between Apache and Tomcat.
Mod_jk uses the concept of worker. A worker is a Tomcat instance that is
running to perform servlet requests coming from the web server. Each worker
is identified to the web server by the host on which it is located, the port
where it listens, and the communication protocol used to exchange messages.
In this configuration there is one worker for each Tomcat instance and one
worker that will handle the load balancing (this is a specific worker with no
host and no port number). All workers are defined in a file called
worker.properties.
Note: this module can also be used for site partitioning.
install Mod_jk
The easiest way to obtain this plug-in is to download the binary from the Tomcat
Site and place it in the directory libexec (for unix) or modules (for
windows or Mandrake) of the Apache installation directory.
Configure Apache
  - httpd.conf 
    Create a file tomcat_jk.conf, which must be included in
    $APACHE_HOME/conf/httpd.conf. 
    This file should load the module mod_jk:
    LoadModule jk_module modules/mod_jk.so (for windows) 
    LoadModule jk_module libexec/mod_jk.so (for Unix) 
    AddModule mod_jk.c
    And configure mod_jk:
    # Location of the worker file 
    JkWorkersFile "/etc/httpd/conf/jk/workers.properties" 
    # Location of the log file 
    JkLogFile "/etc/httpd/jk/logs/mod_jk.log" 
    # Log level : debug, info, error or emerg 
    JkLogLevel emerg 
    # Assign specific URL to Tomcat workers 
    JkMount /admin loadbalancer 
    JkMount /admin/* loadbalancer 
    JkMount /examples loadbalancer 
    JkMount /examples/* loadbalancer 
      
   
  - worker.properties 
    This file should contain the list of workers first: 
    worker.list=<a comma separated list of worker names> 
    then the properties of each worker: 
    worker.<worker name>.<property>=<property
    value>
    The following is an example of a worker.properties file:
    # List the workers name 
    worker.list=worker1,worker2,loadbalancer 
    # ---------------- 
    # First worker 
    # ---------------- 
    worker.worker1.port=8009 
    worker.worker1.host=server1 
    worker.worker1.type=ajp13 
    # Load balance factor 
    worker.worker1.lbfactor=1 
    # ---------------- 
    # Second worker 
    # ---------------- 
    worker.worker2.port=8009 
    worker.worker2.host=server2 
    worker.worker2.type=ajp13 
    worker.worker2.lbfactor=1 
    # ---------------------- 
    # Load Balancer worker 
    # ---------------------- 
    worker.loadbalancer.type=lb 
    worker.loadbalancer.balanced_workers=worker1,worker2
   
Configure Tomcat
To configure Tomcat, perform the following configuration steps for each
Tomcat server.
  - Configure Tomcat for the connector AJP13. In the file conf/server.xml
    of the JOnAS installation directory, add (if not already there):
    
<!-- Define an AJP 1.3 Connector on port 8009 --> 
    <Connector className="org.apache.ajp.tomcat4.Ajp13Connector"
    
        port="8009" minProcessors="5"
    maxProcessors="75" 
        acceptCount="10" debug="20"/> 
      
   
  - Define the jvmRoute. 
    In the file conf/server.xml of the JOnAS installation directory, add a
    unique route to the Catalina engine. 
    Replace the line: 
    <Engine name="Standalone" defaultHost="localhost"
    debug="0"> 
    with: 
    <Engine jvmRoute="worker1" name="Standalone"
    defaultHost="localhost" debug="0">
    Note: The jvmRoute name should be the same as the name of the
    associated worker defined in worker.properties. This will ensure the
    Session affinity.
   
Configuring JOnAS
In the JOnAS-specific deployment descriptor, add the tag shared for
the entity beans involved and set it to true. When this flag is set
to true, multiple instances of the same entity bean in different JOnAS
servers can access a common database concurrently.
The following is an example of a deployment descriptor with the flag
shared:
<jonas-ejb-jar> 
  <jonas-entity> 
    <ejb-name>Id_1</ejb-name> 
    <jndi-name>clusterId_1</jndi-name>
    <shared>true</shared> 
    <jdbc-mapping> 
     
<jndi-name>jdbc_1</jndi-name> 
     
<jdbc-table-name>clusterIdentityEC</jdbc-table-name> 
      <cmp-field-jdbc-mapping> 
       
<field-name>name</field-name> 
       
<jdbc-field-name>c_name</jdbc-field-name> 
      </cmp-field-jdbc-mapping> 
      <cmp-field-jdbc-mapping> 
       
<field-name>number</field-name> 
       
<jdbc-field-name>c_number</jdbc-field-name> 
      </cmp-field-jdbc-mapping> 
      <finder-method-jdbc-mapping>
        <jonas-method> 
         
<method-name>findByNumber</method-name> 
        </jonas-method> 
        <jdbc-where-clause>where
c_number = ?</jdbc-where-clause> 
      </finder-method-jdbc-mapping>
      <finder-method-jdbc-mapping>
        <jonas-method> 
         
<method-name>findAll</method-name> 
        </jonas-method> 
       
<jdbc-where-clause></jdbc-where-clause> 
      </finder-method-jdbc-mapping>
    </jdbc-mapping> 
  </jonas-entity> 
</jonas-ejb-jar>
Running a Web Application
The web application is now ready to run:
  - Start the jonas servers: jonas start.
 
  - Restart Apache: /usr/local/apache2/bin/apachectl restart.
 
  - Use a browser to access the welcome page, usually index.html.
 
Session Replication at web level
The intent of this chapter is to configure Apache, Tomcat, and JOnAS to run
the following architecture:

The term session replication is used when the current service state is
being replicated across multiple application instances. Session replication
occurs when the information stored in an HttpSession is replicated from, in
this example, one servlet engine instance to another. This could be data such
as items contained in a shopping cart or information being entered on an
insurance application. Anything being stored in the session must be
replicated for the service to failover without a disruption.
The solution chosen for achieving Session replication is called
in-memory-session-replication. It uses a group communication protocol written
entirely in Java, called JavaGroups. JavaGroups is a communication protocol
based on the concept of virtual synchrony and probabilistic broadcasting.
The follow describes the steps for achieving Session replication with
JOnAS.
Running your Web Application
The web application is now ready to run in the cluster:
  - Start the JOnAS servers : jonas start.
 
  - Restart Apache : /usr/local/apache2/bin/apachectl restart.
 
  - Use a browser to access the welcome page, usually index.html.
 
Load Balancing at EJB level
The intent of this chapter is to configure JOnAS to run the following
architecture:
CMI Principles
CMI is a new ORB used by JOnAS to provide clustering for load balancing and
high availability. Several instances of JOnAS can be started together in a
cluster to share their EJBs. It is possible to start the same EJB on each
JOnAS, or to distribute their load. A URL referencing several JOnAS instances
can be provided to the clients. At lookup time, a client randomly chooses one
of the available servers to request the required bean. Each JOnAS instance
has the knowledge (through Javagroups) of the distribution of the Beans in
the cluster. An answer to a lookup is a special clustered stub, containing
stubs to each instance known in the cluster. Each method call on the Home of
the bean can be issued by the stub to a new instance, to balance the load on
the cluster. The default algorithm used for load distribution is currently a
weighted round robin.
CMI Configuration
In the case of EJB level clustering (CMI), the client may be either a fat
Java client (e.g. a Swing application), or a Web application (i.e.
Servlets/JSPs running within JOnAS). In the second case, the JOnAS server
running the Web client should be configured in the same way as the other
nodes of the cluster.
  - In the build.properties of the application, set the protocol name to
    cmi before compilation: 
      protocols.names=cmi 
  - In the file carol.properties of each server (in the directory
    $JONAS_BASE/conf) and of a fat Java client, set the protocol to cmi: 
      carol.protocols=cmi 
  - In the file carol.properties of each server of the cluster, configure
    the multicast address, the group name, the round-robin weight factor,
    etc. 
    The following is a configuration example: 
    # java.naming.provider.url property 
    carol.cmi.url=cmi://localhost:2002 
    
    # Multicast address used by the registries in the cluster 
    carol.cmi.multicast.address=224.0.0.35:35467 
    
    # Groupname for Javagroups 
    carol.cmi.multicast.groupname=G1 
    
    # Factor used for this server in weighted round robin algorithms 
    carol.cmi.rr.factor=100 
  - For a fat Java client, specify the list of registries available in the
    carol.properties file: 
    carol.cmi.url=cmi://server1:port1[,server2:port2...] 
Note 1: The multicast address and group name must be the same for all
JOnAS servers in the cluster.
Note 2: If Tomcat Replication associated to cmi is used, the multicast
addresses of the two configurations must be different.
Preview of a coming version
A solution that enables failover at EJB level is currently under development.
This signifies state replication for stateful session beans and entity beans.
This will enable the following architecture:

Used symbols
  
    
        | 
      A node (computer) that hosts one or more servers  | 
       | 
       | 
    
    
        | 
      A web container | 
        | 
      An ejb container | 
    
    
        | 
      A JOnAS instance that hosts a web container | 
        | 
      A JOnAS instance that hosts an ejb container | 
    
    
        | 
      A JOnAS instance that hosts a web container and an ejb
      container | 
       | 
       | 
    
    
        | 
      An Apache server with the mod_jk module | 
       | 
       | 
    
  
References