当前位置: 首页 > news >正文

基于Apache Mesos 构建高可靠,高可用的Jenkins CI

Author: Mao, James

    Mesos 计算框架是一个开源的集群管理平台,他提供了高效的,高可靠的,跨应用/框架的资源隔离和共享,在其之上可以运行Hadoop,Spark,JBoss,Ruby On Rails等应用框架,支持多种资源的计划分配。其中主要的一个目的就是有效的利用和共享计算资源,避免资源的浪费。Mesos 起源于Twitter和AirBnB,Twitter和AirBnB的很多核心服务以及大数据基础架构就是建立在Mesos之上的。从Mesos开源开始就受到了业界广泛的关注,eBay 是最早将这个平台上搭建Jenkins CI的公司之一,同时我们也对完善这个系统做出了贡献,本文就eBay在Apache Mesos 上搭建Jenkins CI 做一个比较系统的介绍。

Jenkins CI的两种模式

    eBay的Jenkins CI 采用的是独占模式,每个人都可以申请一台VM,预装好Jenkins,他的优点是独立,隔离,你在上面执行任务不会影响到其他人,其他人的任务也不会影响到你, 但是缺点也是明显的,一台VM往往有4个CPU,16GB的内存, 这样对资源造成很大的浪费,大部分的时间你申请的VM都处于闲置状态。

    Payal 的CI 采用的是Master/Slave模式, 统一的入口界面,但是你提交的任务是提交到Slave 集群上,这样的好处是大家共享Slave集群资源,不必每人独占VM, VM的数量肯定大幅下降,但是缺点是Jenkins Master/Slave配置不灵活,Master需要知道所有的Slave节点的信息,而且不能做到资源自动化的增加和回收。

    利用Apache Mesos/Marathon就可以很好的解决以上两种模式的缺点。让资源最大力度地的优化,同时配置也灵活并且自动化。

什么是Mesos?

    Mesos是 Apache top level 的项目,是集群管理软件,用以有效利用计算资源,构建一个高可用、容错的、可伸缩的系统。他为分布式的应用和框架提供有效的资源隔离和共享。在此之上你可以运行Hadoop, Hypertable, Spark, Marathon, JBoss, Ruby on Rails, Memcache, Jenkins CI等应用框架。

    Mesos 充分利用了当前流行的cgroups(Linux), zones (Solaris)中提供的CPU/内存/IO/文件系统的隔离特性。Mesos想要做的是将如此多样的计算资源整合在一起,对使用者来说就像一台超级计算机。之前你的架构可能是将不同的应用部署在不同的集群上,比如,为了Jenkins CI, 你搭建了一个集群,为了Jira系统,你搭建在另外一个集群上,为Hadoop,你又建了一个集群。Mesos的目的就是将所有这些集群的资源整合起来,而你的这些应用通过Mesos部署在这个大的集群上,就像你在一台超级计算机上安装了不同的软件一样。

    Google也有类似Mesos这样的项目的 Borg” 和 “Omega”。这些就是Google集群管理的秘密武器。(warehouse-scale computing)

Mesos 架构

    Mesos 架构上基本上是由Mesos Master , Mesos Slave和Frameworks 组成, Master 由ZooKeeper来负责灾备, 同一时间只有一个Master (Leader) 来管理所有Slave, Frameworks 通过Mesos API调用在Slave上运行任务 (Framework Tasks)。 流行的Framework 包括Hadoop, MPI, 等。

    一个Framework由两个重要的部件组成

  • 一个Scheduler 用以从Master接受和注册资源;
  • 一个Executor 是启动在Slave上的一个进程用以执行任务。

详解工作流程:

  1. 当Slave有空闲资源时,向Master汇报他的资源情况,比如有几个CPU,多少内存空闲;
  2. 通过分配规则(Allocation Policy), Master确定多少资源可以供给每个Framework;
  3. Master 将资源信息(Offer)分发给Framework, Framework Scheduler 挑选其中的一个Offer;
  4. 当一个Framework接受Offer后,他会向Mesos提供一个希望在这个Offer上运行的任务的描述;
  5. 随后Master会将这个任务发给提供这个Offer的Slave
  6. 最后,Framework的Executor将启动来执行这个任务。

 

