Fenzo: Apache Mesos框架的OSS调度器

jopen 9年前


将Netflix提供给数百万的用户不是一件容易的事情。Netflix产品在我们的分布式环境中提供了几十个服务,其中每一个服务都是用户体验 的重要组成部分,并且在不断发展新的功能。针对Netflix服务的优化在两方面是必不可少的,一个是客户体验的稳定性,另一个是服务的整体性能及成本。 为此,我们很高兴介绍Fenzo这款开源的提供给Apache Mesos框架的资源调度器。Fenzo在管理这些部署的调度和资源分配上非常的严密。

Fenzo现在在 Netflix OSS 网站中是可用的,关于Fenzo如何工作以及为什么我们要构建它等更多详细信息可以通过阅读网站获得。你还可以在 Github 上找到源代码及文档。

为什么使用Fenzo?

不利用社区中的任何一个框架而开发一个新框架的时候,有两个主要动机,一个是实现调度优化,另一个是能够根据使用自动缩放集群,这两方面将会在下 文更详细的讨论。Fenzo能够使框架更好的管理短暂性问题,这在云上是非常独特的。我们的用例包括一个提供实时操作见解的反应流处理系统和基于容器的应 用程序管理部署。

在Netflix中我们看到一天的业务作业中会产生大量变化的数据。像典型的数据中心环境,Netflix是依据最高峰值来供应集群的,这是非常浪费的,而且系统可能偶尔被用户响应异常操作事件的交互作业淹没。我们需要利用云的弹性以及基于动态负载来缩放集群。

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

调度策略

调度任务需要优化资源分配以最大化预期目标。可能有多个资源分配时,选择一个和另一个可能在可伸缩性、性能等方面会产生显著的不同,因此有效的分配选择对于调度管理器是至关重要的。例如,通过评估每一个可用资源的每一个挂起任务来挑选分配,计算上是望而却步的。

调度模型

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

• 资源闲置,等待新的任务

• 任务启动经历延迟增加

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

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

Fenzo: Apache Mesos框架的OSS调度器

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

权衡调度速度与优化

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

任务约束

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

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

封装和约束插件

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

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

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

集群自动缩放

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

• 基于阈值

• 基于资源短缺分析

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

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

在Netflix上的应用

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

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

Fenzo: Apache Mesos框架的OSS调度器

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

Fenzo: Apache Mesos框架的OSS调度器

Fenzo 在Mesos 框架上的使用

Fenzo: Apache Mesos框架的OSS调度器

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

总结

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

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