zoukankan      html  css  js  c++  java
  • 调度

    我们设想这个设计结构大致由任务包、任务队列、资源池、任务调度器、任务执行器、分布式锁、监控管理等几个核心组件组成,能基本解决任务调度和资源调度问题,同时它不仅支持命令方式操作,也是可编程的,这样更灵活。

    组件说明如下:

    1)“任务包”是一个任务运行压缩包,包括了完整的任务运行程序、配置属性、优先级设置、安全权限等运行时需要的信息,可以定义任务运行所需要的资源,比如启动该任务程序,最少要占用多少CUP和内存。由开发者按照“任务包”的规范开发打包好,然后提交给“任务队列”等待执行,提交的方式可以是命令行也可以是管理界面。

    2)“任务队列”是一个分布式消息队列的实现,它主要用于存放任务包,以排队的方式等待获取资源进行执行,而不是全部任务同时运行争抢资源,任务队列一般是先进先出,也可以根据优先级配置信息调整策略。

    3)“监控管理”是建立在任务队列基础之上的一个界面系统,可以通过它查看队列里任务的数量、等待状况、执行状况,并且可以取消任务和查看任务输出日志,支持命令行和界面操作,同时对任务执行的关键环节(如完成或者取消中止)可以发出事件响应。

    4)“资源池”是一个记录集群计算机资源实时信息的组件,它记录了集群可用计算机的CPU,内存的可用清单,并根据使用情况更新最新信息,资源池可以放在内存里,也可以持久保存在文件数据里。

    5)“任务调度器”是一个一直运行并轮循检测是否未执行任务并有足够的资源运行。它会判断任务队列和资源池两个条件都满足的情况下,获取任务队列里的任务包发送到指定资源的机器上运行,并且根据任务包里的运行属性配置,比如超时检测,如果正常运行完成或者超时,都会释放所占有的资源,并且更新资源池,并标记任务队列里的队列属性状态(已完成或者中止等)或者删除。“任务调度器”从“资源池”获取到的资源有可能是多台机器的,也就是将任务包发送到多台机器并行执行,并且实时检查并行执行状况,这和Torque的方式完全不同。

    6)“分布式锁”,由于“任务调度器”是一个不停止运行的重要组件,所以为了避免单点故障,它是一个主备关系,同时有“任务调度器-主”和“任务调度器-备”同时竞争一个分布式锁,竞争到者为主,未竞争到者为备进行替补等待,一旦“任务调度器-主”出故障,“任务调度器-备”马上抢到分布式锁并继续进行调度检测工作。

    7)“任务执行器”负责PC机器资源的注册和资源隔离,以及在隔离的资源内执行任务。它首先会获取所在计算机的CUP可用核数、内存可用数等资源,发送到资源池进行注册,初始化资源池里的信息。当“任务调度器”发送任务到“任务执行器”执行时,并告诉所需要资源,“任务执行器”使用操作系统或者虚拟机的资源隔离技术,比如Linux的lxc和cgroup,进行资源的隔离,并且在该分配的资源下执行任务,同时将任务的执行状况实时汇报给“任务调度器”。当任务开始执行时,它会更新资源池的该资源占用信息,当任务结束释放资源时,它也会更新最新的资源信息。

    设计完成后,我们再考虑一下如何落地实现,根据我们前面掌握的分布式实现技术,借助Fourinone大部分都可以实现了,例如:

    ❏ 任务队列使用消息队列实现,资源池使用缓存实现。

    ❏ 调度器根据任务队列和资源池条件,根据调度算法进行调度。

    ❏ 分布式锁采用分布式协调功能实现,任务执行采用自动部署实现。

  • 相关阅读:
    Title
    Title
    Title
    Title
    Title
    Title
    Title
    Title
    Title
    git 的使用
  • 原文地址:https://www.cnblogs.com/muzinan110/p/11052075.html
Copyright © 2011-2022 走看看