mesos架构

定义一个最小化的接口来支持跨框架的资源共享,其他的调度以及执行工作都委托给框架自己来控制。

Mesos不试图作为一个一栈式解决问题的系统,而是以最小的成本来实现资源共享。这是官方提供的架构图:

mesos总体架构

Apache Mesos由四个组件组成,分别是Mesos-master,mesos-agent,framework和executor。

Mesos-master是整个系统的核心,负责管理接入mesos的各个framework(由frameworks_manager管理)和slave(由slaves_manager管理),并将slave上的资源按照某种策略分配给framework(由独立插拔模块Allocator管理)。

Mesos-agent负责接收并执行来自mesos-master的命令、管理节点上的mesos-task,并为各个task分配资源。mesos-agent将自己的资源量发送给mesos-master,由mesos-master中的Allocator模块决定将资源分配给哪个framework,当前考虑的资源有CPU和内存两种,也就是说,mesos-agent会将CPU个数和内存量发送给mesos-master,而用户提交作业时,需要指定每个任务需要的CPU个数和内存量,这样,当任务运行时,mesos-agent会将任务放到包含固定资源的linux container中运行,以达到资源隔离的效果。很明显,master存在单点故障问题,为此,mesos采用了zookeeper解决该问题。

Framework是指外部的计算框架,如Hadoop,Mesos等,这些计算框架可通过注册的方式接入mesos,以便mesos进行统一管理和资源分配。Mesos要求可接入的框架必须有一个调度器模块,该调度器负责框架内部的任务调度。当一个framework想要接入mesos时,需要修改自己的调度器,以便向mesos注册,并获取mesos分配给自己的资源, 这样再由自己的调度器将这些资源分配给框架中的任务,也就是说,整个mesos系统采用了双层调度框架:第一层,由mesos将资源分配给框架;第二层,框架自己的调度器将资源分配给自己内部的任务。当前Mesos支持三种语言编写的调度器,分别是C++,java和python,为了向各种调度器提供统一的接入方式,Mesos内部采用C++实现了一个MesosSchedulerDriver(调度器驱动器),framework的调度器可调用该driver中的接口与Mesos-master交互,完成一系列功能(如注册,资源分配等)。

Executor主要用于启动框架内部的task。由于不同的框架,启动task的接口或者方式不同,当一个新的框架要接入mesos时,需要编写一个executor,告诉mesos如何启动该框架中的task。为了向各种框架提供统一的执行器编写方式,Mesos内部采用C++实现了一个MesosExecutorDiver(执行器驱动器),framework可通过该驱动器的相关接口告诉mesos启动task的方法。

Mesos中的调度机制被称为“Resource Offer”,采用了基于资源量的调度机制。在mesos中,agent直接将资源量(CPU和内存)汇报给master,由master将资源量按照某种机制分配给framework,其中,“某种机制”是“Dominant Resource Fairness(DRF)”

对于类似mesos采用双层调度框架的系统,在设计时,需要解决以下问题:

“Mesos在不知道各个framework资源需求的情况下,如何满足其需求?”,更具体一些,“Mesos在不知道framework中哪些数据存放在哪些节点情况下,如何做到数据locality?”为了解决该问题,mesos提供了“reject offer”机制,允许framework暂时拒绝不满足其资源需求的agent。

在mesos中,作业调度是一个分布式的过程,当出现失败情况时,需要表现出一定的高效性和鲁棒性。为此,mesos提供了以下机制:

  • filters机制。 每次调度过程,mesos-master需要与framework-scheduler进行通信,如果有些framework总是拒绝agent,那么由于额外的通信开销会使得调度性能低效。为此避免不必要的通信,mesos提供了filters机制,允许framework只接收“剩余资源量大于L的agent”或者“只接收node列表中的agent”。
  • rescinds机制。如果某个framework在一定的时间内没有为分配的资源返回对应的任务,则mesos会回收其资源量,并将这些资源分配给其他framework。

mesos分配资源 例如,上图的资源分配流程:

  • agent1向master报告它的资源,有4CPU和4GB内存可用。master调用分配策略模块,告诉framework1所有可用的资源
  • master发送一个资源offer给framework1,该offer描述了agent1的资源
  • framework1的调度器向master答复,它有两个任务需要运行在agent上,第一个任务使用2CPU,1GB内存,第二个任务使用1CPU,2GB内存
  • 最后,master将任务发送给agent,agent分配合适的资源给framework的executor,executor启动两个任务。由于还有1CPU和1GB内存未分配,分配模块可以将它们提供给framework2。

results matching ""

    No results matching ""