| 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. |