Merge "Revise database rolling upgrade documentation"

This commit is contained in:
Zuul 2018-02-21 13:06:00 +00:00 committed by Gerrit Code Review
commit bafc709841
3 changed files with 101 additions and 22 deletions

View File

@ -19,6 +19,23 @@ Rolling Upgrades
.. note:: The Rolling Upgrades feature is EXPERIMENTAL and its use in
production systems is currently **not supported**.
This statement remains true for the Queens release of Glance. What
is the holdup, you ask? Before asserting that the feature is fully
supported, the Glance team needs to have automated tests that perform
rolling upgrades in the OpenStack Continuous Integration gates. The
Glance project team has not had sufficient testing and development
resources in recent cycles to prioritize this work.
The Glance project team is committed to the stability of Glance. As
part of OpenStack, we are committed to `The Four Opens`_. If the
ability to perform rolling upgrades in production systems is
important to you, feel free to participate in the Glance community to
help coordinate and drive such an effort. (We gently remind you that
"participation" includes providing testing and development
resources.)
.. _`The Four Opens`: https://governance.openstack.org/tc/reference/opens.html
Scope of this document
----------------------
@ -83,6 +100,12 @@ Following is the process to upgrade Glance with zero downtime:
glance-manage db expand
.. warning::
For MySQL, using the ``glance-manage db_expand`` command requires that
you either grant your glance user ``SUPER`` privileges, or run
``set global log_bin_trust_function_creators=1;`` in mysql beforehand.
5. Then, also on the NEW NODE, perform the data migrations using the command::
glance-manage db migrate

View File

