Mesos概念
MesosArchitecture
上图显示了Mesos的主要组成部分。Mesos由一个masterdaemon来管理slavedaemon在每个集群节点上的运行,mesosapplications(也称为frameworks)在这些slaves上运行tasks。
Mesosmaster&slave首先,Mesos是一个分布式的架构,它分Mesosmaster和Mesosslave,slave和master分别有不同的职责。从Mesos的源代码可以看出Mesos实现得比较优雅——它是一个C++代码。代码中有大量的关键词叫process,它不是传统意义上的进程,而是一种抽象的libprocess,libprocess是它最核心的库。如果大家以前使用过Erlang的语言就知道libprocess实际是对Erlang的IO和通讯模型的一个抽象。
libprocess,在Erlang里面也叫进程,实际上是一个虚拟进程,在运行Erlang的VM上。它最优的特点是消息在不同的process之间传递,它抽象了process,消息传递其实是一个事件的库。向process里发一个消息,这个消息不是直接打到process,而是中间有一个buffer的过程。
这样做的优点是特别适合分布式的系统,以前最常用的做法是监听网络端口,有包来了,有一个模块专门负责解这个包,解开一个协议后把这个协议发到后面一个处理进程,这个处理的进程可能是IO操作,可能去做其它事情,然后里面有很多IO上的Block,最后构造出一个response,通过一个socket传给客户端。这是最常用的一个写网络程序的办法,但是这里有一个大的IO上Block的地方——后面处理的逻辑依赖于解包的逻辑。如果处理逻辑很快,但解包逻辑很慢,后面会拖慢,都在等解包。
后来人们想到一种IO处理的方式,让任何一个东西都是分离的,比如从某一个端口收到一个消息,有一个单独的进程,一个线程或者其它的东西去处理这个唯一的请求。这个线程很重,后来大家又发明了一些其它的东西,比如golang里面去搞一个channel,Erlang里面去搞一个process。libprocess实际上做了IO方面的事情,Mesos大量使用这个模型。
ZookeeperMesos底层实际上依赖于Zookeeper,为了保证分布式存储最终一致性。在Mesos运行过程中产生了一些数据,最终都会落在Zookeeper。因为Mesos是多个master,为了达到HA的需求,只要一个master活的,那么整个服务就能得到保证。
protobufMesos内部在通信里面选择了protobuf协议。好处是比较流行,各个语言的库都比较多,结构化的语义也比较强,所以Mesos内部选择了protobuf。
Master使用ResourceOffers实现跨应用细粒度资源共享,如cpu、内存、磁盘、网络等。master根据指定的策略来决定分配多少资源给framework,如公平共享策略,或优先级策略。为了支持更多样性的策略,master采用模块化结构,这样就可以方便的通过插件形式来添加新的分配模块。
在Mesos上运行的framework由两部分组成:
一个是scheduler,通过注册到 master来获取集群资源。
另一个是在slave节点上运行的executor进程,它可以执行framework的task。Master决定为每个 framework提供多少资源,framework的scheduler来选择其中提供的资源。当framework同意了提供的资源,它通过master将task发送到提供资源的slaves上运行。
资源供给的一个例子下图描述了一个Framework如何通过调度来运行一个Task
事件流程:
Slave1向Master报告,有4个CPU和4GB内存可用
Master发送一个ResourceOffer给Framework1来描述Slave1有多少可用资源
FrameWork1中的FWScheduler会答复Master,我有两个Task需要运行在Slave1,一个Task需要<2个CPU,1GB内存="">,另外一个Task需要<1个CPU,2GB内存="">
最后,Master发送这些Tasks给Slave1。然后,Slave1还有1个CPU和1GB内存没有使用,所以分配模块可以把这些资源提供给Framework2
当Tasks完成和有新的空闲资源时,ResourceOffer会不断重复这一个过程。、
当Mesos提供的瘦接口允许其来扩展和允许frameworks相对独立的参与进来,一个问题将会出现:一个framwork的限制如何被满足在不被Mesos对这些限制所知晓的情况下?
例如,一个framework如何得到数据本地化在不被Mesos所知晓哪个节点存储着被该framwork所需要的数据?Mesos通过简单的寄予frameworks能够拒绝offers的能力来回答了这个问题。一个framework将拒绝不满足其限制要求的offers并接受满足其限制要求的offers.
特殊情况下,我们找到一个简单的策略delayscheduling,在该frameworks等待一个限制时间来获取存储输入数据的节点,并生成接近的优化过得数据点。
本篇主要分享了mesos的组成部分和事件流程。下周会详细介绍Mesos的概念解析和工作原理。敬请期待。