Clustering and load balancing EJB 2.x
itchy75 Jul 30, 2007 2:25 PMHi,
I launch 2 Jboss servers (4.0.5) in cluster and I want to load balance the ejb calls between the two servers. I read the documentation and I created a cluster-service.xml and I modified my ejb configuration as follow :
Part of cluster-service.xml
<mbean code="org.jboss.ha.jndi.HANamingService" name="jboss:service=HAJNDI"> <!-- We now inject the partition into the HAJNDI service instead of requiring that the partition name be passed --> <depends optional-attribute-name="ClusterPartition" proxy-type="attribute">jboss:service=${jboss.partition.name:DefaultPartition}</depends> <!-- Bind address of bootstrap and HA-JNDI RMI endpoints --> <attribute name="BindAddress">${jboss.bind.address}</attribute> <!-- RmiPort to be used by the HA-JNDI service once bound. 0 => auto. --> <attribute name="RmiPort">0</attribute> <!-- Port on which the HA-JNDI stub is made available --> <attribute name="Port">1100</attribute> <!-- Backlog to be used for client-server RMI invocations during JNDI queries --> <attribute name="Backlog">50</attribute> <!-- The thread pool service used to control the bootstrap and auto discovery lookups --> <depends optional-attribute-name="LookupPool" proxy-type="attribute">jboss.system:service=ThreadPool</depends> <!-- A flag to disable the auto discovery via multicast --> <attribute name="DiscoveryDisabled">false</attribute> <!-- Set the auto-discovery bootstrap multicast bind address. If not specified and a BindAddress is specified, the BindAddress will be used. --> <attribute name="AutoDiscoveryBindAddress">${jboss.bind.address}</attribute> <!-- Multicast Address and group port used for auto-discovery --> <attribute name="AutoDiscoveryAddress">${jboss.partition.udpGroup:230.0.0.4}</attribute> <attribute name="AutoDiscoveryGroup">1102</attribute> <!-- The TTL (time-to-live) for autodiscovery IP multicast packets --> <attribute name="AutoDiscoveryTTL">16</attribute> <!-- The load balancing policy for HA-JNDI --> <attribute name="LoadBalancePolicy">org.jboss.ha.framework.interfaces.RoundRobin</attribute> <!-- IP Address to which should be bound: the Port, the RmiPort and the AutoDiscovery multicast socket. --> <!-- Client socket factory to be used for client-server RMI invocations during JNDI queries --> <!--attribute name="ClientSocketFactory">custom</attribute--> <!-- Server socket factory to be used for client-server RMI invocations during JNDI queries --> <!--attribute name="ServerSocketFactory">custom</attribute--> </mbean>
EJB configuration :
<jboss> <enterprise-beans> <!-- Session --> <session> <ejb-name>myBean</ejb-name> <jndi-name>myBean</jndi-name> <clustered>True</clustered> <cluster-config> <partition-name> ${jboss.partition.name:DefaultPartition} </partition-name> <home-load-balance-policy> org.jboss.ha.framework.interfaces.RoundRobin </home-load-balance-policy> <bean-load-balance-policy> org.jboss.ha.framework.interfaces.RoundRobin </bean-load-balance-policy> </cluster-config> </session> </enterprise-beans> </jboss>
Everything is good in the JMX console, the EJB is deployed in the two servers and available on both (check with DistributedReplicantManager->listContent()).
The client application (another jboss server) is configured to lookup into the HAJNDI service of the first server.
The problem is that the ejb calls are never balanced. Each time I call it, it runs on the first server. When I undeploy the ejb from the first server, it calls the ejb on the second server (so cluster HAJNDI works). Then I deploy again the ejb on the first server and it will always call the ejb on the first server.
I have understood that HA JNDI algorithm is something like that :
1. look for name in HAJNDI tree
2. if not found, look in local jndi tree
3. if not found, look in all cluster nodes
Is that right ?
So, where does load balancing on ejb is done ? In the EJB itself ?
I have followed all the instructions in the guide, what's wrong ?
Thanks for help.