@ -17,11 +17,11 @@ Zero-Downtime Database Upgrades
===============================
.. warning::
This feature is EXPERIMENTAL in the Ocata and Pike releases.
This feature is EXPERIMENTAL in the Ocata, Pike and Queens releases.
We encourage operators to try it out, but its use in production
environments is currently NOT SUPPORTED.
A zero-downtime database upgrade enables true rolling upgrades of the Glance
A *zero-downtime database upgrade* enables true rolling upgrades of the Glance
nodes in your cloud's control plane. At the appropriate point in the upgrade,
you can have a mixed deployment of release *n* (for example, Ocata) and release
*n-1* (for example, Newton) Glance nodes, take the *n-1* release nodes out of
@ -31,6 +31,13 @@ leaving all Glance nodes in your cloud at release *n*.
That's a rough sketch of how a rolling upgrade would work. For full details,
see :ref:`rolling-upgrades`.
.. note::
When we speak of a "database upgrade", we are simply talking about changing
the database schema and its data from the version used in OpenStack release
*n* (say, Pike) to the version used in OpenStack release *n+1* (say,
Queens). We are **not** talking about upgrading the database management
software.
.. note::
Downgrading a database is not supported. See :ref:`downgrades` for more
information.
@ -38,18 +45,45 @@ see :ref:`rolling-upgrades`.
The Expand-Migrate-Contract Cycle
---------------------------------
For Glance, a zero-downtime database upgrade has three phases:
It's possible to characterize three phases of a database upgrade:
1. **Expand**: in this phase, new columns, tables, indexes, or triggers are
added to the database.
1. **Expand**: in this phase, new columns, tables, indexes, are added to the
database.
2. **Migrate**: in this phase, data is migrated to the new columns or tables.
3. **Contract**: in this phase, the "old" tables or columns (and any database
triggers used during the migration), which are no longer in use, are removed
from the database.
3. **Contract**: in this phase, the "old" tables or columns (which are no
longer in use) are removed from the database.
The above phases are abbreviated as an **E-M-C** database upgrade.
The "legacy" Glance database migrations performed these phases as part of a
single monolithic upgrade script. Currently, the Glance project creates a
separate script for each the three parts of the cycle. We call such an
upgrade an **E-M-C** database migration.
Zero-Downtime Database Upgrade
------------------------------
The E-M-C strategy can be performed offline when Glance is not using the
database. With some adjustments, however, the E-M-C strategy can be applied
online when the database is in use, making true rolling upgrades possible.
.. note::
Don't forget that zero-downtime database upgrades are currently considered
experimental and their use in production environments is NOT SUPPORTED.
A zero-downtime database upgrade takes place as part of a :ref:`rolling upgrade
strategy <rolling-upgrades>` for upgrading your entire Glance installation. In
such a situation, you want to upgrade to release *n* of Glance (say, Queens)
while your release *n-1* API nodes are still running Pike. To make this
possible, in the **Expand** phase, database triggers can be added to the
database to keep the data in "old" and "new" columns synchronized. Likewise,
after all data has been migrated and all Glance nodes have been updated to
release *n* code, these triggers are deleted in the **Contract** phase.
.. note::
Unlike the E-M-C scripts, database triggers are particular to each database
technology. That's why the Glance project currently provides experimental
support only for MySQL.
New Database Version Identifiers
--------------------------------
@ -59,9 +93,8 @@ database becomes more complicated since it must reflect knowledge of what point
in the E-M-C cycle the upgrade has reached. To make this evident, the
identifier explicitly contains 'expand' or 'contract' as part of its name.
Thus the ``ocata01`` migration (that is, the migration that's currently used in
the fully supported upgrade path) has two identifiers associated with it for
zero-downtime upgrades: ``ocata_expand01`` and ``ocata_contract01``.
Thus the Ocata cycle migration has two identifiers associated with it:
``ocata_expand01`` and ``ocata_contract01``.
During the upgrade process, the database is initially marked with
``ocata_expand01``. Eventually, after completing the full upgrade process, the
@ -100,12 +133,24 @@ version record would go through the following progression:
Database Upgrade
----------------
In order to enable the E-M-C database upgrade cycle, and to enable Glance
rolling upgrades, the ``glance-manage`` tool has been augmented to include the
following operations.
For offline database upgrades, the ``glance-manage`` tool still has the
``glance-manage db sync`` command. This command will execute the expand,
migrate, and contract scripts for you, just as if they were contained in
a single script.
In order to enable zero-downtime database upgrades, the ``glance-manage`` tool
has been augmented to include the following operations so that you can
explicitly manage the upgrade.
.. warning::
For MySQL, using the ``glance-manage db expand`` or
``glance-manage db contract`` command requires that
you either grant your glance user ``SUPER`` privileges, or run
``set global log_bin_trust_function_creators=1;`` in mysql beforehand.
Expanding the Database
----------------------
~~~~~~~~~~~~~~~~~~~~~~
::
glance-manage db expand
@ -116,7 +161,7 @@ any new services are started.
Migrating the Data
------------------
~~~~~~~~~~~~~~~~~~
::
glance-manage db migrate
@ -127,7 +172,7 @@ are started.
Contracting the Database
------------------------
~~~~~~~~~~~~~~~~~~~~~~~~
::
glance-manage db contract

View File

@ -282,10 +282,21 @@ Data Migrations
NOTES
-----
* Starting in Ocata, Glance needs every database migration to include both
monolithic and Expand-Migrate-Contract (E-M-C) style migrations. At some
point in Pike, E-M-C migrations will be made default. At that point, it
would be no longer required to include monolithic migration script.
* In Ocata and Pike, Glance required every database migration to include
both monolithic and Expand-Migrate-Contract (E-M-C) style migrations. In
Queens, E-M-C migrations became the default and a monolithic migration
script is no longer required.
In Queens, the glance-manage tool was refactored so that the ``glance-manage
db sync`` command runs the expand, migrate, and contract scripts "under
the hood". From the viewpoint of the operator, there is no difference
between having a single monolithic script and having three scripts.
Since we are using the same scripts for offline and online (zero-downtime)
database upgrades, as a developer you have to pay attention in your scripts
to determine whether you need to add/remove triggers in the expand/contract
scripts. See the changes to the ocata scripts in
https://review.openstack.org/#/c/544792/ for an example of how to do this.
* Alembic is a database migration engine written for SQLAlchemy. So, any
migration script written for SQLAlchemy Migrate should work with Alembic as