支持节点历史

https://storyboard.openstack.org/#!/story/2002980

本规范提出为节点增加历史记录支持,这对于识别问题非常有用。

问题描述

目前 ironic 使用一个 last_error 字段来记录操作失败时的错误信息,该字段很容易被覆盖。为了追溯根本原因,我们必须在云中的某个地方搜索 conductor 主机上的日志。为了使裸机管理更轻松,拥有一个历史记录会很有帮助,特别是节点的错误和状态转换。

该提案是引入一个新的表来存储这些事件,并提供 API 支持来检索它们。

提议的变更

引入名为 node_history 的新表和一个 db 对象 NodeHistory,有关模式定义,请参见 数据模型影响

实现 API 层以支持节点历史记录查询。节点历史记录应该只允许查询。

在此提案中只会记录两种类型的事件

  • 状态转换

  • 所有内容都将进入 last_error,这也涵盖节点维护状态更改。

根据未来需求可以扩展范围,但不在本规范中包含。

引入一个周期性任务来删除超出指定最大数量的节点历史记录条目,该数量将由配置选项进行配置。

添加一个 history 模块来提供历史记录接口抽象,并提供 nonedatabase 两种实现。

备选方案

还存在其他解决方案,例如使用 LOG 收集器和聚合器,但它们需要更多的集成,并且不直接由 ironic 支持。

数据模型影响

将添加一个具有以下模式的新数据库表

op.create_table('node_history',
                sa.Column('created_at', sa.DateTime(), nullable=True),
                sa.Column('updated_at', sa.DateTime(), nullable=True),
                sa.Column('id', sa.Integer(), nullable=False),
                sa.Column('uuid', sa.String(length=36), nullable=False),
                sa.Column('conductor', sa.String(length=255), nullable=True),
                sa.Column('event', sa.Text(), nullable=True),
                sa.Column('node_id', sa.Integer(), nullable=True),
                sa.Column('user'), sa.String(length=32), nullable=True),
                sa.PrimaryKeyConstraint('id'),
                sa.UniqueConstraint('uuid', name='uniq_history0uuid'),
                sa.ForeignKeyConstraint(['node_id'], ['nodes.id'], ),
                                        mysql_ENGINE='InnoDB',
                                        mysql_DEFAULT_CHARSET='UTF8')
                sa.Index('node_id', 'node_id')

event 是一个字符串,传达了节点上发生的事情,内容将被截断为 1000 个字符。

conductor 是记录条目的 conductor 的主机名。

user 是来自上下文的操作请求者,对于 Identify 服务,它是一个固定长度的字符串。

状态机影响

REST API 影响

将添加以下端点以支持查询节点历史记录,并进行微版本控制。使用早期微版本的客户端将收到 404 错误。

  • GET /v1/{node_ident}/history

    • 检索为此节点记录的所有事件的列表。默认情况下,返回 uuideventcreated_atevent 将被截断为 255 个字符,以提供简要信息。如果查询字符串中将 detail 设置为 True,则将返回详细的历史记录条目。

    • 对于正常请求,返回 200。

  • GET /v1/{node_ident}/history/{history_uuid}

    • 获取事件的详细信息。

    • 对于正常请求,返回 200。

客户端 (CLI) 影响

“openstack baremetal” CLI

OSC 将被增强以支持以下操作

  • openstack baremetal node history list:列出此节点保存的所有事件

  • openstack baremetal node history show <uuid>:显示特定的节点事件

RPC API 影响

驱动程序 API 影响

Nova 驱动程序影响

Ramdisk 影响

安全影响

其他最终用户影响

可扩展性影响

节点事件可能会占用数据库中相当大的数据量,具体取决于裸机规模和活动。在这种情况下,应评估此功能的配置选项。

性能影响

新的周期性任务和数据库访问将使用一些资源,但应该微不足道。

其他部署者影响

添加以下配置选项以更改此功能的行为

  • [conductor]node_history_backend:可以是 nonedatabasenone 什么也不做,有效地禁用此功能,这是默认值。

  • [conductor]node_history_max_entries:ironic 应该保留多少个事件。达到最大条目数时,将删除最旧的事件。默认值为 300,最小值是 1。

  • [conductor]node_history_cleanup_interval:清理周期性任务应该安排的间隔(以秒为单位)。默认情况下为一天。设置为 0 将禁用周期性清理。

  • [conductor]node_history_cleanup_batch_num:一次清理操作中将删除的最大条目数。

开发人员影响

一旦本规范实施,可以添加其他事件。

实现

负责人

主要负责人

<kaifeng, kaifeng.w@gmail.com>

其他贡献者

<None>

工作项

实施建议的工作

  • 数据库支持

  • 历史模块和两种后端,即 none 和 database

  • 在适当的代码路径上记录历史记录

  • API 支持

  • CLI 支持

  • 文档

依赖项

测试

该功能将通过单元测试覆盖。

升级和向后兼容性

默认情况下禁用此功能。

文档影响

将更新文档。

参考资料