专栏名称: 分布式实验室
最专业的Docker文章,最权威的Docker新闻。关注容器生态圈的发展。
目录
相关文章推荐
沉默王二  ·  被阿里抛弃的那个项目,救活了! ·  4 天前  
51好读  ›  专栏  ›  分布式实验室

使用Mesos-starter从头编写Mesos框架

分布式实验室  · 公众号  · 后端  · 2017-02-04 07:45

正文

是时候向大家展示编写Mesos调度器是多么容易的事情了。假设刚刚拿到一个Docker镜像,但是需要给调度器添加一些更加复杂的特性,这样的特性还不存在。这正是Mesos-starter有用的地方。

Tansu介绍

Tansu是一种分布式键值和锁存储,设计用来维护需要高度可用的配置和其他数据。它使用Raft Consensus协议保证数据的同步。Tansu带有使用open API规范(也就是Swagger)的简单的REST接口,也能够将变化传递给客户端。默认来说,它使用mDNS组团,使得很容易组成一个集群。Tansu对可用性的考虑高于一致同意性,默认跟随者直接响应来读取请求(基于每个请求可能被重写)。请求自动在集群内路由到领导者处,以供锁定,写入和删除。

创建应用程序

创建新的Spring Boot应用程序最简单的方式是通过使用Spring Initializr。给你的新应用程序一个Maven的GroupID以及一个ArtifactID。使用Mesos-starter,你不需要任何其他的Spring依赖,但是我们非常鼓励添加上Actuator。

最终点击Generate Project按钮下载预配置的Maven项目。

解压缩下载的文件,并且导入到IDE里。

这时,你可能想要看看是不是实际构建出来了,运行$ ./mvnw verify。如果一切正常,那么mvnw命令应该能够下载到Maven以及项目所有依赖的特定版本,并且最终运行应用程序的集成测试。要注意,这是个几乎空白的应用程序。

我们已经得到了一个可以工作的应用程序,现在添加Mesos-starter的依赖。编写的同时它已经发布到Maven Central了,因此可以在pom.xml添加Bintray存储库。


bintray-containersolutions
bintray
http://dl.bintray.com/containersolutions/maven

这样就能够访问spring-boot-starter-mesos模块了。


com.containersolutions.mesos
spring-boot-starter-mesos
0.2.2

这些在classpath上,应用程序现在就已经是成熟的Mesos集群了。显然调度器还需要一些配置。首先,在src/main/resources/application.properties里添加如下行配置名称:

spring.application.name=Tansu

名称很重要,因为调度器需要注册到框架里。

接下来是分配资源。这个用例里,0.1 cpus和64 MB内存就足够了。再次通过application.properties文件配置,

mesos.resources.cpus=0.1
mesos.resources.mem=64

并且应用程序需要三个实例

mesos.resources.count=3

还需要的最后资源是http接口的端口。

mesos.resources.ports.tansu-http-port.host=ANY

这会向运行时暴露一个名为TANSU_HTTP_PORT的环境变量,实际端口是从Mesos offer里抓取的。

资源配置完成,现在需要配置任务本身。Tansu已经有了Docker镜像,可以通过如下方法添加

mesos.docker.image=shortishly/tansu:0.28.0

因为Tansu节点是通过mdns互相发现的,因此它们需要处在同一个网络上。Mesos里可以通过一些方法达到这一目的。要么使用Docker里的overlay网络,或者可以将Docker容器里的网络适配器改变为宿主适配器。

mesos.docker.network=HOST

最终需要关闭shelly

mesos.environment.SHELLY_ENABLED=false


启动调度器

应用程序已经配置好,可以运行它并且做一些测试了。现在最简单的方式是使用spring-boot:run带上一些参数,来设置Mesos和Zookeeper的端点。

$ MESOS_MASTER=172.16.33.10:5050 \
MESOS_ZOOKEEPER_SERVER=172.16.33.10:2181 \
./mvnw spring-boot:run

该示例里,Mesos和ZooKeeper运行在172.16.33.10上。记住如果是在Mac上运行,通过Homebrew安装的Mesos原生库函数,那么你应该需要在上一个命令末尾添加:

-Drun.jvmArguments="-Djava.library.path=/usr/local/lib"


打包

有好几种方式来打包应用程序,但是基本上取决于你想在容器还是不在容器里运行。本文会创建一个jar,可以简单部署到Marathon上。

因为篇幅所限,本文禁用了unittests。因此在SchedulerApplicationTest 类里添加@Ignore注释。

这样选出的Maven目标包实际上会重新打包整个应用程序,它也被称为,fat jar,位于/target目录下。我建议通过Maven存储库分发该jar包,像内部Nexus,GitHub Release或者Bintray。只要能够通过http(s)的url下载即可。

这样,你就可以使用Marathon或者其他喜欢的方式以常见的方法部署框架了。使用如下命令启动调度器:

$ java -jar scheduler-0.0.1-SNAPSHOT.jar --mesos.master=master:5050 --mesos.zookeeper.server=zookeeper:2181


另外一点

要是有一个好看的web接口,用户可以监控调度器并且操作应用程序,是不是很好呢。这是可以实现的,使用Codecentric的Spring-Boot-Admin。它的使用很简单。首先在Maven build里添加依赖:

de.codecentric
spring-boot-admin-server
1.3.3


de.codecentric
spring-boot-admin-server-ui
1.3.3


de.codecentric
spring-boot-admin-starter-client
1.3.3

在SchedulerApplication类里添加@EnableAdminServer注释,并且在application.properties文件里添加如下行:

spring.boot.admin.url=http://localhost:8080

再次启动应用程序,在浏览器里打开localhost:8080。在JMX和com.containersolutions.mesos.scheduler 里可以找到InstanceCount handle,可以启动或者关闭。


总结

在容器的解决方案中,我们坚信Mesos-starter有很大的潜力。事实上,可以在几个小时里开发出成熟的Mesos框架。并且使用Spring的思想来设计,就意味着有大量的社区模块可以利用。

这也正是我们希望能够有更多的项目参与进来的原因,从而可以收集到所有这些Mesos经验,并且互相分享。

本文为翻译文章,点击阅读原文链接即可查看原文。

推荐文章
沉默王二  ·  被阿里抛弃的那个项目,救活了!
4 天前
互联网分析沙龙  ·  数据揭秘:春运车票有多难抢?
7 年前
FM93交通之声  ·  看“六位一体”如何破题
7 年前
亿邦动力  ·  找电商工作,看他就行
7 年前
首席经济学家论坛  ·  鲁政委:ODI显现出口替代效应
7 年前