使用来自 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 版本

https://review.openstack.org/#/c/138215/

测试

此更改不应立即产生功能影响。 当前的测试应该继续通过,除非

  • 内部 API 被修改以删除 use_slave

  • 该更改暴露了一个错误

  • 测试假设了已更改的实现细节

文档影响

无。

参考资料

https://blueprints.launchpad.net/oslo.db/+spec/make-enginefacade-a-facade