将计算更新从周期性改为按需

包含您的 Launchpad 蓝图的 URL

https://blueprints.launchpad.net/nova/+spec/on-demand-compute-update

目前,所有计算节点都在数据库中以周期性方式(当前周期为 60 秒)更新状态信息。鉴于节点状态仅在特定时间点发生变化(主要是镜像创建/销毁),这会导致大型系统中的数据库开销显著增加。此 BP 将更新机制更改为仅在节点状态发生变化时更新数据库,具体是在节点启动、实例创建和实例销毁时。

问题描述

计算节点的状态信息以周期性方式更新到数据库中。这意味着系统中的每个计算节点每 60 秒(此更新的默认周期)在数据库中更新一行。鉴于状态信息大多是静态的并且不经常变化,主要是在创建或销毁实例时才会发生变化,因此这是不必要的且存在可扩展性问题。

提议的变更

计算节点仅在状态发生变化时发送更新。在周期性间隔(使用当前默认周期 60 秒)内,计算节点会将自身的状态与上次更新时保存的状态进行比较。只有当状态或声明发生变化时,才会更新数据库。

这种方法的优点是它应该显著减少数据库更新的数量,同时几乎不会改变系统当前的工作方式。计算节点的变化仍然需要 60 秒才能更新,但任何原因导致的任何变化最终都会被报告。

一个潜在的问题是可能的敏感性问题,如果例如,稳定系统活动导致 RAM 使用量略有变化,则不应持续发送更新。需要进行一些实验来确定是否需要为某些状态指标添加敏感性控制。如果需要,这可以作为后续优化,因为此设计不会比当前机制更差。

备选方案

另一个想法是在某些明确定义的事件时才更新数据库。更新代码仅会在系统启动、实例创建和实例删除时调用。这将减少状态更新的延迟(数据库在系统状态发生变化时立即修改),但它存在一些缺点

1) 找到所有记录状态变化的适当事件。启动/创建/销毁是否是系统状态发生变化的唯一位置,也许还有其他事件应该被跟踪。

2) 未来的更改可能会添加新的更改状态的事件,并且识别需要更新是一个容易忽略的错误。

3) 状态可能在 nova 代码不知情的情况下发生变化,例如内存的热插拔。

数据模型影响

数据库中存储的数据没有变化,所有当前字段都以相同的方式存储,此 BP 只是更改了更新这些字段的频率。

REST API 影响

无。

安全影响

无。

通知影响

无。

其他最终用户影响

无。

性能影响

根据数据库更新的测量结果,此更改显然不会导致比当前技术更多的数据库更新,并且假设节点上实例的创建速率低于每 60 秒一个,应该导致更少的数据库更新。

其他部署者影响

无。

开发人员影响

实现

负责人

主要负责人

Don Dugger <donald.d.dugger@intel.com>

其他贡献者

工作项

更改应该相当简单,将当前更新代码更改为仅在“state_modified”例程返回 true 时才更新数据库。“state_modified”例程如果当前状态与上次记录的状态匹配则返回 false。否则,它将当前状态保存为上次记录的状态并返回 true。

“state_modified”例程维护一个内存副本,其中包含计算节点的当前状态。将此状态的副本与当前状态进行比较,并且仅当副本和当前状态不同时才发生数据库更新。请注意,内存副本在节点启动时初始化为零值,因此第一次周期性更新调用将发现两个状态之间的不匹配,并且数据库将被更新。

基于实验,确定简单比较整个当前状态与保存状态就足够了。如果将来将更多快速变化的数据添加到计算节点状态中,而这些数据不应存储在数据库中,则可以轻松更改“state_modified”以忽略不需要的此类数据。

依赖项

无。

测试

将创建一个单元测试,以确保在计算节点状态发生变化时更新数据库,并且在状态未发生变化时不会更新数据库。

文档影响

Associate Training Guide 的第 5 节

https://docs.openstack.org/training-guides/content/associate-computer-node.html

略有不正确,应该进行修复。目前它说“所有计算节点(在 OpenStack 术语中也称为主机)会定期通过队列将其状态、可用资源和硬件功能发布到 nova-scheduler。” 这应该修改为反映状态更新到数据库中,然后调度器查询数据库。(请注意,这是一个通用修复,与此蓝图无关。)

参考资料

无。