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


是时候向大家展示编写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存储库。
<repository>
<id>bintray-containersolutions</id>
<name>bintray</name>
<url>http://dl.bintray.com/containersolutions/maven</url>
</repository>

这样就能够访问spring-boot-starter-mesos模块了。
<dependency>
<groupId>com.containersolutions.mesos</groupId>
<artifactId>spring-boot-starter-mesos</artifactId>
<version>0.2.2</version>
</dependency> 

这些在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里添加依赖:
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-server</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-server-ui</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>1.3.3</version>
</dependency>

在SchedulerApplication类里添加@EnableAdminServer注释,并且在application.properties文件里添加如下行:
spring.boot.admin.url=http://localhost:8080

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

总结

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

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

原文链接:Writing a Mesos Framework from scratch with Mesos-starter(翻译:崔婧雯)
===========================
译者介绍
崔婧雯,现就职于IBM,高级软件工程师,负责IBM WebSphere业务流程管理软件的系统测试工作。曾就职于VMware从事桌面虚拟化产品的质量保证工作。对虚拟化,中间件技术,业务流程管理有浓厚的兴趣。

2 个评论

修正一下spring-boot-starter-mesos模块:
<dependency>
<groupId>com.containersolutions.mesos</groupId>
<artifactId>spring-boot-starter-mesos</artifactId>
<version>0.2.2</version>
</dependency>
改好了,多谢。

要回复文章请先登录注册