使用来自 oslo_db 的新 enginefacade¶
https://blueprints.launchpad.net/nova/+spec/new-oslodb-enginefacade
实现此处描述的新 oslo.db enginefacade 接口
https://blueprints.launchpad.net/oslo.db/+spec/make-enginefacade-a-facade
问题描述¶
链接的 oslo.db 规范包含该提案的详细信息,包括其对所有项目的总体优势。 简而言之,我们使用 RequestContext 对象透明地跟踪数据库事务。 这意味着,如果已经存在事务,我们将默认使用它,仅在明确请求时才创建单独的事务。
用例¶
这些更改只会影响开发人员。
允许修复一类数据库竞争条件
Nova 当前仅在 nova/db/sqlalchemy/api.py 中公开数据库事务,这意味着每个 db api 调用都在自己的事务中。 虽然最初这将保持不变,但新的接口允许调用者在多个 db api 调用中扩展事务(如果他们希望)。 这将使需要原子性的调用者能够实现这一点,包括对多个 Nova 对象进行保存操作。
减少数据库的连接负载
许多数据库 API 调用当前会创建多个单独的数据库连接,这会增加数据库的负载。 通过将这些连接减少到单个连接,将降低数据库的负载。
提高 API 调用的原子性
通过确保数据库 API 调用使用单个事务,我们修复了一类由于失败可能导致部分结果的错误。
更充分地利用从数据库读取的 slave 数据库进行只读事务
新的 API 将代码部分标记为读取器或写入器,并强制执行这种分离。 这使我们能够自动为所有只读事务使用 slave 数据库连接。 目前仅在代码中明确请求时使用。
项目优先级¶
无
提议的变更¶
代码变更¶
装饰 RequestContext 类
nova.RequestContext 使用 @enginefacade.transaction_context_provider 装饰器进行注释。 这添加了几个代码钩子,这些钩子通过 RequestContext 对象提供对事务上下文的访问。
逐步更新数据库 API
数据库 apis 将按函数分批更新,例如 Service apis、quota apis、instance apis。 个人调用将被注释为读取器或写入器。 现有的事务管理将被替换。 对尚未升级的 apis 的调用将继续显式传递会话或连接对象。
尽可能删除 use_slave 的使用
use_slave 参数将从所有升级的数据库 apis 中删除,这将涉及更新调用站点和测试。 如果调用者不再在任何地方使用 use_slave 参数,则将尽可能地传播删除。 唯一的例外是外部接口。 所有 use_slave 的使用都将被删除。 外部接口将继续接受它,但将不会使用它。
Cells ‘api’ 数据库调用
get_api_engine() 和 get_api_session() 将被一个上下文管理器替换,该管理器会更改当前的事务管理器。
备选方案¶
在设计 oslo.db 代码期间,已经检查了替代方案。 此更改的目标是在 OpenStack 项目中实现一个通用解决方案。
数据模型影响¶
无。
REST API 影响¶
无。
此更改使 use_slave 参数在所有使用它的地方都过时了,包括几个具有外部接口的 apis。 我们从所有内部接口中删除它。 对于外部接口,我们将其保留在原位,但忽略它。 只要可能,就会自动使用从属连接。
安全影响¶
没什么明显的。
通知影响¶
无。
其他最终用户影响¶
无。
性能影响¶
通过减少数据库的连接负载,预计此更改将提供轻微的性能改进。 但是,主要目的是正确性。
其他部署者影响¶
无。
开发人员影响¶
这项工作的第一阶段将在 nova/db/sqlalchemy/api.py 中仅实现新的 engine facade,以及访问数据库的几个 cells 调用者。 由于删除 use_slave,此模块的函数签名将进行一些小的更改,但所有调用者都将在这项工作中进行更新。 如果调用者当前没有考虑事务上下文,则无需考虑事务上下文,因为它将自动创建和销毁。
此更改将允许开发人员显式扩展数据库事务上下文,以涵盖多个数据库调用。 这允许调用者以原子方式进行多个数据库更改。
实现¶
负责人¶
- 主要负责人
mbooth-9
工作项¶
启用 Nova 中新 api 的使用
- 沿功能线迁移 API 包
Service
ComputeNode
证书
FloatingIP
DNSDomain
FixedIP
VIF
Instance, InstanceInfoCache, InstanceExtra, InstanceMetadata, InstanceSystemMetadata, InstanceFault, InstanceGroup, InstanceTag
KeyPair
网络
Quota
EC2
BDM
SecurityGroup
ProviderFWRule
迁移
ConsolePool
风味
Cells
Agent
Bandwidth
Volume
S3
Aggregate
操作
Task
PCIDevice
依赖项¶
包含新的 enginefacade API 的 oslo.db 版本
测试¶
此更改不应立即产生功能影响。 当前的测试应该继续通过,除非
内部 API 被修改以删除 use_slave
该更改暴露了一个错误
测试假设了已更改的实现细节
文档影响¶
无。
参考资料¶
https://blueprints.launchpad.net/oslo.db/+spec/make-enginefacade-a-facade