Mesos - Jenkins

     Jenkins Master/Slave 调度是一个可扩展的框架。

     Mesos Jenkins Plugin 通过对Jenkins Master/Slave 的扩展,利用Mesos API调度Mesos Slave资源来完成Jenkins Job的运行。

     从这里可以下载到Mesos Jenkins Plugin https://github.com/jenkinsci/mesos-plugin

     安装此Jenkins Plugin后,在系统管理中,能看到如下图所示的配置

   

 

    从阅读Mesos Jenkins Plugin 的源码我们可以看出,他也是Mesos Scheduler的实现

import org.apache.mesos.Scheduler;

import org.apache.mesos.SchedulerDriver;

public class JenkinsScheduler implements Scheduler {

public void registered(…) {}

public void disconnected(SchedulerDriver driver) {}

public synchronized void resourceOffers(…) {}

}

     Mesos Jenkins 的历史很短,用的人也不是很多,所以自然会有很多bug,在使用过程中,我们对Mesos Jenkins Plugin 做了很多修订, 你可以在这里找到eBay对这个项目的贡献。

 

Mesos High Availability

    上图的配置项Mesos Master用来配置你的Mesos Master 的地址, 不过你可能注意到是zk://xxx:2181,什么是zk协议? Zk是ZooKeeper的通讯协议。

    所以实际上Jenkins 是从ZooKeeper那里得到Mesos Master地址, 而且ZooKeeper 一般都是配置一个Leader,两个Standby,所以在上面的配置中,你会看到有3个ZooKeeper地址。 这样做的好处是为了防止Single Point Failure。

    Mesos Master 启动脚本

root:~# ./mesos-master

--cluster=docker --zk=zk://host1:port1,host2:port2,.../path

   Master 启动时候就将自己注册到了ZooKeeper, 这个时候ZooKeeper 就知道了有哪几台Mesos Master 在系统里。

 

    Mesos Slave启动脚本

root:~# ./mesos-slave

--cluster=docker --master=zk://host1:port1,host2:port2,.../path

 

    Slave 启动时候会问ZooKeeper 要Master地址, 一旦得到后,Slave就可以直接

调用Master

    同一个时间只会有一台ZooKeeper 作为Leader, 也只会有一台Mesos Master 作为Leader, 当Leader挂起后,会重新选举一台作为Leader。

什么是Marathon?

    从这个名字“马拉松”可以猜到,他就是用来管理long-running 任务/服务。比如运行一个web 应用 (tomcat, play等), 这样的一个应用运行的时间是很长的,如果这个应用坏掉了,Marathon可以帮你很快的在集群里找到另外一台服务器上启动起来,继续为用户提供服务。甚至是Marathon自己也可以用Marathon来管理。你将他想象成是集群版的init.d。旨在为用户提供基于事件(event subscriptions)的高可用性的服务和监控。

    Marathon可以运行像Tomcat,Rails,Django,Play这样的Web应用,Marathon提供了一套REST API 用来启动,关闭这些应用,也提供了一套扩展这些应用的能力(Scale-in, Scale-out)。

    下图比较直观的描述了Mesos Master/Slave和Framework之间的关系:

    关于Marathon这里有一个比较直观的例子,左图假设中间的机器上部署了一个Solr一个Play,如果这台机器挂了, 那么Marathon可以无缝的在集群中找到另外一台有空闲的服务器上重新启动一个Solr,在另外一台机器上启动一个新的Play。

