© JBoss Inc JBoss Clustering An Overview Bela Ban Lead JGroups, Manager Clustering Group
2 © JBoss Inc Topics What is clustering? JBoss/JEMS Clustering Components JGroups, JBoss Cache, HA-JNDI, SLSBs, SFSBs, HTTP session replication, Entity beans, EJB3 and POJO Clustering
3 © JBoss Inc Why JBoss Clustering? Transparent No stub re-compiling! Client doesn’t know about clustering aspect Cluster is maintained automatically Modular/stack approach Open source No extra cost to activate clustering Fairly robust 24/7 production support
4 © JBoss Inc Clustering Terminology Scalability I want to handle x times the number of concurrent access than what I have now High availability Services are accessible with reasonable (and predictable) response times at any time E.g., (5 Nines in Telco) Load balancing A way to obtain high availability and better performance by dispatching incoming requests to different servers Session affinity (or stickiness) Failover Process can continue when it is re-directed to a “backup” node because the original one fails State needs to be available on backup Fault tolerance A service that guarantees strictly correct behavior despite system failure
5 © JBoss Inc Clustering Overview Load Balancer State Replication Failover R1 R2 R3
6 © JBoss Inc JBoss Thin Client Clustering Front end load balancer Software Apache httpd and JBossWeb Apache with mod_jk/mod_proxy JBossWeb (Tomcat on steroids) Hardware F5 Big IP
7 © JBoss Inc JBoss Fat Client Clustering Client uses smart proxy retrieved from JNDI HA smart proxy Based on Remoting (EJB3.0) or RMI (EJB2.1) Has load balancing policy, e.g., Round-Robin Has failover capability (sticky), e.g., detect call failure HA smart proxy has logic inside Logic is pluggable, users can provide their own Failover policy Load balancing, e.g. based on load or weight
8 © JBoss Inc Running JBoss Cluster – Basic Steps Use JBoss’ “all” configuration run.bat -c all./run.sh -c all The “all” configuration contains everything needed for clustering: It has all the libraries for clustering JGroups.jar, jboss-cache.jar Clustered beans (cluster-service.xml) HA-JNDI HTTP session replications (tc5-cluster- service.xml) Farming HA-JMS
9 © JBoss Inc Clustering divided in 3 parts Client-cluster communication Formerly HA-RMI, no HA-Remoting Load balancing and failover logic for fat clients State replication (inside cluster) JBoss Cache HTTP session, SFSBs, DistributedState Cluster communication (inside cluster) Method calls across all cluster nodes Cache invalidation, HA-JNDI, Farming
10 © JBoss Inc Clustering Stack JGroups JBossCache DRM HA-JNDI HTTP SFSB Entity Hibernate Distributed RPC, Membership Messaging HAServices DRM Farming HA- Singleton HA- Remoting Distributed State jBpm
11 © JBoss Inc What is JGroups? A reliable group messaging library Reliable messaging Sequence ordering FIFO or total ordering Flow control Acknowledgement Fragmentation Manage group membership Join Leave Shun
12 © JBoss Inc What is JBoss Cache? An in-memory, replicated, transactional, persistent, and fine- grained cache system Uses JGroups as the messaging layer Ideal for state replication Transactional Persistent (and passivation) Fine-grained field-level replication Sub-partitioning, Buddy Replication
13 © JBoss Inc HA-JNDI Clustered JNDI
14 © JBoss Inc Local proxies Local proxies have direct reference to container localInvoke() creates invocation in container Remote proxies Remote proxies create invocation on client (method, args, ObjectName) Communicate via Remoting framework HA Smart Proxies Client JVM Dispatcher Server JVM Typed Interface Remote Proxy Remoting Connector Remoting Connector AOP Container Invocation Port 3873 Client dynamicInvoke(Invocation) localInvoke(Method, args) Local client Typed Interface Local Proxy JBoss Remoting
15 © JBoss Inc JBoss Remoting JBoss Remoting is a framework with a single, simple API for making network based invocations and other network related services. Client – the external API access point for client code. Client/Server Invoker – protocol specific implementation. For example, SocketClientInvoker and SocketServerInvoker. Invocation Handler – end target interface implemented by user that receives the invocation from the client.
16 © JBoss Inc SFSB Configuration in EJB 2 ClusteredSessionBean True MyPartition org.jboss.ha.framework.interfaces.RoundRobin org.jboss.ha.framework.interfaces.FirstAvailable ClusteredSessionBean True MyPartition org.jboss.ha.framework.interfaces.RoundRobin org.jboss.ha.framework.interfaces.FirstAvailable
17 © JBoss Inc (loadBalancePolicy = FirstAvailable.class, partition = ”MyPartition”) public class ClusteredSessionBean implements ClusteredSession { } (loadBalancePolicy = FirstAvailable.class, partition = ”MyPartition”) public class ClusteredSessionBean implements ClusteredSession { } SFSB Configuration in EJB3
18 © JBoss Inc Entities Use JBoss Cache as Hibernate’s 2nd level cache Default cache in ejb3-entity-cache-service.xml jboss.cache:service=EJB3EntityTreeCache Configure in META-INF/hibernate.cfg.xml per app
19 © JBoss Inc Entities org.jboss.ejb3.entity.TreeCacheProviderHook jboss.cache:service=EJB3EntityTreeCache org.jboss.ejb3.entity.TreeCacheProviderHook jboss.cache:service=EJB3EntityTreeCache
20 © JBoss Inc. public class Pojo long int public class Pojo long int cacheID; } Common set @Remote Integration into EJB3 (detach and attach extended to replication)
21 © JBoss Inc HTTP Session Replication JBossWeb Replication granularity Session Modified attributes Modified fields Implemented using JBoss Cache
22 © JBoss Inc Granularity: SESSION Entire http session is replicated User defines whether getAttribute() call marks a session as dirty If attribute value is mutable, the application can modify session state without calling setAttribute() Operates blindly (application may not have changed the object) After each HTTP request the entire session is serialized and replicated
23 © JBoss Inc Granularity: SESSION // … if replication triggered by getAttribute() is disabled: Pojo pojo = (Pojo)session.getAttribute(“pojo”); pojo.setName(“Ben”); session.setAttribute(“pojo”, pojo); // Done manually to replicate the session // … if replication triggered by getAttribute() is enabled: Pojo pojo = (Pojo)session.getAttribute(“pojo”); // Session will be replicated return pojo.getName(); // Pojo was not actually changed // … if replication triggered by getAttribute() is disabled: Pojo pojo = (Pojo)session.getAttribute(“pojo”); pojo.setName(“Ben”); session.setAttribute(“pojo”, pojo); // Done manually to replicate the session // … if replication triggered by getAttribute() is enabled: Pojo pojo = (Pojo)session.getAttribute(“pojo”); // Session will be replicated return pojo.getName(); // Pojo was not actually changed
24 © JBoss Inc Granularity: ATTRIBUTE Only attributes marked as dirty are replicated. More efficient than session granularity User still needs to manage object relationship Can still configure whether getAttribute() marks the attribute as dirty Pojo pojo = (Pojo)session.getAttribute(“pojo”); pojo.setName(“Ben”); session.setAttribute(“pojo”, pojo); // Only attribute “pojo” gets replicated! Pojo pojo = (Pojo)session.getAttribute(“pojo”); pojo.setName(“Ben”); session.setAttribute(“pojo”, pojo); // Only attribute “pojo” gets replicated!
25 © JBoss Inc Granularity: FIELD Replication is on Pojo field level where Pojo has to be instrumented with AOP Annotation or XML Object relationships are maintained Available beginning with JBoss Person joe = (Person)session.getAttribute(“joe”); joe.setName(“joe”); // Only this field gets replicated. Person mary = (Person)session.getAttribute(“mary”); mary.setAge(41); // Only this field gets replicated. Address addr = new Address(“San Jose”, 95123); joe.setAddress(addr); mary.setAddress(addr); // addr only gets replicated once; shared ref is maintained Person joe = (Person)session.getAttribute(“joe”); joe.setName(“joe”); // Only this field gets replicated. Person mary = (Person)session.getAttribute(“mary”); mary.setAge(41); // Only this field gets replicated. Address addr = new Address(“San Jose”, 95123); joe.setAddress(addr); mary.setAddress(addr); // addr only gets replicated once; shared ref is maintained
26 © JBoss Inc Granularity: FIELD When a Pojo object size is huge, e.g., a long List of size 100K, field level replication is efficient! Subsription subs = (Subscription)session.getAttribute(“subscription”); // What if list is size of 100K? List mailingList = (List)subs.getMailingList(); Person joe = findSubscriber(“joe”, mailingList); joe.getAddress().setZip(94086); // Only replicates this field!! Subsription subs = (Subscription)session.getAttribute(“subscription”); // What if list is size of 100K? List mailingList = (List)subs.getMailingList(); Person joe = findSubscriber(“joe”, mailingList); joe.getAddress().setZip(94086); // Only replicates this field!!
27 © JBoss Inc Clustering – Configuration Session replication is enabled per web application in WEB-INF/web.xml Add to your webapp JBoss specific stuff (async vs sync replication) goes into WEB-INF/jboss- web.xml
28 © JBoss Inc Links Details on Clustering Documentation JBoss AS chapters 16 (Clustering) & 17 (JBossCache and JGroups) Webinars cation Training stering (next: Berlin March 21-24)
© JBoss Inc Questions ?