• 弹性资源组件elastic-resource设计(二)-集群


    简介

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

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

    关键词

    资源消费者/资源管理器/任务管理器  弹性资源组件关联的3个主要角色

    参考资料

    《flink原理源码分析(一) 集群与资源@k8s》 详细分析了flink集群与资源的源码和原理

    场景视图

    上图是场景视图

    • 集群

    集群启动,master和worker构建,k8s环境下,涉及k8s客户端的使用

    • 资源管理器

    资源的申请,管有资源

    • 任务管理器

    资源的提供,任务执行

    • 功能组件

    功能组件的原理和用法解释

    • 资源消费者

    描述弹性资源组件接入规范

    技术架构

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

    总体架构是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池,心跳,高可用等组件支持,这些组件有约束的,有可选用的

    集群模块

        集群是资源的载体,弹性资源基础是弹性的集群,弹性资源集群架构采用master-worker,首先启动master,master包括资源消费者,资源管理器,master是弹性的决策器,控制worker的部署和释放

    启动集群

    管理员通过命令行或管理台,启动集群,提供环境配置和参数配置;部署k8smaster,使用kuebclient发起构建Deplolyment资源和其他资源

    k8s集群管理器收到部署请求执行master启动脚本,部署和启动master,随着资源消费者的资源申请,部署和启动新的任务管理器

    启动集群

    Configuration配置容器

    1. 用户命令行执行elastic-resource.sh,主入口是ElasticResourceCli main
    2. ClusterClientServiceLoader SPI机制载入ClusterClientFactory,k8s环境下实现类是KubernetesClusterClientFactory
    3. ClusterClientFactory是ClusterClient工厂,首先创建ClusterDescriptor集群描述,该类负责部署集群,最终返回ClusterClient,k8s环境下实现类是KubernetesClusterDescriptor
    4. KubernetesClusterDescriptor新建集群规格ClusterSpecification,该类不是针对k8s,定义了flink master和任务管理器的内存容量等技术参数,通用于容器类的集群
    5. KubernetesClusterDescriptor的deploySessionCluster部署k8s集群,参看《部署k8s master》用例
    6. 最后返回ClusterClient,用于后续集群操作

    部署k8s master

    部署k8s master是集群启动的第二步,KubernetesClusterDescriptor的deployClusterInternal方法,构建部署规格,使用flink kubeclient提交到k8s集群管理器,触发部署和启动master

    1. 首先更新配置,主要是对外端口,更新为固定的,支持对外Service通讯
    2. 构建KubernetesMasterComponentParameters,该类包装Configuration和ClusterSpecification,为获取参数提供便利
    3. 构建CommponentPod,首先载入pod模板构建KubernetesPod,KubernetesPod是一个包装了k8s Pod对象的Resource类,然后以KubernetesPod构建CommponentPod,定义了mainContainer ,podWithoutMainContainer,其中主容器固定名称,用于运行资源消费者任务管理器,其他容器运行相关的资源,如ConfigMap,Service等,详细分析参考kubeclient
    4. KubernetesMasterFactory构建部署规格,KubeClient使用部署规格部署master组件,两用例在kubeclient分析,k8s集群管理器《部署和启动master》
    5. 最后客户端调用createClusterClientProvider返回ClusterClient

    部署和启动master

    启动集群触发部署和启动master,包括资源消费者资源管理器,其中资源消费者接入系统提供,并提供工厂实现

    上图是构建和启动弹性资源master的交互图,参看构建kubeclient构建master组件的CmdMasterDecorator设置了容器初始执行脚本和参数,集群初始入口KubernetesClusterEntryPoint

    1. 容器初始执行elastic-resource-master.sh,ClusterEntryPoint设置为KubernetesClusterEntrypoint

        2. KubernetesClusterEntrypoint继承ClusterEntrypoint,MasterComponentFactory关联接入系统提供的ResourceConsumerComponentFactory,用于构建资源消费者

       3. 经过容错日志,插件文件系统初始化,进入ClusterEntrypoint的runCluster,该方法主要做两个事,initializeServicesMasterComponent

        4. initializeServices构建基础服务,Rpc服务,slot池组件,ha服务,metrics服务等

        5. MasterComponent  master组件初始化和启动;同时也是持有者,用于后面关闭和清理

    至此,master启动,资源消费者消费资源,资源管理器随着资源消费部署和启动新的任务管理器

    部署和启动任务管理器

    资源管理器按需启动任务管理器增加资源

    1. 新建任务管理器新建master组件类似,pod装饰器CmdTaskManagerDecorator实现了pod装饰,设置shell执行命令和执行参数

    设置执行脚本KUBERNETES_TASK_MANAGER_SCRIPT_PATH= "elastic-source-worker.sh"

    主入口KubernetesTaskExecutorRunner main

        2. 任务管理器启动比较简单,主要启动rpc服务和高可用组件,高可用组件触发注册任务管理器/报告资源

    NEXT

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

    弹性资源组件elastic-resource设计(四)-任务管理器

    弹性资源组件elastic-resource设计(五)-资源消费者接入规范

    弹性资源组件elastic-resource设计(六)-功能组件,rpc,心跳,slotpool,metrics,kubeclient

  • 相关阅读:
    redis---分布式锁存在的问题及解决方案(Redisson)
    Python | Leetcode Python题解之第200题岛屿数量
    滑动窗口的最大值(双端队列,单调队列)
    [附源码]java毕业设计学校缴费系统
    肖sir__项目讲解流程___(自我介绍、项目流程)
    Navigation 组件(三) ViewModel,LiveData,DataBinding 组合使用
    AKShare在股票数据中的应用
    什么是新媒体矩阵?如何搭建?
    计算机图形学 实验一:二维图形绘制
    C#构造函数
  • 原文地址:https://blog.csdn.net/szlhj/article/details/133696717