Merge "Message queue connection switching for cells"
This commit is contained in:
180
specs/newton/approved/cells-mq-connection-switching.rst
Normal file
180
specs/newton/approved/cells-mq-connection-switching.rst
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
============================================
|
||||||
|
Message queue connection switching for cells
|
||||||
|
============================================
|
||||||
|
|
||||||
|
https://blueprints.launchpad.net/nova/+spec/cells-mq-connection-switching
|
||||||
|
|
||||||
|
In order for Nova API to send RPC messages to cells, the message queue
|
||||||
|
connection information for the target cell must be used. Nova API must
|
||||||
|
pass the cell message queue information to the RPC API layer.
|
||||||
|
|
||||||
|
|
||||||
|
Problem description
|
||||||
|
===================
|
||||||
|
|
||||||
|
In Cells v2, instead of using a nova-cells proxy, nova-api will interact
|
||||||
|
directly with the database and message queue of the cell for an instance.
|
||||||
|
Instance -> cell mappings are stored in a table in the API level database.
|
||||||
|
Each InstanceMapping refers to a CellMapping, and the CellMapping contains
|
||||||
|
the connection information for the cell. We need a way to communicate the
|
||||||
|
message queue connection information from the CellMapping to the RPC API
|
||||||
|
layer, so when we receive a request to act upon an instance, the message
|
||||||
|
will be forwarded to the cell where the instance resides.
|
||||||
|
|
||||||
|
Use Cases
|
||||||
|
---------
|
||||||
|
|
||||||
|
* Operators want to partition their deployments into cells for scaling, failure
|
||||||
|
domain, and buildout reasons. When partitioned, we need a way to route
|
||||||
|
messages to the cell for an instance.
|
||||||
|
|
||||||
|
Proposed change
|
||||||
|
===============
|
||||||
|
|
||||||
|
We propose to store the message queue connection information for a cell in
|
||||||
|
the RequestContext where it can be used by the RPC API layer to interact with
|
||||||
|
the cell message queue. Currently, there is only one message queue that can be
|
||||||
|
used at the RPC API layer and it is a global transport. We will want to be able
|
||||||
|
to create a transport dynamically based on message queue connection data if it
|
||||||
|
is present in the RequestContext. The field 'mq_connection' will be added to
|
||||||
|
RequestContext to store the transport object for the cell message queue.
|
||||||
|
|
||||||
|
When a request comes in, nova-api will look up the instance mapping in the
|
||||||
|
API database. It will get the message queue information from the instance's
|
||||||
|
CellMapping and store a transport object in the RequestContext 'mq_connection'
|
||||||
|
field. Then, the RPC API layer will use the transport object for interacting
|
||||||
|
with the cell message queue using the 'mq_connection' to forward the message.
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
One alternative would be to add an argument to RPC API methods to optionally
|
||||||
|
take message queue connection information to use instead of the configuration
|
||||||
|
setting and pass it when making calls destined for another message queue. This
|
||||||
|
would require changing the signatures of all the RPC API methods to take the
|
||||||
|
keyword argument or otherwise finding a way to let the relevant RPC API methods
|
||||||
|
derive from such an interface. There is also precedent of allowing use of a
|
||||||
|
field in the RequestContext to communicate "db_connection" to DB API methods
|
||||||
|
and "read_deleted" to the DB API model_query.
|
||||||
|
|
||||||
|
Data model impact
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
REST API impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
The message queue connection field in the RequestContext could contain
|
||||||
|
sensitive data.
|
||||||
|
|
||||||
|
Notifications impact
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Other end user impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
This change will create RPC transport objects dynamically based on connection
|
||||||
|
information from the RequestContext. There is some overhead to this over the
|
||||||
|
global transport object usually used for a single message queue. The overhead*
|
||||||
|
is the same as in Cells v1 as both Transport objects and RPCClient objects
|
||||||
|
are created dynamically for each message sent to a cell. There is the
|
||||||
|
possibility of caching objects keyed off of hashes of 'mq_connection' along
|
||||||
|
with an expiration scheme if overhead becomes problematic.
|
||||||
|
|
||||||
|
* Creation of Transport objects involves creating the backend driver object
|
||||||
|
and connection pool, so creating them dynamically for each message doesn't
|
||||||
|
take advantage of connection pooling, a new connection to the broker will
|
||||||
|
be made each time.
|
||||||
|
|
||||||
|
Other deployer impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Developer impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
This change means that developers should be aware that cell message queue
|
||||||
|
connection information is contained in the RequestContext and be mindful that
|
||||||
|
it could contain sensitive data. Developers will need to use the interfaces
|
||||||
|
for getting message queue connection information from a CellMapping and setting
|
||||||
|
it in a RequestContext in order to interact with a cell message queue.
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
melwitt
|
||||||
|
|
||||||
|
Other contributors:
|
||||||
|
None
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
* Add a message queue connection field to RequestContext
|
||||||
|
|
||||||
|
* Add message queue connection to the context manager in nova.context that
|
||||||
|
populates a RequestContext with cell connection information given a
|
||||||
|
CellMapping
|
||||||
|
|
||||||
|
* Modify RPC layer and compute RPC API functions to use the message queue
|
||||||
|
connection information from the context, if it's set
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
* https://blueprints.launchpad.net/nova/+spec/cells-v2-mapping
|
||||||
|
|
||||||
|
* https://blueprints.launchpad.net/nova/+spec/cells-instance-mapping
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
Cells v2 testing improvements will include scenarios with multiple cells
|
||||||
|
and upgrading with multiple cells. That is, however, out of scope for the work
|
||||||
|
described in this spec and a new functional test exercising message queue
|
||||||
|
switching combined with the current suite of Tempest and functional tests
|
||||||
|
should be sufficient.
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
Developer documentation could be written to describe how to use the new
|
||||||
|
interfaces.
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
* https://review.openstack.org/#/c/274955/
|
||||||
|
|
||||||
|
History
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. list-table:: Revisions
|
||||||
|
:header-rows: 1
|
||||||
|
|
||||||
|
* - Newton
|
||||||
|
- Introduced
|
||||||
Reference in New Issue
Block a user