单元数据库连接切换¶
https://blueprints.launchpad.net/nova/+spec/cells-db-connection-switching
为了使 Nova API 能够对单元数据库执行查询,必须使用目标单元的数据库连接信息。Nova API 必须将单元数据库连接信息传递给 DB API 层。
问题描述¶
在 Cells v2 中,不再使用 nova-cells 代理,nova-api 将直接与实例的单元数据库和消息队列交互。实例 -> 单元映射存储在 API 级别数据库中的一个表中。每个 InstanceMapping 引用一个 CellMapping,CellMapping 包含单元的连接信息。我们需要一种方法将 CellMapping 中的数据库连接信息传递给 DB 层,以便当我们更新一个实例时,它将在实例的数据所在的单元数据库中更新。
用例¶
运营商希望将他们的部署划分为单元,以实现扩展、故障域和构建原因。在划分后,我们需要一种方法将查询路由到实例的单元数据库。
项目优先级¶
Cells v2 是 Liberty 周期中的一个项目优先级。
提议的变更¶
我们建议将单元的数据库连接信息存储在 RequestContext 中,DB API 层可以使用它与单元数据库交互。目前,DB 层可以使用两个数据库:‘main’ 和 ‘api’,由调用者通过方法名选择。我们希望将这两种方法合并为一个,该方法接受一个参数以选择要使用的 EngineFacade。字段 ‘db_connection’ 将添加到 RequestContext 中,以存储用于查找 EngineFacade 的键。
当请求到达时,nova-api 将在 API 数据库中查找实例映射。它将从实例的 CellMapping 获取数据库信息,并将基于它的键存储在 RequestContext 的 ‘db_connection’ 字段中。然后,DB 层将使用存储在 RequestContext 中的 ‘db_connection’ 键查找用于与单元数据库交互的 EngineFacade 对象。
备选方案¶
另一种方法是将参数添加到 DB API 方法中,以可选地使用数据库连接信息,而不是配置设置,并在对对象采取操作时传递它。这将需要更改所有 DB API 方法的签名以接受关键字参数,或者找到一种让所有 DB API 方法都从这样的接口派生的方法。此外,允许在 RequestContext 中使用一个字段来向 DB API model_query 传递“read_deleted”也有先例。
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
RequestContext 中的数据库连接字段可能包含敏感数据。
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
此更改本身不会引入性能影响。将所有映射保留在 API DB 中,并将实例详细信息保留在单元数据库中的整体设计,会增加一次数据库查找以获取单元数据库连接信息。但是,可以通过缓存映射来解决此问题。
其他部署者影响¶
无
开发人员影响¶
此更改意味着开发人员应该意识到单元数据库连接信息包含在 RequestContext 中,并注意它可能包含敏感数据。开发人员需要使用从 CellMapping 获取数据库连接信息并将其设置到 RequestContext 的接口,以便查询单元数据库。
实现¶
负责人¶
- 主要负责人
melwitt
- 其他贡献者
dheeraj-gupta4
工作项¶
在 RequestContext 中添加数据库连接字段
在 nova.context 中添加一个上下文管理器,该管理器使用给定的 CellMapping 填充包含数据库连接信息的 RequestContext
修改 nova.db.sqlalchemy.api get_session 和 get_engine 以使用上下文中设置的数据库连接信息(如果已设置)
依赖项¶
测试¶
由于此更改不会产生任何用户可见的更改,因此当前的 Tempest 或功能测试套件应该足够。
文档影响¶
可以编写开发人员文档来描述如何使用新的接口。