Apache Mesos(4)-Mesos的资源调度、分配及隔离机制

目录
  1. Mesos的资源调度机制
  2. Mesos的资源分配机制
    1. 角色
    2. 权重
    3. 资源保留
    4. 手动配置Mesos slave的资源和属性
      1. 手动配置Mesos slave的资源
      2. 手动配置Mesos slave的属性
  3. Mesos的资源隔离机制

作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处:https://andyyoung01.github.io/http://andyyoung01.16mb.com/

前面的文章,我们对Mesos架构已经有了基本的认识,并且也安装配置了一个有3个主节点的高可用集群。虽然我们目前还没有实际在集群上部署Frameworks来运行具体的任务,但后面的文章我们会详细探索Marathon、Chronos和Aurora等框架。现在我们先更深入得了解一下Mesos的资源调度、分配及隔离机制。

Mesos的资源调度机制

Mesos实现了一个两层的调度系统:Mesos slave将它的可用资源汇报给master,然后master通过可插拔的分配模块(Allocation module)向Framework的schedule发出资源邀约,这个schedule可以接受整个、部分或者拒绝这个资源邀约。如下图所示:
“Mesos资源调度过程”

  1. Mesos slave向master通告它的资源:8CPUs,16GB内存,64GB磁盘可用空间。星号(*)表示这些资源属于默认角色(default role)。我们后面会介绍到角色。
  2. Mesos的分配模块决定master应该向Framework A的schedule发出资源邀约。
  3. Framework A的schedule接受了资源邀约的一半的资源,剩下4CPUs,8GB内存及32GB的可用磁盘空间给其它程序。
  4. Mesos的分配模块决定master应该将所有剩下的未分配的资源通告给Framework B的schedule。

上面的过程一直重复不断地进行,因为每过一段时间,slaves会因为任务运行完毕而空出可用的资源来。
因为大部分的程序都需要一定的CPUs,内存,磁盘及网络,Mesos预定义了一些资源。

  • 默认资源 - 默认情况下,来自于Mesos slave的资源通告包括:
    • cups
    • mem
    • disk
    • ports

在mesos-slave启动时,系统的空余资源决定了上面这些值。

关于资源通告的以及Mesos系统架构的其它信息,可以参考官方文档http://mesos.apache.org/documentation/latest/architecture/

当slave持续不断地将自己的可用资源通告给master时,Mesos的另一个部分,可插拔分配模块,负责决定哪个Framework应该得到给定的资源邀约。

Mesos的资源分配机制

Mesos master的分配模块(Allocation module)决定了将资源分配给某个Framework。此模块可插拔的特性,允许系统工程师根据自己组织的需要,来实现他们自己的分配策略和算法。内置的分配模块使用的是Dominant Resource Fairnes(DRF)算法,它可以满足大部分Mesos用户的需要。

关于默认的分配模块和算法的更多信息,请参考http://mesos.apache.org/documentation/latest/allocation-module/

Mesos默认提供了几种方法来对资源分配进行调整,而不需要替换或者重写整个分配模块。这些方法包括角色权重资源保留

角色

在Mesos集群中,角色允许您将Frameworks和资源分成任意的组。
要使用角色,需要在启动master时加入–roles的配置选项。例如,下面的配置允许Frameworks以三个在数据中心里常见的角色注册:

--roles="dev,stage,prod"

之后,当Framework要在master上注册时,Framework可以指定为这些角色中的任意一种。这就允许许多团队或许多环境来共享一个大的Mesos集群,而不用创建多个小的集群。您也可以使用角色来确保特定类型的工作只运行在特定的一组机器上,例如负载均衡器或反向代理只运行在专用的边缘节点上。

权重

集群也可以给每个角色配置权重,来使不同的角色对于资源的分配有不同的优先权。当Mesos决定将资源先分配给哪个Framework时,它先将资源分配给最低于该权重的合理份额的Framework。例如,参考如下配置:

--weights="dev=10,stage=20,prod=30"

具有prod角色的Frameworks将得到比具有dev角色的Frameworks的三倍的资源。

资源保留

虽然权重可以确保某个角色得到比其它角色更多的资源,但Mesos也提供资源保留的方法。资源保留确保某个角色总是可以得到slave的一定的资源,但这样做可能会导致整个集群使用率的降低。
假如有一台机器有16CPUs,32GB内存,128GB磁盘,你想要确保这台机器有一半的资源总是可以提供给以prod角色注册的Frameworks,可以这样在这台Mesos slave机器上配置:

--resources="cpus(prod):8; mem(prod):16384; disk(prod):65536"

手动配置Mesos slave的资源和属性

前面几节我们知道资源可以分配给slave上的一定的角色,也可以配置资源保留。但如果您想创建定制的资源或想重写slave上资源的默认的值呢?和Mesos中的其它东西一样,资源通告的内容也是可配置的。当你想引入一些新的资源,或者想将CPUs和内存等资源硬编码到资源通告中,这个特性是非常有用的。

手动配置Mesos slave的资源

Mesos提供了三种数据类型来指定资源:标量,范围,和集合

  • 标量:cpus资源给定值8;mem资源给定值16384。
  • 范围:端口资源给定从10000到20000的值。
  • 集合:磁盘资源给定值ssd1,ssd2,和ssd3。

可以使用与资源保留类似的方式指定slave资源:

--resources="cpu(*):4; mem(*):8192; disk(*):32768; ports(*):[40000-50000];cpu(prod):8; mem(prod):16384; disk(prod):65536"
手动配置Mesos slave的属性

属性可以是任意的键/值对,用来给master或Frameworks提供关于机器的一些数据。可以这样设置:

--attributes="datacenter:pdx1; rack:1-1; os:rhel7; pythons:python2,python3"

关于怎样配置Mesos slave资源和属性的更多信息,请参考http://mesos.apache.org/documentation/latest/attributes-resources

Mesos的资源隔离机制

容器是榨取您的基础设施效率的一个非常理想的方法。容器比起虚拟机来更加轻量级,并且允许您在一个与其它负载隔离的环境中运行程序和代码。Mesos中的一个基础理念是使用容器隔离进程是使用计算资源最有效率的方式。
Mesos默认支持Linux cgroups和Docker,两种当下最流行的容器技术。通过在容器中运行executors和任务,Mesos slave允许多个Framework的executor一起运行,而不影响其它负载。这有点像在每个物理机上同时运行多个虚拟机,容器不用启动整个操作系统而比虚拟机轻量化许多。
Mesos的一个基础的组件称为containerizer。可以使用 –containerizers配置选项在Mesos slave上配置,目前包括两个containerizer:mesos和docker。mesos配置使用cgroups隔离和监视负载;docker配置调用Docker容器运行时,允许您在Mesos集群上启动已经编译好的镜像。
除了containerizer,Mesos也提供其它方法隔离资源。包括posix/cpu和posix/mem(默认),cgroups/cpu和cgroups/mem。怎样使用对资源的隔离和监视呢?是通过在slave上,给–isolation配置选项提供参数列表,来实现的。

本篇文章,我们更深入得了解了Mesos的资源调度、分配及隔离机制,下面我们使用Marathon来实际运行一个任务。