使用 Mistral 的可扩展 VIM 监控

https://blueprints.launchpad.net/tacker/+spec/refactor-vim-monitor

问题描述

目前,每当注册一个 VIM 时,Tacker 服务器都会启动一个线程,这无法扩展。

  • 如果我们有很多 VIM,Tacker 服务器将不得不运行大量的线程来监控它们,这将影响 Tacker 服务器的 API 功能。

  • 如果 Tacker 服务器重启,监控线程将不会启动。

  • 无法运行多个 Tacker 服务器。

提议的变更

asciiflow

                             +---------------------+
                             | Mistral workflow    |
                     +-------> VIM monitor action  |
+--------------+     |       |                     |
| Tacker server+-----+       +------------------+--+
+-----+--------+                                |
      |                                         |
      |                                         |
      |                                 +-------v----------+
      |                                 |                  |
      |                                 | Conductor server |
      |       +------------+     +------+                  |
      |       |            |     |      +------------------+
      +-------> Tacker DB  <-----+
              |            |
              +------------+

由于 Mistral 是 Tacker 系统不可或缺的一部分,因此可以使用一个长期运行的 Mistral 工作流动作来执行此类任务。

Tacker 服务器将在注册新的 VIM 时生成一个 VIM 可达性测试工作流并执行它。一旦 VIM 从 Tacker 服务器取消注册,工作流和执行将被删除。

Vim 监控动作无法直接访问 Tacker 数据库,因此我们引入了一个 Conductor 服务器来为 Mistral 动作执行数据库访问。

即使删除了工作流执行,Mistral 也不会停止长期运行的动作。因此,为动作设计了一种退出机制。每 1 分钟,动作将联系 Conductor 以查看它是否是所需的动作类,如果是,则动作应退出循环并退出。为了处理大量 VIM 的可扩展性,可以在 Conductor(s) 前面放置负载均衡器。

Mistral 动作将使用 RPC 与 Conductor 服务器通信。Ping 动作通过以下接口 VimMonitor 与 Conductor 通信。

class VimMonitorAction2ConductorRPC(object)
   # update vim's status, action_id is the task action
   def update_vim (vim_id, status, action_id):
      # The response message containing the operation result
      # the status should be the passed in by request or 'bad_action'
      # if the action is not the wanted action.
      status = rpc call conductor
      return status

注册 VIM 的序列图

../../_images/018.png

取消注册 VIM 的序列图

../../_images/024.png

使用认证 URL 更改更新 VIM 的序列图

../../_images/031.png

备选方案

使用 Mistral 的另一种方法是使用循环工作流

asciiflow

start_task -----> ping_task ------> update_task
                      ^               |
                      |               |
                      |               |
                      |   on_succes   |
                      +---------------+

但是 Mistral 会将任务执行保存到 Mistral 数据库中,因此循环工作流将为每个 VIM 在 Mistral 数据库中填充数千条 ping_task 和 update_task 记录,这将影响 Mistral 数据库。

数据模型影响

VIM 数据库将被扩展,以包含一个 Mistral 动作 ID 列,用于记录当前的动作 ID。

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他开发人员影响

将启动一个新的 RPC 服务器,并且可以使用负载均衡器进行多个 Tacker Conductor 部署。

这将有助于部署多个 Tacker 服务器

开发人员影响

实现

负责人

主要负责人

gongysh

其他贡献者

<launchpad-id 或 None>

工作项

  • 重构 Tacker 服务器中的工作流代码

  • 实现工作流版本的 VIM 可达性监控

  • 单元测试

依赖项

  • rabbitmq

  • oslo message

测试

可以通过以下步骤测试此功能

  • 设置将启动 Tacker Conductor 服务器的 Tacker 系统

  • 注册一个 VIM

  • 检查 VIM 监控工作流是否已设置,并且 Mistral 执行器组件上正在运行一个 ping 动作

  • 取消注册 VIM,以检查 Mistral 动作是否会退出

文档影响

  • 更改 Tacker 部署文档

  • 添加一篇关于在 Tacker 服务器中使用 Mistral 工作流执行动作的文档

参考资料