编程语言
首页 > 编程语言> > Fenzo:来自Netflix基于Java语言的Mesos调度器

Fenzo:来自Netflix基于Java语言的Mesos调度器

作者:互联网

 边天亮 分布式实验室 

图片

Netflix有着数百万的用户,要为这个数量级的用户提供可靠的服务并不是一件容易的事情。Netflix是由几十个分布式的服务支撑的,其中每个服务都是产品不可或缺的一部分,并且都在不断迭代着。我们需要从两个方面来优化这些服务,一个是用户体验,另外一个是服务的整体性能以及成本。为此,我们很高兴向大家介绍Fenzo这款开源软件,它是一个使用Java语言编写的Apache Mesos框架的调度器。Fenzo负责管理Netflix内部所有服务的调度和资源分配。

Fenzo现在已经开源,读者可以在GitHub(https://github.com/Netflix/Fenzo)中了解关于它的更多信息。

image.png

之所以要重新开发一个新框架,而不是利用社区中已有的框架,是因为我们考虑到两个方面,一是调度优化,另一个是希望能够根据资源使用情况来自动缩放集群,这两个方面下文中都将会详细解释。Fenzo更适合管理生命周期短暂(ephemerality)的应用,Netflix的用例包括实时操作的响应式数据流系统以及管理基于容器的应用部署。

在Netflix中,一天业务数据的变化非常大,如果按照业务峰值时所需要的资源来配置集群资源,那将会非常浪费,并且当出现某些热点事件时,我们的系统是无法应对这样的突发情况的。我们需要利用云的弹性以及基于动态负载来缩放集群。

虽然扩大集群似乎看起来相对比较容易,但是当集群中可用资源低于某一个阈值时,缩小集群就会带来新的挑战。当存在长期运行的任务,并且不能随便被终止时,例如拓扑结构的状态流处理耗时重构,那么调度器如果想让集群缩小,就必须让这样的主机上的所有任务几乎同时终止。

image.png

任务调度需要优化资源分配以最大化预期目标。不同的资源分配方式会对结果产生不同的影响, 包括可伸缩性、性能等方面,因此,高效的资源分配方式对于调度管理器来说是至关重要的。比如,选择分配方式时,逐个评估所有的可用资源以及任务,这在计算方面根本吃不消。

image.png

我们的设计专注于大规模部署具有多重约束和优化资源需求的多样化的任务与资源。如果评估最优化分配需要很长时间,就可能造成两个问题:

Fenzo采用了能够快速推动我们到正确方向的方式,而不是每次都找出最优的调度分配集。

从概念上讲,我们认为任务有一个紧迫因素决定多久需要一个任务分配,以及一个适合度因素决定是否适合一个给定的主机。

image.png如果任务是非常紧迫的,或者如果它非常适合于一个给定的资源,我们继续并分配资源给这个任务。 否则,我们继续让任务挂起,直到紧迫性增加或发现另一台主机具有较大的适合度。

image.png

Fenzo能够为你动态的选择速度与最优分配。它跨多个主机采用一个评价最优分配策略,但是只有当适合度被认为是“足够好”才能获得这种策略。然而用户为足够好的合适度定义了阈值以控制调度速度,用一个合适度评估插件来表示集群任务分配的最优化和最高级别的调度对象。这个合适度计算器由多个其他合适度计算器组成,代表一个多重面向对象。

image.png

Fenzo任务使用可选的软或硬约束影响分配来实现与其他任务的locality和/或资源的亲和力。软约束满足best efforts基准,结合合适度计算器来给可能分配的主机打分,而硬约束则必须满足和充当一个资源选择过滤器。

Fenzo把所有相关的集群状态信息提供给适合度计算器和约束插件,这样就可以优化基于作业、资源和时间的各方面的任务。

image.png

Fenzo目前为封装提供了内置的基于CPU、内存以及网络带宽资源或者是他们集合的适合度计算器。

一些内置的约束用于解决资源类型的常见位置公共用例,将一组任务分配给不同的主机,平衡跨越给定主机属性的任务,例如可用区、主机位置等。

你可以通过提供的新插件定制合适度计算器和约束。

image.png

Fenzo支持使用两种互补的策略集群自动缩放:

基于阈值的自动缩放,用户可以指定每个被用在集群当中的host组(如EC2自动缩放组,ASG)。例如,有可能是使用一个EC2实例类型的计算密集型工作负载创建一个ASG,也可以使用网络密集型工作负载创建另一个ASG。每一条规则有助于保持配置可用于快速启动新作业的一定数量的可用主机。

利用资源短缺分析试图来估计主机数目,以满足待处理负载。这补充了在需求激增当中基于集群扩大的规则。 Fenzo的自动缩放还补充了预测自动缩放系统,如Netflix Scryer。

image.png

在Netflix上,Fenzo目前被使用在2个Mesos框架中,用于各种使用案例,包括长时间运行的服务和批处理作业。我们已经看到调度器在多重约束和自定义的适合度计算器的情况下分配资源比较快。此外,Fenzo允许我们根据当前的需求,而不是按照需求的峰值集群规模来调整集群大小。

下表显示了我们观测到的在我们其中的一个集群中的每个调度运行平均时间和最大时间。每个调度运行可能会试图分配资源给多个任务,而运行时间非常依赖于需要分配的任务数、约束的数量和种类以及从中选择资源的主机数量。

image.png下图显示了在集群中几天内Mesos slave的数量变化,作为Fenzo的自动缩放行为的体现,表示3X在最大和最小数值上的不同。

image.png

image.png


上面简易的图示告诉我们Fenzo怎样被Apache Mesos框架使用。Fenzo任务调度提供了一个没有与Mesos自身进行交互的调度核心。Mesos的框架和接口在新的资源和任务状态更新上得到回传,同时它让Mesos driver 启动基于Fenzo的分配任务。

image.png

Fenzo已经成为云平台上的一个很好的帮手,它在Mesos上给我们一个高级别的控制任务调度,而且使我们在机器效率与作业运行快速化方面达到一个平衡。除此之外,Fenzo支持集群的自动缩放和封装。通过编写你自己的插件可以实现自定义调度器。

源代码在Netflix GitHub(https://github.com/Netflix/Fenzo)上可以找到,资源库当中包含了样本框架教大家如何使用Fenzo,而且在JUnit tests中给出了不同类型的例子包括写自定义的适应度计算器和约束条件。Fenzo wiki(https://github.com/Netflix/Fenzo/wiki)包含详细的文档来帮助大家开始学习Fenzo。


标签:Java,Mesos,缩放,Netflix,调度,集群,Fenzo
来源: https://blog.51cto.com/u_15127630/2829269