| type=page |
| status=published |
| title=RMI-IIOP Load Balancing and Failover |
| prev=jms.html |
| ~~~~~~ |
| |
| = RMI-IIOP Load Balancing and Failover |
| |
| [[GSHAG00013]][[fxxqs]] |
| |
| [[rmi-iiop-load-balancing-and-failover]] |
| == 11 RMI-IIOP Load Balancing and Failover |
| |
| This chapter describes using high-availability features for remote EJB |
| references and JNDI objects over RMI-IIOP in {productName}. |
| |
| * link:#abdbe[Overview] |
| * link:#gknqo[`InitialContext` Load Balancing] |
| * link:#gknpv[Per-Request Load Balancing (PRLB)] |
| |
| [[abdbe]][[GSHAG00215]][[overview]] |
| |
| === Overview |
| |
| With RMI-IIOP load balancing, IIOP client requests are distributed to |
| different server instances or name servers. The goal is to spread the |
| load evenly across the cluster, thus providing scalability. IIOP load |
| balancing combined with EJB clustering and availability also provides |
| EJB failover. |
| |
| The following topics are addressed here: |
| |
| * link:#abdbf[General Requirements for Configuring Load Balancing] |
| * link:#gknpk[Load Balancing Models] |
| |
| [[abdbf]][[GSHAG00313]][[general-requirements-for-configuring-load-balancing]] |
| |
| ==== General Requirements for Configuring Load Balancing |
| |
| {productName} provides high availability of remote EJB |
| references and `NameService` objects over RMI-IIOP, provided all the |
| following apply: |
| |
| * Your deployment has a cluster of at least two instances. |
| * Jakarta EE applications are deployed to all instances and clusters that |
| participate in load balancing. |
| * RMI-IIOP client applications are enabled for load balancing. |
| |
| {productName} supports load balancing for Java applications executing |
| in the Application Client Container (ACC). See link:#abdbd[Enabling |
| RMI-IIOP Hardware Load Balancing and Failover]. |
| |
| |
| [NOTE] |
| ==== |
| {productName} does not support RMI-IIOP load balancing and failover |
| over secure sockets layer (SSL). |
| ==== |
| |
| |
| [[gknpk]][[GSHAG00314]][[load-balancing-models]] |
| |
| ==== Load Balancing Models |
| |
| {productName} supports two general models for load balancing: |
| |
| link:#gknqo[`InitialContext` Load Balancing]:: |
| When a client performs a JNDI lookup for an object, the Naming Service |
| creates a `InitialContext` (IC) object associated with a particular |
| server instance. From then on, all lookup requests made using that IC |
| object are sent to the same server instance. `InitialContext` load |
| balancing can be configured automatically across an entire cluster. |
| link:#gknpv[Per-Request Load Balancing (PRLB)]:: |
| Per Request Load Balancing (PRLB) is a method for load balancing |
| stateless EJBs that enables load-balancing for each request to an EJB |
| instance. PRLB chooses the first node in a cluster to use on each |
| request. PRLB is configured on a per-EJB basis. |
| |
| [[gknqo]][[GSHAG00216]][[initialcontext-load-balancing]] |
| |
| === `InitialContext` Load Balancing |
| |
| The following topics are addressed here: |
| |
| * link:#gknpn[`InitialContext` Summary] |
| * link:#abdbg[`InitialContext` Algorithm] |
| * link:#abdbd[Enabling RMI-IIOP Hardware Load Balancing and Failover] |
| |
| [[gknpn]][[GSHAG00315]][[initialcontext-summary]] |
| |
| ==== `InitialContext` Summary |
| |
| When `InitialContext` load balancing is used, the client calls the |
| `InitialContext()` method to create a new `InitialContext` (IC) object |
| that is associated with a particular server instance. JNDI lookups are |
| then performed on that IC object, and all lookup requests made using |
| that IC object are sent to the same server instance. All `EJBHome` |
| objects looked up with that `InitialContext` are hosted on the same |
| target server. Any bean references obtained henceforth are also created |
| on the same target host. This effectively provides load balancing, since |
| all clients randomize the list of live target servers when creating |
| `InitialContext` objects. If the target server instance goes down, the |
| lookup or EJB method invocation will failover to another server |
| instance. All objects derived from same `InitialContext` will failover |
| to the same server instance. |
| |
| IIOP load balancing and failover happens transparently. No special steps |
| are needed during application deployment. IIOP load balancing and |
| failover for the {productName} supports dynamically reconfigured |
| clusters. If the {productName} instance on which the application |
| client is deployed participates in a cluster, the {productName} finds |
| all currently active IIOP endpoints in the cluster automatically. |
| Therefore, you are not required to manually update the list of endpoints |
| if a new instance is added to the cluster or deleted from the cluster. |
| However, a client should have at least two endpoints specified for |
| bootstrapping purposes, in case one of the endpoints has failed. |
| |
| [[abdbg]][[GSHAG00316]][[initialcontext-algorithm]] |
| |
| ==== `InitialContext` Algorithm |
| |
| {productName} uses a randomization and round-robin algorithm for |
| RMI-IIOP load balancing and failover. |
| |
| When an RMI-IIOP client first creates a new `InitialContext` object, the |
| list of available {productName} IIOP endpoints is randomized for that |
| client. For that `InitialContext` object, the load balancer directs |
| lookup requests and other `InitialContext` operations to an endpoint on |
| the randomized list. If that endpoint is not available then a different |
| random endpoint in the list is used. |
| |
| Each time the client subsequently creates a new `InitialContext` object, |
| the endpoint list is rotated so that a different IIOP endpoint is used |
| for `InitialContext` operations. The rotation is randomized, so the |
| rotation is not to the next endpoint in the list, but instead to a |
| random endpoint in the list. |
| |
| When you obtain or create beans from references obtained by an |
| `InitialContext` object, those beans are created on the {productName} |
| instance serving the IIOP endpoint assigned to the `InitialContext` |
| object. The references to those beans contain the IIOP endpoint |
| addresses of all {productName} instances in the cluster. |
| |
| The primary endpoint is the bean endpoint corresponding to the |
| `InitialContext` endpoint used to look up or create the bean. The other |
| IIOP endpoints in the cluster are designated as alternate endpoints. If |
| the bean's primary endpoint becomes unavailable, further requests on |
| that bean fail over to one of the alternate endpoints. |
| |
| You can configure RMI-IIOP load balancing and failover to work with |
| applications running in the ACC. |
| |
| [[abdbd]][[GSHAG00317]][[enabling-rmi-iiop-hardware-load-balancing-and-failover]] |
| |
| ==== Enabling RMI-IIOP Hardware Load Balancing and Failover |
| |
| You can enable RMI-IIOP load balancing and failover for applications |
| running in the application client container (ACC). Weighted round-robin |
| load balancing is also supported. |
| |
| [[abdbi]][[GSHAG00161]][[to-enable-rmi-iiop-hardware-load-balancing-for-the-application-client-container]] |
| |
| ===== To Enable RMI-IIOP Hardware Load Balancing for the Application Client Container |
| |
| This procedure provides an overview of the steps necessary to enable |
| RMI-IIOP load balancing and failover with the application client |
| container (ACC). For additional information on the ACC, see |
| "link:application-development-guide/java-clients.html#GSDVG00160[Developing Clients Using the ACC]" in {productName} Application Development Guide. |
| |
| [[GSHAG440]] |
| |
| Before You Begin |
| |
| The first five steps in this procedure are only necessary if you are |
| enabling RMI-IIOP load balancing on a system other than the DAS. This is |
| common in production environment, but less common in a development |
| environment. For example, a developer who wants to experiment with a |
| cluster and load balancing might create two instances on the same system |
| on which the DAS is running. In such cases, these steps are unnecessary. |
| |
| 1. Go to the install_dir ``/bin`` directory. |
| |
| 2. Run `package-appclient`. + |
| This utility produces an `appclient.jar` file. For more information on |
| `package-appclient`, see link:reference-manual/package-appclient.html#GSRFM00264[`package-appclient`(1M)]. |
| |
| 3. Copy the `appclient.jar` file to the machine where you want your |
| client and extract it. |
| |
| 4. Edit the `asenv.conf` or `asenv.bat` path variables to refer to the |
| correct directory values on that machine. |
| + |
| The file is at appclient-install-dir `/config/`. |
| + |
| For a list of the path variables to update, see |
| link:reference-manual/package-appclient.html#GSRFM00264[`package-appclient`(1M)]. |
| |
| 5. If required, make the `appclient` script executable. |
| + |
| For example, on UNIX use `chmod 700`. |
| |
| 6. [[gevjb]] |
| Find the IIOP listener port number for at least two instances in the cluster. |
| + |
| You specify the IIOP listeners as endpoints in link:#gevkc[Add at least |
| two `target-server` elements in the `sun-acc.xml` file.]. |
| + |
| For each instance, obtain the IIOP listener ports as follows: |
| [arabic] |
| .. Verify that the instances for which you want to determine the IIOP |
| listener port numbers are running. |
| + |
| [source] |
| ---- |
| asadmin> list-instances |
| ---- |
| A list of instances and their status (running, not running) is displayed. |
| + |
| The instances for which you want to display the IIOP listener ports must be running. |
| |
| .. For each instance, enter the following command to list the various |
| port numbers used by the instance. |
| + |
| [source] |
| ---- |
| asadmin> get servers.server.instance-name.system-property.*.value |
| ---- |
| For example, for an instance name `in1`, you would enter the following |
| command: |
| + |
| [source] |
| ---- |
| asadmin> get servers.server.in1.system-property.*.value |
| ---- |
| |
| 7. [[gevkc]] |
| Add at least two `target-server` elements in the `sun-acc.xml` file. |
| + |
| Use the endpoints that you obtained in link:#gevjb[Find the IIOP |
| listener port number for at least two instances in the cluster.]. |
| + |
| If the {productName} instance on which the application client is |
| deployed participates in a cluster, the ACC finds all currently active |
| IIOP endpoints in the cluster automatically. However, a client should |
| have at least two endpoints specified for bootstrapping purposes, in |
| case one of the endpoints has failed. |
| + |
| The `target-server` element specifies one or more IIOP endpoints used |
| for load balancing. The `address` attribute is an IPv4 address or host |
| name, and the `port` attribute specifies the port number. See |
| "link:application-deployment-guide/dd-elements.html#GSDPG00111[client-container]" in {productName} Application Deployment Guide. |
| + |
| As an alternative to using `target-server` elements, you can use the |
| `endpoints` property as follows: |
| + |
| [source] |
| ---- |
| jvmarg value = "-Dcom.sun.appserv.iiop.endpoints=host1:port1,host2:port2,..." |
| ---- |
| |
| 8. If you require weighted round-robin load balancing, perform the following steps: |
| [arabic] |
| .. Set the load-balancing weight of each server instance. |
| + |
| [source] |
| ---- |
| asadmin set instance-name.lb-weight=weight |
| ---- |
| .. In the `sun-acc.xml`, set the |
| `com.sun.appserv.iiop.loadbalancingpolicy` property of the ACC to `ic-based-weighted`. |
| + |
| [source,xml] |
| ---- |
| … |
| <client-container send-password="true"> |
| <property name="com.sun.appserv.iiop.loadbalancingpolicy" \ |
| value="ic-based-weighed"/> |
| … |
| ---- |
| |
| 9. Deploy your client application with the `--retrieve` option to get the client jar file. |
| + |
| Keep the client jar file on the client machine. |
| + |
| For example: |
| + |
| [source] |
| ---- |
| asadmin --user admin --passwordfile pw.txt deploy --target cluster1 \ |
| --retrieve my_dir myapp.ear |
| ---- |
| 10. Run the application client as follows: |
| + |
| [source] |
| ---- |
| appclient --client my_dir/myapp.jar |
| ---- |
| |
| [[GSHAG00070]][[gfohj]] |
| Example 11-1 Setting Load-Balancing Weights for RMI-IIOP Weighted |
| Round-Robin Load Balancing |
| |
| In this example, the load-balancing weights in a cluster of three |
| instances are to be set as shown in the following table. |
| |
| [width="100%",cols="<44%,<56%",options="header",] |
| |=== |
| |Instance Name |Load-Balancing Weight |
| |`i1` |100 |
| |`i2` |200 |
| |`i3` |300 |
| |=== |
| |
| |
| The sequence of commands to set these load balancing weights is as |
| follows: |
| |
| [source] |
| ---- |
| asadmin set i1.lb-weight=100 |
| asadmin set i2.lb-weight=200 |
| asadmin set i3.lb-weight=300 |
| ---- |
| |
| [[GSHAG441]] |
| |
| Next Steps |
| |
| To test failover, stop one instance in the cluster and see that the |
| application functions normally. You can also have breakpoints (or |
| sleeps) in your client application. |
| |
| To test load balancing, use multiple clients and see how the load gets |
| distributed among all endpoints. |
| |
| [[GSHAG442]] |
| |
| See Also |
| |
| See link:session-persistence-and-failover.html#abdle[Enabling the High |
| Availability Session Persistence Service] for instructions on enabling |
| the session availability service for a cluster or for a Web, EJB, or JMS |
| container running in a cluster. |
| |
| [[gknpv]][[GSHAG00217]][[per-request-load-balancing-prlb]] |
| |
| === Per-Request Load Balancing (PRLB) |
| |
| The following topics are addressed here: |
| |
| * link:#gksgt[PRLB Summary] |
| * link:#gksgy[Enabling Per-Request Load Balancing] |
| |
| [[gksgt]][[GSHAG00318]][[prlb-summary]] |
| |
| ==== PRLB Summary |
| |
| Per Request Load Balancing (PRLB) is a method for load balancing |
| stateless EJBs that enables load-balancing for each request to an EJB |
| instance. PRLB chooses the first node in a cluster to use on each |
| request. By contrast, `InitialContext` (hardware) load balancing chooses |
| the first node to use when the `InitialContext` is created, and each |
| request thereafter uses the same node unless a failure occurred. |
| |
| PRLB is enabled by means of the boolean `per-request-load-balancing` |
| property in the `glassfish-ejb-jar.xml` deployment descriptor file for |
| the EJB. If this property is not set, the original load balancing |
| behavior is preserved. |
| |
| |
| [NOTE] |
| ==== |
| PRLB is only supported for stateless session beans. Using PRLB with any |
| other bean types will result in a deployment error. |
| ==== |
| |
| |
| [[gksgy]][[GSHAG00319]][[enabling-per-request-load-balancing]] |
| |
| ==== Enabling Per-Request Load Balancing |
| |
| You can enable Per-Request Load Balancing (PRLB) by setting the boolean |
| `per-request-load-balancing` property to `true` in the |
| `glassfish-ejb-jar.xml` deployment descriptor file for the EJB. On the |
| client side, the `initContext.lookup` method is used to access the |
| stateless EJB. |
| |
| [[gksgo]][[GSHAG00162]][[to-enable-rmi-iiop-per-request-load-balancing-for-a-stateless-ejb]] |
| |
| ===== To Enable RMI-IIOP Per-Request Load Balancing for a Stateless EJB |
| |
| This procedure describes how to enable PRLB for a stateless EJB that is |
| deployed to clustered {productName} instances. This procedure also |
| provides an client-side example for accessing a stateless EJB that uses |
| PRLB. |
| |
| 1. Choose or assemble the EJB that you want to deploy. |
| + |
| In this example, an EJB named `TheGreeter` is used. |
| + |
| For instructions on developing and assembling an EJB for deployment to |
| {productName}, refer to the following documentation: |
| |
| * "link:application-development-guide/ejb.html#GSDVG00010[Using Enterprise JavaBeans Technology]" in {productName} Application Development Guide |
| * "link:application-deployment-guide/deploying-applications.html#GSDPG00068[EJB Module Deployment Guidelines]" in {productName} Application Deployment Guide |
| * "link:application-deployment-guide/deploying-applications.html#GSDPG00070[Assembling and Deploying an Application Client |
| Module]" in {productName} Application Deployment Guide |
| |
| 2. Set the `per-request-load-balancing` property to `true` in the |
| `glassfish-ejb-jar.xml` deployment descriptor file for the EJB. |
| + |
| For more information about the `glassfish-ejb-jar.xml` deployment |
| descriptor file, refer to |
| "link:application-deployment-guide/dd-files.html#GSDPG00079[The glassfish-ejb-jar.xml File]" |
| in {productName} Application Deployment Guide |
| + |
| For example, the `glassfish-ejb-jar.xml` file for a sample EJB named |
| `TheGreeter` is listed below. |
| + |
| [source,xml] |
| ---- |
| <glassfish-ejb-jar> |
| <enterprise-beans> |
| <unique-id>1</unique-id> |
| <ejb> |
| <ejb-name>TheGreeter</ejb-name> |
| <jndi-name>greeter</jndi-name> |
| <per-request-load-balancing>true</per-request-load-balancing> |
| </ejb> |
| </enterprise-beans> |
| </glassfish-ejb-jar> |
| ---- |
| 3. Deploy the EJB. |
| + |
| If the EJB was previously deployed, it must be redployed. |
| + |
| For instructions on deploying EJBs, refer to the following documentation: |
| |
| * "link:application-deployment-guide/deploying-applications.html#GSDPG00033[To Deploy an Application or Module]" in {productName} Application Deployment Guide |
| * "link:application-deployment-guide/deploying-applications.html#GSDPG00036[To Redeploy an Application or Module]" in {productName} Application Deployment Guide |
| |
| 4. Verify the PRLB configuration by looking for the following `FINE` |
| message in the CORBA log file: |
| + |
| [source] |
| ---- |
| Setting per-request-load-balancing policyfor EJB EJB-name |
| ---- |
| 5. Configure a client application to access the PRLB-enabled EJB. |
| + |
| For example: |
| + |
| [source,java] |
| ---- |
| public class EJBClient { |
| public static void main(String args[]) { |
| // ... |
| try { |
| // only one lookup |
| Object objref = initContext.lookup("test.cluster.loadbalancing.ejb.TestSessionBeanRemote"); |
| myGreeterRemote = (TestSessionBeanRemote)PortableRemoteObject.narrow(objref, TestSessionBeanRemote.class); |
| } catch (Exception e) { |
| // ... |
| } |
| |
| for (int i=0; i < 10; i++ ) { |
| // method calls in a loop. |
| String theMessage = myGreeterRemote.sayHello(Integer.toString(i)); |
| System.out.println("got"+": " + theMessage); |
| } |
| } |
| } |
| ---- |
| |
| [[GSHAG443]] |
| |
| See Also |
| |
| See link:session-persistence-and-failover.html#abdle[Enabling the High |
| Availability Session Persistence Service] for instructions on enabling |
| the session availability service for a cluster or for a Web, EJB, or JMS |
| container running in a cluster. |