zoukankan      html  css  js  c++  java
  • Ambari Agent Command 处理流程

    一、概述:

    根据 Ambari Server 架构 文章中的介绍,由于 Ambari Server 和 Ambari Agent 之间是通过 HTTP 短连接进行通信,所以 Server 无法把需要执行的 Command,直接推送给 Agent,而是需要把命令存储在 ActionQueue 中,

    然后 Agent 通过定期发送 Heartbeat 请求,把 Command 拉过去执行,并通过下次的 Heartbeat 请求,返回执行结果。下面简单分析一下 Command 的处理过程。

    二、Agent Command 类型

    • REGISTRATION_COMMAND:注册指令,当 Server 发现 节点未注册、节点当前状态为 HEARTBEAT_LOST、Agent 上传的主机状态 Server 处理失败的时候,会要求 Agent 重试进行注册。
    • STATUS_COMMAND:汇报状态指令,Server 端有个定时任务 HeartbeatMonitor 默认1分钟执行一次,要求 Agent 汇报当前的组件状态、当前使用的配置版本等信息。
    • EXECUTION_COMMAND:执行任务指令,当我们操作服务/组件的时候,比如:安装、启动、停止、更新配置等,就会发送这个指令。
    • CANCEL_COMMAND:取消任务指令,中断一个操作。
    • ALERT_DEFINITION_COMMAND:更新 Alert 定义指令,当我们修改了 Alert 信息、增删组件、删节点的时候,会发送这个指令。
    • ALERT_EXECUTION_COMMAND:立即执行一个 Alert。

    上面这些指令,除了 REGISTRATION_COMMAND,其他指令都需要先添加到 ActionQueue 中,Server 处理心跳逻辑时,如果发现 Agent 需要重新注册,会立即生成 REGISTRATION_COMMAND,要求 Agent 重新注册。

    下面着重介绍一下 EXECUTION_COMMAND,可以看出来这个指令使用频率最高、最重要,处理逻辑也是最复杂的,理解了这个指令,其他指令的处理逻辑大同小异。

    三、EXECUTION_COMMAND 处理流程

    时机:用户触发了一个服务/组件的操作

    服务端处理逻辑:

    (1) 计算依赖,生成 Command,并保存到数据库
    (2) 定期从数据库加载 Command,并添加到 ActionQueue
    (3) 心跳逻辑:
      · 把 ActionQueue 中的所有 Command 下发给 Agent
      · 根据 Agent 的汇报,处理 Command 执行结果

    1、计算依赖

    如下图所示:

    • 一个 Request 包含多个 Stage
    • 一个 Stage 包含多个 Task
    • 一个 Task 对应一条 Command

    需要注意的是 Stage 之间有依赖关系,必须前一个 Stage 运行完,才能开始下一个 Stage;而多个 Task 可以并行执行。

    Stage之间的依赖关系是使用有向无环图(DAG)计算出来的,下面简单介绍一下DAG:

    • 节点:要执行的任务
    • 有向边:依赖关系,A 到 B 的箭头,代表 B 依赖 A
    • 无环:指的是没有循环依赖

    举一个启动 HDFS 的例子:

    在 role_command_order.json 文件中定义依赖关系:  "DATANODE-START" : ["NAMENODE-START"]

    生成 Command 并保存到数据库

    表关系如下图:

     2、定期从数据库中载入 Command 添加到 ActionQueue

    这段逻辑在 ActionScheduler 类中,总结一下:

    (1) 处理被取消的 Request

    • 未下发的 Command,服务端直接改状态
    • 已下发的 Command,生成 CANCEL_COMMAND

    (2) 从数据库载入 Command 并添加到 ActionQueue

    • 任务是否需要独占运行
    • 同一个 Request,只能有一个 Stage 运行
    • 超时逻辑
    • 重试逻辑
    • 前一个 Stage 运行失败,后边 Stage 直接取消
    • 满足条件的 Command 添加到 ActionQueue
  • 相关阅读:
    linux下文件搜索命令学习笔记
    【转】C++格式化输出
    UNIX中的文件类型
    Unix内核中打开文件的表示
    网络编程学习笔记:linux下的socket编程
    TCP协议学习笔记(一)首部以及TCP的三次握手连接四次挥手断开
    C/C++源代码从写完到运行发生了什么
    C++ 函数形参发生动态绑定时指针增长步长与静态类型一致
    C++中为什么要将析构函数定义成虚函数
    C++求一个十进制的二进制中1的个数
  • 原文地址:https://www.cnblogs.com/basenet855x/p/6841488.html
Copyright © 2011-2022 走看看