1. 什么是Mesos
Mesos是Apache软件基金会维护的一个开源软件,它负责管理一批服务器集群,并将所有服务器集群的CPU、GPU、内存、存储、端口和其它相关计算资源进行了抽象统一,让用户进行动态配置和使用,提高整个系统的资源利用率,并以集群分布式的方式保证系统运行的高可用和弹性扩展。
2. Mesos架构和工作流程
官网中有个Mesos的架构图如下,
主要的模块有,
- Mesos Master:管理所有机器资源信息,一般会部署多台来保证master的高可用,以resource offers的方式定时告知scheduler可用资源。
- ZooKeeper:实现当前工作Mesos Master的选举,并实现数据一致性。
- Mesos Agent:集群中每个机器都会部署一台Mesos Agent,定时汇报当前机器可用资源给Master,并从Master获取分配的任务信息,调用Executor来运行。
- Scheduler:定时得到Master发送过来的resource offers,将任务列表中各个任务的资源需求进行一一匹配,一旦资源需求获得满足,则告诉Master使用匹配到的资源启动任务。
- Executor:被Agent调用,根据指定的任务和资源信息,执行任务。
其中Scheduler和Executor是开发者根据自己需要进行开发,业界里各种Mesos Framework也就是实现这两部分,例如图中的Hadoop Mesos/MPI Mesos,还有Mesosphere公司的marathon,HudSpot公司的Singularity,国内数人云的Swan等。
Mesos提供两层调度,一层是Agent调用Executor执行Master分配的任务,另外一层是任务的资源匹配和调度放到Scheduler,由Scheduler推送任务到Master。由于Scheduler和Executor的可动态调整,这样也使得任务调度策略和执行变得可动态配置。
整个Mesos系统的主要工作流程如下,
- Mesos Agent定期上报各个机器的资源(CPU、Memory、磁盘、端口号)
- Mesos Master收集所有Agent可用的资源,定期推送resource offer给Scheduler,offer中描述了可用的资源信息。
- Scheduler启动时,会找到Mesos Master并注册,定期获取Master推送给的resource offer,以此了解可用的资源。
- 用户向Scheduler申请任务需要的资源,执行相关任务,例如申请2CPU 4G Mem来运行程序Demo。
- Scheduler在获取到Master推送的offer后,当offer中的资源满足用户申请的任务需求,就向Master申请执行。
- Mesos master根据Scheduler申请,在相应的资源上调用Agent执行任务。
整个流程图见如下,
需要注意的是,Mesos的四大组件(Master/Slave/Scheduler/Executor)之间的通信,是通过libprocess实现actor model模型的进程间消息异步通信,每个进程是一个actor。
见上图,在Mesos的master节点中,每个Framework以及Slave都是一个远程的actor。而slave节点上,每个executor是一个actor,只不过内置的executor是在同一个进程中的,而其他自定义的executor是独立的进程,executor和slave之间通过进程间通信方式(网络端口)交互。
Actor模型通信带来的好处是省去了对消息队列的依赖,但同时由于消息都是异步的,需要actor处理消息的丢失以及超时逻辑,Mesos无法保证消息的可靠投递,提供的投递策略是 at-most-once(至多一次,不会重试)。
3. 如何开发一个Mesos Framework
Mesos提供支持多种语言的Framework开发,包括Java/Python/Scala等,下面以Java语言为例介绍Mesos Framework的开发,其它语言类似。
一个Mesos Framework主要实现两个模块,
- Scheduler
- Executor
其中Scheduler会是单独可运行的项目程序,比如一个Java程序或者一个Java Web后端服务;Executor则会是Jar包项目,打出Jar包后由Mesos Agent引用并启动。
在两个项目中各自引入依赖包,
<dependency>
<groupId>org.apache.mesos</groupId>
<artifactId>mesos</artifactId>
</dependency>
在包org.apache.mesos中提供如下主要抽象接口,
- Scheduler:这是Framework要实现的Scheduler接口,用于Mesos Master回调。
- Executor:这是Framework要实现的Executor接口,用于Agent回调。
- SchedulerDriver:这是Scheduler和Mesos进行通信的抽象接口。
- ExecutorDriver:这是Executor和Mesos进行通信的抽象接口。
在两个项目中需实现上述的Scheduler和Executor抽象接口,各个接口方法的实现需求请参见Apache Mesos项目源代码中对其的接口描述,可以通过如下git命令下载代码,
git clone git@github.com:apache/mesos.git
在Apache Mesos项目代码中有对Mesos Framework开发提供的样例实现,在其文件目录中,
- mesos\src\examples\java\TestFramework.java
- mesos\src\examples\java\TestExecutor.java
前一个实现了org.apache.mesos.Scheduler,是一个可单独运行的Java程序;后一个实现了org.apache.mesos.Executor,是一个Jar包。
注:在包org.apache.mesos中还有两个抽象接口:SchedulerDriver和ExecutorDriver,Apache Mesos提供两个Driver的默认具体实现MesosSchedulerDriver和MesosExecutorDriver,所以Mesos Framework可以直接使用,用于和Mesos Master通信,不用自己实现这两个Driver。
4. 参考资料
- DATIO的A Travel Through Mesos,来自DATIO公司,这是一个PPT文件,里面有对Mesos简单清晰的介绍。
- Mesos 架构以及源码浅析, 作者: 午夜咖啡,里面有对Mesos的架构和通信机制的介绍
- Apache Mesos开源代码项目,在这里能获取更多该项目信息。
- Mesosphere Marathon开源代码项目,在这里能获取更多该项目信息。
- HudSpot Singularity开源代码项目,在这里能获取更多该项目信息。
- 数人云Swan项目开源代码,在这里能获取更多该项目信息。
- Apache Mesos官方网站资料
- Mesos架构,里面是对Mesos的架构介绍。
- Mesos Framework 开发者指南:,里面有对如何开发Mesos Framework的介绍。