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

 简介

       弹性资源组件提供动态资源能力,是分布式系统关键基础设施,分布式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设计(三)-资源管理器II_第1张图片

  1. 任务管理器启动,同时启动高可用组件,触发ResourceManagerLeaderListener监听机制
  2. ResourceManagerLeaderListener调用TaskExecutor的notifyOfNewResourceManagerLeader方法,通知TaskExecutor新的资源管理器leader诞生
  3. notifyOfNewResourceManagerLeader方法使用RegisteredRpcConnection连接到资源管理器
  4. RegisteredRpcConnection连接完成后,触发事件onRegistrationSuccess,onRegistrationSuccess调用资源管理器的sendSlotReport(rpc)方法报告资源
  5. ResourceManager的sendSlotReport方法,调用SlotManager注册任务管理器和登记资源
  6. 最后,新资源登记完成,资源变更了,采用延时异步方式执行《检查资源需求》,再分配资源

检查资源需求/检查资源声明

检查资源需求/检查资源声明资源管理的核心方法,属于内部用例,本章解释一下设计原理

上面的资源域场景分为两类,提出资源需求提供资源, 检查资源请求/检查资源声明是交汇点,检查资源请求,该分配的分配,该请求新的请求新的资源;检查资源声明,哪些资源可以释放,需要新资源请求新worker。

    本章深入分析两方法,上游提出资源需求和下游提供资源的串联,资源状态演变,存储型态

检查资源需求(checkResourceRequirements)

检查资源需求是真正的分配资源,上面说的分配只是增加请求

获取作业的未完成资源请求

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

尝试分配可用资源到作业

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

之所以尝试,资源变更触发调用检查资源请求,但不一定是增加,可能是无效分配

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

slotTracker获取所有可用资源,与请求匹配,合适的分配allocateSlot,该方法对应场景请求使用资源/提供资源

尝试使用待定的资源

弹性资源组件elastic-resource设计(三)-资源管理器II_第5张图片待定资源是指申请了新的worker或者将要申请新worker所产生的资源,两者都是目前没有物理上的对应资源,通俗说就是先占个坑,等申请了资源再填回去

弹性资源组件elastic-resource设计(三)-资源管理器II_第6张图片同样,首先匹配现有的待定资源,若还有未分配创建新的待定资源

tryAllocateWorkerAndReserveSlot调用TaskExecutorManager的allocateWorker,创建待定资源PendingTaskManagerSlot,预先挖好”坑”

弹性资源组件elastic-resource设计(三)-资源管理器II_第7张图片declareNeededResourcesWithDelay方法下节介绍,按需要申请新的worker,增加物理资源

到此还有一个问题,物理资源到位后怎样填待定资源的”坑”

自然想到注册任务管理器/报告资源,使用新增资源抵消待定资源,填”坑”

TaskExecutorManager的registerTaskManager方法

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

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

检查资源声明(checkResourceDeclarations)

声明资源,要申请多少资源,可释放多少资源,上一节检查资源请求打开新待定资源,最终调用checkResourceDeclarations实际申请新worker获得物理资源,为了支持动态/静态资源申请,中间ResourceAllocator转接了一下,这里不详细分析

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

现有的worker数量-需要的worker数量,大于0,worker多了,可以释放;反之,worker少了,需要打开新worker

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

requestNewWorker参看请求新worker

ResourceDeclaration怎么来?

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

主要是计算totalWorkerNum,现有worker总数量

totalWorkerNum = pendingWorkerNum + neededRegisteredWorkers

pendingWorkerNum 待定的slots除以每个worker的slots,向上修正,只多不少

neededRegisteredWorkers是已经注册的worker减去待释放的worker

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