弹性资源组件elastic-resource设计(三)-资源管理器I

 简介

       弹性资源组件提供动态资源能力,是分布式系统关键基础设施,分布式datax,分布式索引,事件引擎都需要集群和资源的弹性资源能力,提高伸缩性和作业处理能力。

       本文介绍弹性资源组件的设计,包括架构设计和详细设计,指导开发人员代码开发,设计基于《flink原理源码分析(一) 集群与资源@k8s》,抽出作业管理器,包括其内部的调度器,通用化为资源消费者,标准化与资源管理器和任务管理器的交互接口;增加约束,如,组件间通讯rpc组件,高可用组件,心跳组件等,最大程度使用原flink代码,后续的迭代不断标准化,抽象化交互接口,支持不同的实现。

     本文是资源管理器设计第一部分,请求新资源

技术架构

弹性资源组件的技术架构图,其中作业管理器接入系统提供,需实现与资源管理器和任务管理器的交互, 还有一些技术要求。

总体架构是master-worker,master的高可用是k8s的复制机制提供,选主机制k8s提供,作业管理器和资源管理器参与选主,作业管理器/任务管理器接入资源管理器主节点监听,获取最新资源管理器;作业管理器接入作业管理器主节点监听,获取最新的作业管理器主节点

数据架构,资源是组件的核心数据,分两条线a线 现有资源,b线 待定资源

  1. 4资源请求->5a 分配可用资源-> 6a 请求使用资源-> 7a 提供资源->8a 提交任务
  2. 4资源请求->5b 分配待定资源-> 6b 请求新worker-> 7b 启动任务管理器->8b 注册/报告资源

a线是分配现有资源;b线请求新资源,新资源注册后是现有资源,在a线分配

组件架构

上图弹性资源组件架构,作为SDK,提供RPC,slot池,心跳,高可用等组件支持,这些组件有约束的,有可选用的

资源管理器模块

资源管理器负责注册资源,管有资源,处理资源请求,按需请求新资源

弹性资源组件elastic-resource设计(三)-资源管理器I_第1张图片

分配资源

资源消费者资源管理器申请资源

分配可用资源

资源管理器首先尝试分配可用资源,资源分配给任务后,向资源所在的任务管理器 请求使用资源

弹性资源组件elastic-resource设计(三)-资源管理器I_第2张图片

DeclarativeSlotPoolBridge桥接声明式资源池DeclarativeSlotPool,用声明式SlotPool实现SlotPool,为了简化描述,下面描述不区分DeclarativeSlotPoolBridge和DeclarativeSlotPool

  1. 资源消费者调用slotpool组件的PhysicalSlotProvider的allocatePhysicalSlot分配资源
  2. allocatePhysicalSlot首先tryAllocateFromAvailable,从可用资源分配,若当前可用资源不够请求新资源
  3. tryAllocateFromAvailable调用DeclarativeSlotPoolBridge的getAvailableSlotsInformation获取资源池的可用资源,其实际最终调用AllocatedSlotPool的getFreeSlotsInformation并组装为SlotInfoAndResources,该类组合了SlotInfo和ResourceProfile,前者是分配信息,后者是资源信息
  4. SlotSelectionStrategy选择策略在可用资源选择一个最合适的
  5. 选出最合适的资源后,PhysicalSlotProvider调用DeclarativeSlotPoolBridge的allocateAvailableSlot分配资源,该方法不是实际分配资源,而是调用DeclarativeSlotPool的increaseResourceRequirementsBy增加(声明)资源请求,该方法触发异步处理资源请求,notifyNewResourceRequirements后面深入解释
  6. 保留资源,真正的分配在检查资源请求,保留资源AllocatedSlotPool的reserveFreeSlot登记已分配资源AllocatedSlot
  7. 最后调整资源,最终分配不一定与保留的资源一致,最终分配后调整实际资源情况

这里假设资源消费者使用了slotpool组件

最后解释一下notifyNewResourceRequirements的设计

notifyNewResourceRequirements

notifyNewResourceRequirements类型Consumer,函数方法

图1

弹性资源组件elastic-resource设计(三)-资源管理器I_第3张图片

上图是notifyNewResourceRequirements设置和调用的方法,函数是怎么设置?

图2

弹性资源组件elastic-resource设计(三)-资源管理器I_第4张图片

图1是图2的 connect调用,设置模板S,即service属性

设置方法是哪里调起?

弹性资源组件elastic-resource设计(三)-资源管理器I_第5张图片

  1. ResourceManagerLeaderListener监听资源管理器主节点变更,获取新主节点的地址
  2. ResourceManagerLeaderListener通知ResourceConsumer,调用ResourceConsumer的

notifyOfNewResourceManagerLeader方法

     3. notifyOfNewResourceManagerLeader启动rpc连接,或重新连接

    4. rpc连接后,触发onRegistrationSuccess事件方法,事件方法调用DeclarativeSlotPoolService的connectToResourceManager方法,而后者即图1,设置Conumer

总结,请求新资源主要是调用资源管理器的declareRequiredResources方法,该方法用

ResourceManagerLeaderListener和DeclareResourceRequirementServiceConnectionManager绕一下,是为了适应分布式环境下资源管理器上线下线,主节点选举后获取新主的地址,重新连接后设置ResourceManagerGateway,保证与资源管理器的通讯。

请求新资源

可用资源不足以满足所有的任务,资源管理器请求新资源

弹性资源组件elastic-resource设计(三)-资源管理器I_第6张图片

类图跟申请和分配资源基本相同,场景实现由相同的类实现

  1. 调度器在9.11 分配资源没有获得足够可用资源,调用SlotPool的requestNewAllocatedSlot,请求新的资源;这里的SlotPool是DeclarativeSlotPoolBridge桥接 DeclarativeSlotPool实现的SlotPool,实现声明式管理的资源池,下面不区分两者
  2. DeclarativeSlotPoolBridge调用increaseResourceRequirementsBy增加资源请求,调用notifyNewResourceRequirements,参看上节分析

请求新worker

请求新worker是请求新资源的一部分,检查资源声明判断需要新增资源,向k8s集群管理器请求部署新worker,触发任务管理器部署,任务管理器启动后报告新的资源

弹性资源组件elastic-resource设计(三)-资源管理器I_第7张图片

  1. 检查资源声明是请求新资源的延申,检查资源声明判断需要增加资源时调用requestNewWorker
  2. requestNewWorker调用ResourceManagerDriver的requestResource方法,k8s环境下,ResourceManagerDriver实现是KubernetesResourceManagerDriver,requestResource使用kubeclient向k8s集群管理发起《构建和启动任务管理器》,任务管理器启动后,注册任务管理器/报告资源

你可能感兴趣的:(弹性资源组件设计与实现,弹性资源,kubernetes)