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.