On 08/25/2016 01:13 PM, Steve Martinelli wrote:
The keystone team is pursuing a trigger-based approach to support
rolling, zero-downtime upgrades. The proposed operator experience is
documented here:
http://docs.openstack.org/developer/keystone/upgrading.html
This differs from Nova and Neutron's approaches to solve for rolling
upgrades (which use oslo.versionedobjects), however Keystone is one of
the few services that doesn't need to manage communication between
multiple releases of multiple service components talking over the
message bus (which is the original use case for oslo.versionedobjects,
and for which it is aptly suited). Keystone simply scales horizontally
and every node talks directly to the database.
Hi Steve -
I'm a strong proponent of looking into the use of triggers to smooth
upgrades between database versions. Even in the case of projects
using versioned objects, it still means a SQL layer has to include
functionality for both versions of a particular schema change which
itself is awkward. I'm also still a little worried that not every case
of this can be handled by orchestration at the API level, and not as a
single SQL layer method that integrates both versions of a schema change.
Using triggers would resolve the issue of SQL-specific application code
needing to refer to two versions of a schema at once, at least for those
areas where triggers and SPs can handle it. In the "ideal", it means
all the Python code can just refer to one version of a schema, and nuts
and bolts embedded into database migrations would handle all the
movement between schema versions, including the phase between expand and
contract. Not that I think the "ideal" is ever going to be realized
100%, but maybe in some / many places, this can work.
So if Keystone wants to be involved in paving the way for working with
triggers, IMO this would benefit other projects in that they could
leverage this kind of functionality in those places where it makes sense.
The problem of "zero downtime database migrations" is an incredibly
ambitious goal and I think it would be wrong to exclude any one
particular technique in pursuing this. A real-world success story would
likely integrate many different techniques as they apply to specific
scenarios, and triggers and SPs IMO are a really major one which I
believe can be supported.
Database triggers are obviously a new challenge for developers to write,
honestly challenging to debug (being side effects), and are made even
more difficult by having to hand write triggers for MySQL, PostgreSQL,
and SQLite independently (SQLAlchemy offers no assistance in this case),
as seen in this patch:
So I would also note that we've been working on the availability of
triggers and stored functions elsewhere, a very raw patch that is to be
largely rolled into oslo.db is here:
https://review.openstack.org/#/c/314054/
This patch makes use of an Alembic pattern called "replaceable object",
which is intended specifically as a means of versioning things like
triggers and stored procedures:
http://alembic.zzzcomputing.com/en/latest/cookbook.html#replaceable-objects
Within the above Neutron patch, one thing I want to move towards is that
things like triggers and SPs would only need to be specified once, in
the migration layer, and not within the model. To achieve this, tests
that work against MySQL and Postgresql would need to ensure that the
test schema is built up using migrations, and not create_all. This is
already the case in some places and not in others. There is work
ongoing in oslo.db to provide a modernized fixture system that supports
enginefacade cleanly as well as allows for migrations to be used
efficiently (read: once per many tests) for all MySQL/Postgresql test
suites, athttps://review.openstack.org/#/c/351411/ .
As far as SQLite, I have a simple opinion with SQLite which is that
migrations, triggers, and SPs should not be anywhere near a SQLite
database. SQLite should be used strictly for simple model unit tests,
the schema is created using create_all(), and that's it. The test
fixture system accommodates this as well.
Our primary concern at this point are how to effectively test the
triggers we write against our supported database systems, and their
various deployment variations. We might be able to easily drop SQLite
support (as it's only supported for our own test suite), but should we
expect variation in support and/or actual behavior of triggers across
the MySQLs, MariaDBs, Perconas, etc, of the world that would make it
necessary to test each of them independently? If you have operational
experience working with triggers at scale: are there landmines that we
need to be aware of? What is it going to take for us to say we support
*zero* dowtime upgrades with confidence?
*zero* downtime is an extremely difficult goal. I appreciate that
people are generally nervous about making more use of relational
database features in order to help with this, however as long as the
goal includes an application that can communicate with a database that
is literally in flux as far as its schema, this is already an exotic
goal. Triggers and stored procedures are in fact very boring.
SQLAlchemy does support these features, it's just the specific trigger
and SP languages themselves are written as strings, not as elaborate
Python expressions. This should be seen as a good thing. Trigger and
SP languages are not like SQL in that they are not very declarative at
all, they are imperative. SQLAlchemy's abstraction of SQL into Python
expressions only works to the degree that the SQL itself is primarily
declarative. It would not be feasible to take on the task of producing
an imperative stored procedure / trigger language that compiles into
vendor-specific dialects.
For the use case of Openstack database migrations, I would hope that a
subset of the triggers and SPs that support live migrations would fall
into a fixed "vocabulary", each meeting various requirements, that are
of general use across projects and could be maintained in oslo.db
itself. For more elaborate cases, like "version A has the data in
three tables, version B has them in a single JSON blob", that probably
needs more specific logic.
I would encourage project teams to please loop me in on discussions
about triggers, SPs and migrations.
Steve & Dolph
__________________________________________________________________________
OpenStack Development Mailing List (not for usage questions)
Unsubscribe: openstack-dev-requ...@lists.openstack.org?subject:unsubscribe
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
__________________________________________________________________________
OpenStack Development Mailing List (not for usage questions)
Unsubscribe: openstack-dev-requ...@lists.openstack.org?subject:unsubscribe
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev