今天就跟大家聊聊有关什么是Mesos Framework开发,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
创新互联自2013年创立以来,公司自成立以来始终致力于为企业提供官网建设、移动互联网业务开发(微信小程序开发、手机网站建设、重庆APP开发公司等),并且包含互联网基础服务(域名、主机服务、企业邮箱、网络营销等)应用服务;以先进完善的建站体系及不断开拓创新的精神理念,帮助企业客户实现互联网业务,严格把控项目进度与质量监控加上过硬的技术实力获得客户的一致赞誉。
Mesos 官网是这样介绍自己的:
Program against your datacenter like it’s a single pool of resources
Apache Mesos abstracts CPU, memory, storage, and other compute resources away from machines (physical or virtual), enabling fault-tolerant and elastic distributed systems to easily be built and run effectively.
翻译过来就是:
Mesos 使你的数据中心看起来像一个资源池。
Apache Mesos 将CPU、内存、存储和其他计算资源从机器(物理机或虚拟机)中抽象出来,从而使容错和弹性的分布式系统易于构建和有效运行。
通俗来讲就是:
Mesos 作为主机上各种资源的管理者,使你可以在Mesos之上更方便地维护和使用这些资源,进行程序的分布式运行和管理。
更详细的介绍可以去官网查看文档。
Mesos Framework 由两部分组成:
Scheduler 框架器
Executor 执行器
既然Mesos是主机资源的管理者,那么Framework中的Scheduler就是主机资源的调度者,它负责决定使用哪些资源下发哪些任务,而Executor就是下发任务工作的执行者,它真正地负责执行任务的运行工作。
Mesos 会将主机上的资源抽象成一片片的资源邀约(resources offer),不断的发给以特定角色(role)注册在Mesos上的Scheduler,然后Scheduler拿到这些offer后,根据是否是任务所需的将这些offer进行拒绝(decline)或接受(accept),如果可以接受这个offer,就要告诉Mesos Master我要用多少资源,以及下发什么样的任务,之后Mesos Master将这些信息经过一系列的流转,最终通知给每台主机上运行的Executor,实现任务在主机上的运行工作。
在了解了Mesos Framework的大致原理后,就可以尝试开发Framework了,本文主要介绍Scheduler的开发。
Mesos官网文档中有对于Framework开发的指导 Framework Development Guide,我提取了其中比较关键的地方:
对于Scheduler开发,有两种方式:
通过实现SchedulerDriver
C++ 接口,建议Mesos 0.28.0 or 更老的版本
通过HTTP API ,建议Mesos 1.0 or 更新的版本
对于第一种方式,Scheduler开发人员通过注册事件回调方法,来实现自定义的调度逻辑。因为SchedulerDriver 接口是用C++编写的,这要求Scheduler开发人员使用C++语言,其他语言使用C++编译而来的本地库。
Name | Language |
---|---|
Scheduler Library | C++ |
Scheduler Adapter (depends on native libmesos) | Java |
第二种方式,是新版本Mesos推荐的用法,各种语言现成的的库也有很多,详情查看: HTTP API client libraries
随后会通过示例程序,来介绍这两种方式的环境搭建。
为了保证多Scheduler的可扩展性,Mesos给了以下建议:
使用 Suppress:调用Suppress后,Mesos就不再给Scheduler发送资源Offer。在没有任务要下发或没有其他对offer的操作时,Scheduler必须保持suppressed
状态,以确保Mesos更有效地为其他Scheduler提供offer。
不要长时间持有Offers: 如果某些Offers不是Scheduler所需的,请立马拒绝(decline
)掉它。否则,这些资源Offers就无法提供给其他的Scheduler,并且本身收到的资源offers也会减少。
使用一个较大超时时间拒绝Decline
资源Offers: 当拒绝一个offer时,设置一个较大的 Filters.refuse_seconds
超时 (例如 1 hour)。这可以确保Mesos有时间去尝试向其他的Scheduler提供资源offers(作者认为,这个时间需要具体情况具体分析,比如需要任务重试时,这个超时就不能太大) 。但是,如果Scheduler最终无法进入SUPPRESSED
状态,并且在拒绝后有新的任务要下发时,则在一段时间内,如果没有接收到足够的资源Offers,则应考虑使用REVIVE
进行恢复。
不要频繁地调用REVIVE
: 调用REVIVE
会清除掉所有的filters,并且,如果频繁地调用REVIVE
,就相当于使用很短的超时时间去拒绝offer。
设置 FrameworkInfo.offer_filters
: 在Scheduler的配置中设置这个参数,可以指定全局的filters。目前支持的参数为OfferFilters.min_allocatable_resources
,在集群层面也有这个配置(使用--min_allocatable_resources
进行指定),可以前者对每个角色进行配置,去覆盖掉后者的配置。使用一个想要收到的最小Offer的大小来设置FrameworkInfo.offer_filters
,能够确保Scheduler能够更好的收到足够合适大小的Offer。
在操作上,当有不同的Scheduler共存时,可以做以下事情来确保Scheduler能够获取它们所需的资源:
不在Schedulers之间共享同一个Role
使用quota给角色分配资源
设置最小分配资源量
考虑启用随机排序
我在github上放了两个示例程序,分别使用上面提到的两种方式。
SchedulerDriver
接口github地址:mesos-framework-demo
语言:Java
由于使用了C++本地库,所以在运行jar包时,要在/usr/local/lib
放入mesoslib.so
文件,也可以通过设置环境变量来改变这个路径:
MESOS_NATIVE_JAVA_LIBRARY=/usr/local/lib/mesoslib.so
查看clone下来的代码,完成的工作有:
1.设置FrameworkInfo
,主要包括:
user 指定executor或task的运行用户
name 指定Framework的名字
id 指定Framework的唯一标识
failoverTimeout 指定等待故障排除的时间,超过这个时间未重新注册,框架及其下运行的任务将会被移除
role 角色名
2.实现org.apache.mesos.Scheduler
接口的方法,主要包括:
registered() 注册成功时回调
resourceOffers() 资源Offers到达时回调
statusUpdate() 任务状态有更新时回调
reregistered() 重新注册时回调
3.配置Zk地址,用于发现Mesos Master
完成以上配置及实现,即可实现了一个简单的Framework Scheduler,当注册成功后,在Mesos的/frameworks
页面,可以看到你启动的Framework。
示例项目中,mesos.proto
是数据的结构定义,里面有各种数据的类型与结构关系。
github地址:mesos-framework-go-example
语言:golang
为了方便,使用了现成的第三方工具 mesos-go
要做的工作相比第一种方式,第三步不再是配置Zk地址,而是配置Mesos的scheduler
接口地址:
Url: "http://localhost:5050/api/v1/scheduler",
选择合适的数据存储中间件,例如:Zookeeper、Etcd、MySQL
使用多实例,保证高可用
如果在resourceOffers()
回调方法中存在Http请求或数据访问,在使用Filters.refuse_seconds
控制resourceOffers()
回调频率的同时,建议增加缓存机制。
看完上述内容,你们对什么是Mesos Framework开发有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。