使用Mesos-starter从头编写Mesos框架
Posted 分布式实验室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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,可以启动或者关闭。
总结
在容器的解决方案中,我们坚信Mesos-starter有很大的潜力。事实上,可以在几个小时里开发出成熟的Mesos框架。并且使用Spring的思想来设计,就意味着有大量的社区模块可以利用。
这也正是我们希望能够有更多的项目参与进来的原因,从而可以收集到所有这些Mesos经验,并且互相分享。
本文为翻译文章,点击阅读原文链接即可查看原文。
以上是关于使用Mesos-starter从头编写Mesos框架的主要内容,如果未能解决你的问题,请参考以下文章