为恢复工作流添加进度详情

https://blueprints.launchpad.net/masakari/+spec/progress-details-recovery-workflows

此蓝图建议添加一个用于恢复工作流的事件通知功能。

问题描述

目前,Masakari 在收到 Masakari 监控程序发起的恢复操作请求时,不会发送任何事件。

在恢复工作流的每个任务阶段接收事件,以及完成状态和进度详情将非常有用,以便操作员可以了解执行过程中发生的情况。

用例

操作员可以通过在恢复的每个事件期间捕获的详细进度详情了解以下信息

  • 恢复流程中每个任务的开始/结束

  • 流程恢复失败的错误

  • 进度详情,其中包含每个任务的详细信息

提议的变更

Masakari 恢复工作流是一组为从故障中恢复而执行的特定任务。Masakari 支持三种类型的恢复故障

  • 实例故障

  • 流程故障

  • 主机故障

对于这些故障中的每一个,Masakari 都会执行一个工作流来从故障中恢复。目前 Masakari 使用 taskflow 库来执行工作流,该工作流由预定义的恢复操作组成,并按线性方式执行。这里建议使用 Taskflow 持久化功能记录这些恢复操作。Masakari 将持久化流程,以便在引擎发生故障时可以恢复、重新启动或回滚。

Taskflow 支持工作流的持久化,这有助于将每个任务的详细信息持久化到数据库中。有关更多详细信息,请参阅 persistence-doc

Taskflow 有以下三个表,用于存储工作流/任务详细信息

  • logbooks

  • flowdetails

  • atomdetails

特别是,对于每个流程,都有一个对应的 flowdetails 记录,对于每个任务,都有一个对应的 atomdetails 记录。这些构成了持久化流程的基本信息级别。

通过导入持久化包 taskflow_persistence 并通过 masakari 引擎访问 Masakari 存储,可以将 Taskflow 表导入到 Masakari 中。在 taskflow 库中,有工作流,每个工作流都有任务,任务具有状态和状态。借助 notifier_method,可以更新每个恢复任务的详细执行流程的进度详情。

保存的恢复任务详细信息(故障、成功、中间结果)将在 Horizon 上以表格形式呈现,这有助于操作员了解恢复的进度/状态。每个流程执行详细信息存储为 0 到 1 的比例,以便操作员可以获取进度完成情况以及每个任务的详细信息。

下面解释了将为“实例故障恢复工作流”记录的操作/事件以及进度详情

  • 停止实例任务:以下列出了将记录的可能事件以及进度详情

    • 停止实例任务的开始

      "progress_details" = {
        "progress": 0.50,
        "progress_data": "Started execution of StopInstanceTask <INSTANCE_UUID>"
      }
      
    • 如果实例未启用 HA_Enabled 并且“process_all_instances”配置选项也已禁用,则跳过恢复事件

      "progress_details" = {
        "progress": 1,
        "progress_data": "Skipping recovery for instance <INSTANCE_UUID> as it is not Ha_Enabled"
      }
      
    • 如果实例 VM 状态为“paused”(暂停)或“rescued”(救援),则忽略恢复事件

      "progress_details" = {
        "progress": 1,
        "progress_data": "Ignoring recovery for instance <INSTANCE_UUID> as it is in paused/rescued state"
      }
      
    • 停止实例事件

      "progress_details" = {
        "progress": 1,
        "progress_data": "Finished execution of StopInstanceTask <INSTANCE_UUID>"
      }
      
    • 如果停止实例失败,则发生故障事件

      "progress_details" = {
        "progress": 1,
        "progress_data": "Failed to stop instance <INSTANCE_UUID>"
      }
      
  • 启动实例任务:以下列出了将记录的可能事件以及进度详情

    • 启动实例事件

      "progress_details" = {
        "progress": 0.5,
        "progress_data": "Started execution of StartInstanceTask <INSTANCE_UUID>"
      }
      
    • 启动实例事件的完成

      "progress_details" = {
        "progress": 1,
        "progress_data": "Finished execution of StartInstanceTask <INSTANCE_UUID>"
      }
      
    • 如果启动实例失败或其状态无效,则发生故障事件

      "progress_details" = {
        "progress": 1,
        "progress_data": "Failed to start instance <INSTANCE_UUID>"
      }
      
  • 确认实例活动任务:以下列出了将记录的可能事件以及进度详情

    • 确认实例事件的开始

      "progress_details" = {
        "progress": 0.5,
        "progress_data": "Confirming instance <INSTANCE_UUID> is Active"
      }
      
    • 确认实例已启动事件的完成

      "progress_details" = {
        "progress": 1,
        "progress_data": "Confirmed instance <INSTANCE_UUID> is Active"
      }
      
    • 如果确认实例失败,则发生故障事件

      "progress_details" = {
        "progress": 1,
        "progress_data": "Failed to confirm instance <INSTANCE_UUID>"
      }
      

注意

仅当 masakari 引擎开始处理通过执行恢复工作流收到的通知时,才会发出事件。

下面介绍了将为“实例故障恢复工作流”记录的数据库条目