ZooKeeper + Mesos + Marathon + Jenkins

    Jenkins Master 从本质上来说就是一个Web Application, jenkins.war 就是核心, 从前文我们已经了解到Marathon可以用来在Mesos上动态部署Web Application 而且可以保证应用的Availability. 所以我们自然就想到了用Marathon来部署Jenkins Master。而且这个Master里已经安装并配置好了Mesos Jenkins Plugin, 这样当用户拿到Jenkins Master 时候,他的Job就会利用Mesos 的资源调度,在Slave上执行。下图就是eBay Jenkins CI 在Mesos 上执行的基本示意图。

    启动Marathon

root:~# export MESOS_NATIVE_LIBRARY=/usr/local/lib/libmesos-0.17.0.so

root:~# /usr/local/marathon/bin/start --master zk://localhost:2181/mesos --zk_hosts localhost:2181 --http_port 8086

 

    在前端, 利用Nginx 的反向代理,给用户生成一个唯一的CI标识,比如http://ebayci.com/zhangsan, 这就是张三的Jenkins CI 入口, zhansan 并不关心Jenkins Master具体运行在那台Server 上。这一切都是Marathon来控制的。

Zhangsan

zhangsan -ci-40560

phx-40560.abc.com

Lisi

lisi-ci-40360

phx-40360.abc.com

    假设张三的服务器挂了phx-40560.abc.com, Marathon会监听到这个Event,并会将这个Event发出来,此时Marathon 会自动从Mesos Slave 集群里找一台空闲的VM来分配给张三, 并更新Nginx

Zhangsan

zhangsan -ci-40560

phx-40570.abc.com

Lisi

lisi-ci-40360

phx-40360.abc.com

    整个过程对于张三来说是透明的。

结语

    在eBay, DevEx team已经将Jenkins CI 部署在Mesos + Marathon上。

    Mesos和Docker的搭配可以为我们提供更好的隔离性。

    未来我们会架设更多的Framework共存在Mesos上,来达到计算资源最大限度的利用。比如Hadoop。

相关文章:

  • Kepler性能分析之M2E调优
  • Ebay开源 Pulsar:实时大数据分析平台
  • JS组件化验证检测
  • 基于云技术的集成测试代码覆盖率收集的一站式解决方案
  • 使用github pages + issues + api建立个人博客
  • MapReduce的详细过程
  • 基于Jmeter和Jenkins的自动化性能测试的一站式解决方案
  • jQuery动态载入JS文件研究
  • SolrCloud之分布式索引及与Zookeeper的集成
  • Kafka的分布式架构设计与High Availability机制
  • JS方法代理
  • Hadoop作业性能指标及参数调优实例 (一)Hadoop作业性能异常指标
  • Hadoop作业性能指标及参数调优实例 (二)Hadoop作业性能调优7个建议
  • Hadoop作业性能指标及参数调优实例 (三)Hadoop作业性能参数调优方法
  • 漫谈程序控制流
  • 【前端学习】-粗谈选择器
  • ➹使用webpack配置多页面应用(MPA)
  • Debian下无root权限使用Python访问Oracle
  • input实现文字超出省略号功能
  • Joomla 2.x, 3.x useful code cheatsheet
  • mysql_config not found
  • Rancher-k8s加速安装文档
  • Rancher如何对接Ceph-RBD块存储
  • Redux 中间件分析
  • scrapy学习之路4(itemloder的使用)
  • SQLServer插入数据
  • 不上全站https的网站你们就等着被恶心死吧
  • 计算机常识 - 收藏集 - 掘金
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 聊一聊前端的监控
  • 数据可视化之 Sankey 桑基图的实现
  • 我的面试准备过程--容器(更新中)
  • 我是如何设计 Upload 上传组件的
  • 鱼骨图 - 如何绘制?
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​​​​​​​​​​​​​​Γ函数
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​批处理文件中的errorlevel用法
  • ​香农与信息论三大定律
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • $.proxy和$.extend
  • (14)Hive调优——合并小文件
  • (二)斐波那契Fabonacci函数
  • (接口自动化)Python3操作MySQL数据库
  • (九十四)函数和二维数组
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (原)本想说脏话,奈何已放下
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)