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.


[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]
----
asadmin> asadmin deploy --enabled=false --target myCluster myApp:1.1
----

2. Perform the following steps for each server instance in the cluster.
[arabic]
.. Quiesce one server instance in the cluster from the load balancer.
   Follow these steps:
... Disable the server instance using `asadmin disable-http-lb-server.`
... Export the load balancer configuration file using
    `asadmin export-http-lb-config`.
... 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``.
... Wait until the timeout has expired. +
    Monitor the load balancer's log file.
.. Enable the upgraded application version on the quiesced server instance. +
   For example:
+
[source]
----
asadmin> asadmin enable --target instance01 myApp:1.1
----
Enabling the upgraded application version automatically disables the previous version.
.. Test the upgraded application on the server instance to make sure it runs correctly.
.. Re-enable the server instance in load balancer. Follow these steps:
... Enable the server instance using `asadmin enable-http-lb-server.`
... Export the load balancer configuration file using
    `asadmin export-http-lb-config`.
... 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]
----
asadmin> asadmin deploy --enabled=false --target myCluster myApp:1.1
----

2. Quiesce the cluster with the upgraded application from the load balancer.
[arabic]
.. Disable the cluster using `asadmin disable-http-lb-server`.
.. Export the load balancer configuration file using
`asadmin export-http-lb-config`.
.. 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``.
.. 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]
----
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:
[arabic]
.. Enable the cluster using `asadmin enable-http-lb-server.`
.. Export the load balancer configuration file using
   `asadmin export-http-lb-config`.
.. 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.
[arabic]
.. 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.
.. For all resources associated with the cluster, add a resource
   reference to the newly created cluster using
   `asadmin create-resource-ref`.
.. 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`.
.. Configure the cluster to be highly available using
   `asadmin configure-ha-cluster`.
.. 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.
