| type=page | 
 | status=published | 
 | title=Upgrading Applications Without Loss of Availability | 
 | next=session-persistence-and-failover.html | 
 | prev=http-load-balancing.html | 
 | ~~~~~~ | 
 | Upgrading Applications Without Loss of Availability | 
 | =================================================== | 
 |  | 
 | [[GSHAG00010]][[abdik]] | 
 |  | 
 |  | 
 | [[upgrading-applications-without-loss-of-availability]] | 
 | 8 Upgrading Applications Without Loss of Availability | 
 | ----------------------------------------------------- | 
 |  | 
 | Upgrading an application to a new version without loss of availability | 
 | to users is called a rolling upgrade. Carefully managing the two | 
 | versions of the application across the upgrade ensures that current | 
 | users of the application complete their tasks without interruption, | 
 | while new users transparently get the new version of the application. | 
 | With a rolling upgrade, users are unaware that the upgrade occurs. | 
 |  | 
 | For more information about application versions and how they are | 
 | identified, see "link:../application-deployment-guide/overview.html#GSDPG00324[Module and Application Versions]" in | 
 | GlassFish Server Open Source Edition Application Deployment Guide. | 
 |  | 
 | In a clustered environment, a rolling upgrade redeploys an application | 
 | with a minimal loss of service and sessions. A session is any artifact | 
 | that can be replicated, for example: | 
 |  | 
 | * `HttpSession` | 
 | * `SingleSignOn` | 
 | * `ServletTimer` | 
 | * `DialogFragment` | 
 | * Stateful session bean | 
 |  | 
 | A rolling upgrade can take place under light to moderate loads. The | 
 | procedure requires about 10-15 minutes for each GlassFish Server | 
 | instance. | 
 |  | 
 |  | 
 | [width="100%",cols="<100%",] | 
 | |======================================================================= | 
 | a| | 
 | Caution: | 
 |  | 
 | To prevent the risk of version mismatch when a session fails over, | 
 | upgrade all instances in a cluster at the same time. Otherwise a session | 
 | might fail over to an instance where different versions of components | 
 | are running. | 
 |  | 
 | |======================================================================= | 
 |  | 
 |  | 
 | Perform this task on each cluster separately. A cluster acts as a safe | 
 | boundary for session failover for instances in the cluster. Sessions in | 
 | one cluster can never fail over to sessions in another cluster. | 
 | Therefore, the risk of version mismatch is avoided. | 
 |  | 
 | [[abdil]][[GSHAG00205]][[application-compatibility]] | 
 |  | 
 | Application Compatibility | 
 | ~~~~~~~~~~~~~~~~~~~~~~~~~ | 
 |  | 
 | Rolling upgrades pose varying degrees of difficulty depending on the | 
 | magnitude of changes between the two application versions. | 
 |  | 
 | If the changes are superficial, for example, changes to static text and | 
 | images, the two versions of the application are compatible and can both | 
 | run at once in the same cluster. | 
 |  | 
 | Compatible applications must: | 
 |  | 
 | * Use the same session information | 
 | * Use compatible database schemas | 
 | * Have generally compatible application-level business logic | 
 | * Use the same physical data source | 
 |  | 
 | You can perform a rolling upgrade of a compatible application in either | 
 | a single cluster or multiple clusters. For more information, see | 
 | link:#abdim[Upgrading In a Single Cluster]. | 
 |  | 
 | If the two versions of an application do not meet all the above | 
 | criteria, then the applications are considered incompatible. Executing | 
 | incompatible versions of an application in one cluster can corrupt | 
 | application data and cause session failover to not function correctly. | 
 | The problems depend on the type and extent of the incompatibility. It is | 
 | good practice to upgrade an incompatible application by creating a | 
 | "shadow cluster" to which to deploy the new version and slowly quiesce | 
 | the old cluster and application. For more information, see | 
 | link:#abdio[Upgrading Incompatible Applications]. | 
 |  | 
 | The application developer and administrator are the best people to | 
 | determine whether application versions are compatible. If in doubt, | 
 | assume that the versions are incompatible, since this is the safest | 
 | approach. | 
 |  | 
 | [[abdim]][[GSHAG00206]][[upgrading-in-a-single-cluster]] | 
 |  | 
 | Upgrading In a Single Cluster | 
 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
 |  | 
 | You can perform a rolling upgrade of an application deployed to a single | 
 | cluster, providing the cluster's configuration is not shared with any | 
 | other cluster. | 
 |  | 
 | [[fxxvd]][[GSHAG00151]][[to-upgrade-an-application-in-a-single-cluster]] | 
 |  | 
 | To Upgrade an Application in a Single Cluster | 
 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 
 |  | 
 | 1.  Deploy the upgraded application to the cluster in a disabled state | 
 | and with a new version identifier. + | 
 | For example: + | 
 | [source,oac_no_warn] | 
 | ---- | 
 | asadmin> asadmin deploy --enabled=false --target myCluster myApp:1.1 | 
 | ---- | 
 | 2.  Perform the following steps for each server instance in the cluster. | 
 | 1.  Quiesce one server instance in the cluster from the load balancer. + | 
 | Follow these steps: | 
 | 1.  Disable the server instance using `asadmin disable-http-lb-server.` | 
 | 2.  Export the load balancer configuration file using | 
 | `asadmin export-http-lb-config`. | 
 | 3.  Copy the exported configuration file to the web server instance's | 
 | configuration directory. + | 
 | For example, for Sun Java System Web Server, the location is | 
 | web-server-install-dir`/``https-`host-name`/config/loadbalancer.xml`. | 
 | 4.  Wait until the timeout has expired. + | 
 | Monitor the load balancer's log file. | 
 | 2.  Enable the upgraded application version on the quiesced server | 
 | instance. + | 
 | For example: + | 
 | [source,oac_no_warn] | 
 | ---- | 
 | asadmin> asadmin enable --target instance01 myApp:1.1 | 
 | ---- | 
 | Enabling the upgraded application version automatically disables the | 
 | previous version. | 
 | 3.  Test the upgraded application on the server instance to make sure it | 
 | runs correctly. | 
 | 4.  Re-enable the server instance in load balancer. + | 
 | Follow these steps: | 
 | 1.  Enable the server instance using `asadmin enable-http-lb-server.` | 
 | 2.  Export the load balancer configuration file using | 
 | `asadmin export-http-lb-config`. | 
 | 3.  Copy the configuration file to the web server's configuration | 
 | directory. | 
 |  | 
 | [[abdin]][[GSHAG00207]][[upgrading-in-multiple-clusters]] | 
 |  | 
 | Upgrading in Multiple Clusters | 
 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
 |  | 
 | [[fxxvb]][[GSHAG00152]][[to-upgrade-a-compatible-application-in-two-or-more-clusters]] | 
 |  | 
 | To Upgrade a Compatible Application in Two or More Clusters | 
 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 
 |  | 
 | Repeat the following procedure for each cluster. | 
 |  | 
 | 1.  Deploy the upgraded application to one cluster in a disabled state | 
 | and with a new version identifier. + | 
 | For example: + | 
 | [source,oac_no_warn] | 
 | ---- | 
 | asadmin> asadmin deploy --enabled=false --target myCluster myApp:1.1 | 
 | ---- | 
 | 2.  Quiesce the cluster with the upgraded application from the load | 
 | balancer. | 
 | 1.  Disable the cluster using `asadmin disable-http-lb-server`. | 
 | 2.  Export the load balancer configuration file using | 
 | `asadmin export-http-lb-config`. | 
 | 3.  Copy the exported configuration file to the web server instance's | 
 | configuration directory. + | 
 | For example, for Sun Java System Web Server, the location is | 
 | web-server-install-dir/`https-`host-name`/config/loadbalancer.xml`. | 
 | 4.  Wait until the timeout has expired. + | 
 | Monitor the load balancer's log file. | 
 | 3.  Enable the upgraded application version on the quiesced cluster. + | 
 | For example: + | 
 | [source,oac_no_warn] | 
 | ---- | 
 | asadmin> asadmin enable --target myCluster myApp:1.1 | 
 | ---- | 
 | Enabling the upgraded application version automatically disables the | 
 | previous version. | 
 | 4.  Test the upgraded application on the cluster to make sure it runs | 
 | correctly. | 
 | 5.  Enable the cluster in the load balancer: | 
 | 1.  Enable the cluster using `asadmin enable-http-lb-server.` | 
 | 2.  Export the load balancer configuration file using | 
 | `asadmin export-http-lb-config`. | 
 | 3.  Copy the configuration file to the web server's configuration | 
 | directory. | 
 |  | 
 | [[abdio]][[GSHAG00208]][[upgrading-incompatible-applications]] | 
 |  | 
 | Upgrading Incompatible Applications | 
 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
 |  | 
 | If the new version of the application is incompatible with the old | 
 | version, use the following procedure. For information on what makes | 
 | applications compatible, see link:#abdil[Application Compatibility]. | 
 | Also, you must upgrade incompatible application in two or more clusters. | 
 | If you have only one cluster, create a "shadow cluster" for the upgrade, | 
 | as described below. | 
 |  | 
 | When upgrading an incompatible application: | 
 |  | 
 | * Give the new version of the application a different version identifier | 
 | from the old version of the application. The steps below assume that the | 
 | application has a new version identifier. | 
 | * If the data schemas are incompatible, use different physical data | 
 | sources after planning for data migration. | 
 | * Deploy the new version to a different cluster from the cluster where | 
 | the old version is deployed. | 
 | * Set an appropriately long timeout for the cluster running the old | 
 | application before you take it offline, because the requests for the | 
 | application won't fail over to the new cluster. These user sessions will | 
 | simply fail. | 
 |  | 
 | [[abdip]][[GSHAG00153]][[to-upgrade-an-incompatible-application-by-creating-a-second-cluster]] | 
 |  | 
 | To Upgrade an Incompatible Application by Creating a Second Cluster | 
 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 
 |  | 
 | 1.  Create a "shadow cluster" on the same or a different set of machines | 
 | as the existing cluster. If you already have a second cluster, skip this | 
 | step. | 
 | 1.  Use the Administration Console to create the new cluster and | 
 | reference the existing cluster's named configuration. + | 
 | Customize the ports for the new instances on each machine to avoid | 
 | conflict with existing active ports. | 
 | 2.  For all resources associated with the cluster, add a resource | 
 | reference to the newly created cluster using | 
 | `asadmin create-resource-ref`. | 
 | 3.  Create a reference to all other applications deployed to the cluster | 
 | (except the current upgraded application) from the newly created cluster | 
 | using `asadmin create-application-ref`. | 
 | 4.  Configure the cluster to be highly available using | 
 | `asadmin configure-ha-cluster`. | 
 | 5.  Create reference to the newly-created cluster in the load balancer | 
 | configuration file using `asadmin create-http-lb-ref.` | 
 | 2.  Give the new version of the application a different version | 
 | identifier from the old version. | 
 | 3.  Deploy the new application version with the new cluster as the | 
 | target. Use a different context root or roots. | 
 | 4.  Start the new cluster while the other cluster is still running. + | 
 | The start causes the cluster to synchronize with the domain and be | 
 | updated with the new application. | 
 | 5.  Test the application on the new cluster to make sure it runs | 
 | correctly. | 
 | 6.  Disable the old cluster from the load balancer using | 
 | `asadmin disable-http-lb-server`. | 
 | 7.  Set a timeout for how long lingering sessions survive. | 
 | 8.  Enable the new cluster from the load balancer using | 
 | `asadmin enable-http-lb-server`. | 
 | 9.  Export the load balancer configuration file using | 
 | `asadmin export-http-lb-config`. | 
 | 10. Copy the exported configuration file to the web server instance's | 
 | configuration directory. + | 
 | For example, for Sun Java System Web Server, the location is | 
 | web-server-install-dir/`https-`host-name`/config/loadbalancer.xml`. | 
 | 11. After the timeout period expires or after all users of the old | 
 | application have exited, stop the old cluster and undeploy the old | 
 | application version. |