Apache Mesos 和数据中心操作系统的崛起
容器和应用程序编排是热门话题,因为组织和工程团队试图尽可能快地部署应用程序和基础设施的更改,同时提高数据中心的整体效率。当你读到容器的文章时,提到Apache Mesos(论文)通常都不会太遥远。你可能想知道Mesos是什么,以及如何将它用于管理大规模应用程序。
在这篇文章中,我将提供Mesos的介绍,总结一些Linux内核和Mesos之间的比较,以帮助你了解它是如何工作的。我将覆盖两个开源项目,这两个项目让工程团队能快速,轻松地部署在集群上的应用程序和计划任务。最后,我将讨论Mesosphere是如何结合所有这些来创建数据中心范围内的操作系统,并以Mesos为核心。
MESOS - 分布式内核
无论你正在你的笔记本电脑,智能手机还是平板电脑上阅读这篇文章,很可能你不知道你的Web浏览器在使用它的哪个处理器的核心。当然你可以找到,但是何必呢?操作系统的内核为你处理资源的抽象和调度。最终,操作系统很可能压根儿就不关心那么多;你只想要一个来运行你所爱的应用程序的方式,操作系统是提供那种体验的一种手段。
Mesos,和操作系统内核没有什么不同,提供了一种物理或虚拟机之上的抽象资源的方式。但是,它开始和操作系统内核(如Linux)不同的是抽象未绑定到一台单个的主机。相反,Mesos提供了一种为任何数量的机器抽象资源的方式,从10几到超过10,000——并将它们编程为一个单一的实体,从而导致简化的系统管理和提高资源利用率。许多公司,如Apple、Twitter、 Airbnb、彭博社以及其他的公司已经转向Mesos来增强他们的计算基础设施。
为了更好地可视化我刚才解释的,看看下面的图,比较在一台机器上运行的Linux内核,以及多台计算机参加的一个Mesos集群之间的资源抽象和调度。
两种情况共有的是,一些抽象层 —— 无论是Linux内核的单一机器硬件还是Mesos的多台机器 —— 负责提供计算资源(处理器核心,内存,存储和网络端口)给应用程序。 Linux在一台机器上在这件事情上做出了出色的工作,但是当你想要把应用程序部署到多台机器上时会发生什么?每台机器实际上变成了一个筒仓,只能够提供也在那个盒子运行的应用程序的资源。
资源调度
尽管是一个近期热门的流行语,“资源调度”并不是一个新的概念。两个流行的例子是Linux内核中的完全公平调度器和VMware vSphere的分布式资源调度器(DRS)。在这两种情况下,这些调度器在可用资源的基础上寻求优化任务的调度。 Mesos从这两个调度器借用想法,并建立成一个抽象层,或者它自己的“分布式内核”。但是,不像Linux内核,它主要提供了访问一台机器上的底层物理(或虚拟)计算资源,Mesos代理为一个Mesos主节点提供资源,然后被各种应用程序使用。
Mesos主节点实现了一个两层调度模型,这使得Mesos主节点能发送资源供给给一个应用程序(或框架,用Mesos的说法)。然后,应用程序可以接受或拒绝这个供给,基于供给的属性,或者如果供给有任何任务要执行。Mesos主节点能够调度多个不同的资源类型——CPU,内存,磁盘,端口——在各种不同的应用中,通过内置到它的资源分配模块的优势资源公平算法。因此,取代供应多台计算机来运行特定服务的是你现在可以定义应用程序需求的资源量,并允许它在群集上的任何地方被调度。
静态分区的终结
让我们暂时退一步,并考虑以下情形。你有两个服务在你的数据中心:一个Ruby on Rails应用程序,和一个Jenkins CI集群。当其中一个服务需要比一台机器可以提供的更多的资源时,你提供更多的机器。如果你的Rails应用程序需要处理更多的用户,你需要提供一个新的服务器并重新配置您的负载均衡器。如果构建正在排队等候你的Jenkins CI主节点,你提供额外的詹金斯代理并手动将其连接到主节点。
这种情况表明,人类被留下进行徒手资源分配和容量规划,坦率地说,我们很不擅长。很有可能这些应用程序不会100%的时间都是100%的利用率运行,从而导致了令人失望的行业平均6-12%的系统利用率 。当你开始测算运营成本的整体利用率时, 这是一个很大的资本浪费!无论你是运行你自己的数据中心还是使用一个基础设施即服务提供者例如AWS或者Azure,他们都是在这一天结束时有未使用周期的服务器。
通过抽象系统资源,你能停止猜测特定应用程序需要的机器数量,而是集中在他们实际上的资源消费量——也就是运行你的Rails应用程序或你的CI服务的CPU和内存。只要数据中心的机器的数量提供了足够的资源来运行所有的工作负载,你就是在良好的状态。而如果不在,则可以将工作负载加入队列,直到资源可用为止。但关键是,你现在添加额外的计算资源是到更大的Mesos集群中,而不是一些小的、静态分区的服务或手动创建和配置虚拟机中。
容器化
和在20世纪兴起的货运行业的联运运输集装箱运动有许多相似之处,我们看到在IT行业的同样的运动,不过是以惊人的速度。事实上,在计算中使用容器不是那么新; 控制组 (或简称cgroup)第一次加入到Linux内核早在2008年1月,作为分离单个进程的方式。在过去的几年中, Docker最终用户开始使用这种技术变的令人难以置信的简单。
由于容器提供了虚拟机的轻量级替代,并允许用户在孤立环境中运行他们的应用,Mesos的内核是建立在容器之上,同时支持Linux cgroup和Docker容器。这些容器技术允许任务在与同一台机器上的其他任务不同的隔离水平上运行。
但作为一个分布式的内核,Mesos仅提供使用这些容器技术启动进程,处理像资源分配,端口和卷映射的方式。要启动使用Mesos的任务,我们需要一个init系统来管理任务,并且有一个cron系统和它一起会更好。
Marathon and Chronos —— init和cron框架
我已经提到,Mesos提供了一种多个应用程序( 或框架,使用Mesos术语)在给定的集群上共享多种不同类型的资源的方式。一个框架在Mesos 主节点上注册并接受资源供给。有许多不同的框架目前可用,包括大数据处理(Spark,Kafka),分布式存储和数据库(HDFS,Cassandra),批调度(Chronos,Aurora),以及长时间运行的服务(Marathon,Aurora)。我会集中讨论两个流行框架:Marathon和Chronos。这些框架分别用于部署长时间运行的服务(如Web应用程序)和分布式cron作业。
Marathon(马拉松)
Marathon 是由Mesosphere开发的Mesos的开源init系统。它大致相当于supervisord——管理长时间运行任务,并自动重新启动应用程序实例,如果它发生故障。因此,如果一台机器在群集中在半夜出现故障,马拉松自动在一个可用的机器重新调度出现故障的应用程序。
马拉松支持在Mesos集群上启动cgroup和Docker容器,并能快速简单地扩展应用到N个实例 。
马拉松还包括一个可扩展的的REST API,它允许您创建、修改和删除应用,以及查询有关运行实例的信息。这允许你在发生变化的时候使用你的CI系统自动执行应用的滚动升级 ,或者动态创建HAProxy的配置并重新启动服务。当涉及到应用管理时,Marathon允许你把你的调度中最糟糕的部分,人,从你的基础架构中去除。
Chronos
Chronos 是一个最初由Airbnb开发的Mesos的开源cron系统 。它建立在传统的cron功能至上,如ISO 8601格式时间戳,失败作业自动重试,指定任务应运行的最长时间,允许一个作业依赖其他作业的能力。像Marathon一样,它也支持在cgroup和Docker容器中运行任务,并提供了可扩展的REST API,可用于创建,修改,删除,和手动触发工作。
Mesosphere DCOS —— 基于Mesos的操作系统
如果你花一分钟思考,组成一个操作系统的组件,如Red Hat Enterprise Linux或Ubuntu,你可能会找出以下组件:
- Init 系统: 一个守护进程(PID1), 例如 Systemd(RHEL 7)或Upstart(Ubuntu 14.04), 管理长时间运行服务,当它们失败时自动重启(或respawn)
- 包管理: 一个包格式(rpm, deb), 包管理器(yum, apt), 一个基础仓库集合(base, main)
- 命令行界面: 一个shell, 当用户登陆时启动(bash, zsh).
- 图形用户界面: 一个可选的图形用户界面来观测和管理系统.
有了开源的Mesos项目作为它的分布式内核,Marathon作为它的init 系统,Mesosphere已经着手建立一个现代的分布式的企业级的操作系统。这个系统,称作数据中心操作系统(DCOS), 为系统管理员提供了一种不用关心例如对服务静态分区或在半夜机器故障的大规模部署应用和服务的方式。DCOS目前提供两种版本: 企业版和社区版
包管理
在写这篇文章的时候,Mesosphere提供了DCOS的两种包仓库: Universe和Multiverse。这些仓库分别托管生产可用的和测试的包。Universe的文档很好的覆盖了规范,这里我就不讲了。但是它本质上可以归结为一个JSON对象定义的包,可以被DCOS的CLI处理并被Marathon的API理解
命令行界面
DCOS CLI可以安装在你的笔记本或工作站上,并可以和DCOS的多个服务交互。它提供了在DCOS集群管理包、服务、节点的功能。
SERVICES=( chronos jenkins spark hdfs cassandra kubernetes )
for service in ${ SERVICES[@]}; do
dcos package install --yes $service
done
这些服务中的一些——Cassandra,HDFS,Kubernetes——需要一些不平凡的努力来有效部署。Mesosphere的团队使用这些包仓库提供和维护了在你自己的数据中心部署这些服务的一键的全自动的容错的解决方案。
图形界面
尽管DCOS CLI允许你完全从命令行管理操作系统,web界面提供了集群的包括安装的服务,运行的任务以及属于这个集群的节点的信息
要部署你自己的应用和Docker容器,你可以使用CLI或者导航到Marathon的web界面(在Services tab选项卡中)。在那你可以创建一个新的应用,指定需要的资源,实例的数量,Docker容器镜像的信息,等等。虽然DCOS包含Marathon作为它的init系统,你也可以在Marathon之上部署多个Marathon实例,这样你可以为不同的团队提供他们自己的PaaS而不用担心他们的应用互相影响。
总结
Mesos提供了数据中心多台机器资源的抽象层,允许它们像一个实体一样来编程。使得多个应用能共享一个集群的机器而不用担心数据中心内的静态分区。Marathon允许你在集群上部署应用和长时间运行的服务,通过它的API获得的信息可以用来动态的创建负载均衡器的配置和在配置改变时重新加载配置。Mesosphere DCOS组合一系列开源的和商业的组件成为一个易于管理和部署的Mesos集群,允许你快速部署应用和容器。
所以,如果你想要提高你自己基础机构的资源利用和去除人类调度的瓶颈,或者你只是在寻找一些新的东西来玩,或许是时候来试一试Mesos和Mesosphere DCOS了。