LogBook: 'instance_recovery'
- uuid = 68e86fda-25ba-4b1d-a9fc-d999bc1c796e
- created_at = 2019-01-08 08:15:21
- updated_at = 2019-01-08 08:15:21
- meta: {"notification_uuid": "9ca38361-eef9-4fca-a1fe-49ef0c7e23e8"}
FlowDetail: 'instance_recovery_engine'
- uuid = 6a780ae7-9c63-42d9-8510-aa020d7ee566
- state = SUCCESS
TaskDetail: 'StopInstanceTask'
- uuid = c165b8c2-5123-4489-99c1-97eafff72d24
- state = SUCCESS
- version = 1.0
- failure = False
- meta: {}
- results: <CONTEXT_DETAILS>
TaskDetail: 'StopInstanceTask'
- uuid = c165b8c2-5123-4489-99c1-97eafff72d24
- state = SUCCESS
- version = 1.0
- failure = False
- meta:
    + progress = 100.00%
    + progress_details = {
        "progress": 1,
        "progress_details": {
            "at_progress": 1,
            "details": {
                "progress_details": [
                    "progress_details" = {<progress_details_of_event_1>, <progress_details_of_event_2>, ..., <progress_details_of_event_n>}
                ]
            }
        }
     }
- results: NULL
TaskDetail: 'StartInstanceTask'
- uuid = a4155556-fb5a-44f8-b8aa-ab8ecfe8f1ce
- state = SUCCESS
- version = 1.0
- failure = False
- meta:
    + progress = 100.00%
    + progress_details = {
        "progress": 1,
        "progress_details": {
            "at_progress": 1,
            "details": {
                "progress_details": [
                    "progress_details" = {<progress_details_of_event_1>, <progress_details_of_event_2>, ..., <progress_details_of_event_n>}
                ]
            }
        }
     }
- results: NULL
TaskDetail: 'ConfirmInstanceActiveTask'
- uuid = 0ea82633-599b-422d-8fd2-df2057efb29d
- state = SUCCESS
- version = 1.0
- failure = False
- meta:
    + progress = 100.00%
    + progress_details = {
        "progress": 1,
        "progress_details": {
            "at_progress": 1,
            "details": {
                "progress_details": [
                    "progress_details" = {<progress_details_of_event_1>, <progress_details_of_event_2>, ..., <progress_details_of_event_n>}
                ]
            }
        }
     }
- results: NULL

下面介绍了如何在 Horizon 上以表格形式呈现“实例故障恢复工作流”的记录数据,以呈现任务详细信息

* Stop Instance Task
============================================  ==========================  ==========================  ====================================================
Request ID                                    Action                      Start Time                  Message
============================================  ==========================  ==========================  ====================================================
req-679033b7-1755-4929-bf85-eb3bfaef7e0b      StopInstanceTask            Jan 10 2019, 10:40 a.m      Started execution of StopInstanceTask <INSTANCE_UUID>
req-679033b7-1755-4929-bf85-eb3bfaef7e0b      StopInstanceTask            Jan 10 2019, 10:41 a.m      Finished execution of StopInstanceTask <INSTANCE_UUID>
============================================  ==========================  ==========================  ====================================================

* Start Instance Task
============================================  ==========================  ==========================  ====================================================
Request ID                                    Action                      Start Time                  Message
============================================  ==========================  ==========================  ====================================================
req-679033b7-1755-4929-bf85-eb3bfaef7e0b      StartInstanceTask           Jan 10 2019, 10:41 a.m      Starting instance <INSTANCE_UUID>
req-679033b7-1755-4929-bf85-eb3bfaef7e0b      StartInstanceTask           Jan 10 2019, 10:42 a.m      Started instance <INSTANCE_UUID>
============================================  ==========================  ==========================  ====================================================

* Confirm Instance Active Task
============================================  ==========================  ==========================  ====================================================
Request ID                                    Action                      Start Time                  Message
============================================  ==========================  ==========================  ====================================================
req-679033b7-1755-4929-bf85-eb3bfaef7e0b      ConfirmInstanceActiveTask   Jan 10 2019, 10:43 a.m      Confirming instance is Active <INSTANCE_UUID>
req-679033b7-1755-4929-bf85-eb3bfaef7e0b      ConfirmInstanceActiveTask   Jan 10 2019, 10:43 a.m      Confirmed instance is Active <INSTANCE_UUID>
============================================  ==========================  ==========================  ====================================================

备选方案

发送与 OpenStack 其他服务类似的带有版本的通知,用于恢复工作流。

数据模型影响

以下表将添加到 Masakari 数据库

  • alembic_version

  • logbooks

  • flowdetails

  • atomdetails

注意

alembic_version 存储 taskflow 数据库的版本信息,而不是 Masakari 数据库的版本信息。目前 Masakaari 数据库不受 alembic 控制。

例如,对于“实例故障恢复工作流”,数据将存储在以下列中

  • logbooks:父表,每个收到的通知都有一个条目。

  • flowdetails:logbooks 的子表,每个收到的通知都有一个条目。

  • atomdetails:flowdetails 的子表,每个恢复任务都有一个条目。

注意

taskflow 持久化表之间没有外键关联。如果删除 logbook 条目,相应的子条目也会被删除。

REST API 影响

将创建一个新的微版本,以将事件详细信息添加到 GET /notifications/<notification_uuid> API。

安全影响

通知影响

Masakari 恢复故障不支持事件通知功能。此规范将添加此功能。

其他最终用户影响

性能影响

由于在将每个恢复故障的处理过程存储到数据库中的过程中存在开销,因此性能会略有下降。

其他部署者影响

开发人员影响

实现

负责人

主要负责人

工作项

  • 为每个 taskflow 获取 Masakari 后端作为后端

  • 使用所有详细信息执行 taskflow,在每个需要任务时

  • 使用进度状态填充元数据

  • 更新 GET /notifications/<notification_uuid> API 中的新微版本,以传递存储的恢复故障相关事件信息

  • 更新单元测试以进行代码覆盖

  • 添加有关如何在 Horizon 上使用此功能的文档

依赖项

测试

无需编写 tempest 测试,因为单元测试足以检查是否为恢复操作发送了事件。

文档影响

参考资料

历史

修订版

发布名称

描述

Stein

引入