
现在的源调企业很多都在用Jenkins做持续集成 ,各个业务端都依靠Jenkins,度系vivo Devops也是统设使用Jenkins来进行持续构建 ,部署Jenkins服务时如何保障服务的计实践高可用变得尤为重要 。
下面是自研s资目前Jenkins存在的一些问题 。
Jenkins本身是源调单体的 ,即只能有一个Jenkins Master。度系虽然你也可以在多台机器上部署多个Jenkins Master,统设但这些Master之间没有联系,源码下载计实践都是自研s资各自把任务交给手下的slaver去执行,没有任何交集 。源调
也许某个master下的度系slaver很忙,而另一个master下的统设slaver却很闲,资源得不到充分利用 。计实践 当其中一个slave宕机之后 ,该slave上的运行的job任务没有版本重新进行分配,需要用户重新执行 。并且slave节点离线之后没有通知管理员。 当系统业务量比较大的高防服务器时候业务请求集中在Jenkins Master上 ,会对Jenkins造成压力,甚至的造成Jenkins服务不可用。 当有job任务在jenkins Master上队列排队的时候,Jenkins Master宕机后 ,队列任务不可持久化。Jenkins Workspace没有自动清理功能,会导致磁盘空间不足,任务执行不了的情况。基于以上情况,vivo Devops对Jenkins的部署架构进行优化搭建 ,并且配套了一套Jenkins资源调度系统用于管理Jenkins资源。云计算
目前业界也包含一些Jenkins 高可用的设计方式,但是并不能完全的满足解决上述问题 ,比如 :
2.1 方案一 Gearman + Jenkins这是OpenStack团队使用的方案 。这个方案使用了gearman , gearman是个任务分发框架 。
需要在每个Master上安装好gearman的插件,并配置好能连接到gearman server,同时在每个Master必须建立相同的香港云服务器job 。
之后运行任务的流程如下:
gearman worker运行在各个Jenkins Master中等待gearman server分发任务;gearman client向gearman server发出运行job的请求;gearman server通知各个gearman worker有任务拉,第一个闲着的worker会接受任务 ,如果所有的worker都忙 ,则放入gearman的任务队列,得worker空闲时再分配;gearman worker闲下来后会从任务队列里取job来执行,执行完之后 ,将结果发回给gearman server;gearman server将结果返回给 gearman client 。优点:
这样各个salver资源可以得到充分利用,某个master挂掉另外的master可以继续服务。模板下载
弊端:
每个master的slave必须配置一致,否则会造成job调度错误,同时会造成一些资源的浪费 。当一个master出现问题 ,该master的任务不会进行自动重新分配。
目前Jenkins的配置文件都是直接在硬盘上以文件形式存储的 ,你在JENKINS_HOME的个文件夹下能看到各种.xml文件。有些公司在Jenkins上进行二次开发 ,服务器租用将Jenkins的数据存储方式改为数据库存储,这样前端可以起多个Jenkins服务,后端连相同的数据库即可。数据库也有比较成熟的高可用方案。
优点:
可以达到Jenkins的高可用也就是某个master挂掉另外的master可以继续服务。
弊端:
需要对Jenkins进行二次开发,使用数据库会降低读取资源效率下降 。
2.3 方案三 最简单的Jenkins一主一备模式平时让Jenkins A机器提供服务,并使用SCM Sync configuration plugin保存数据,JenkinsA机器修改配置后触发Jenkins B更新配置,一旦Jenkins A出现问题挂掉后 ,切换到备机Jenkins B上。
优点:
可以达到Jenkins的高可用,当master宕机后会进行切换到备机上 。
弊端:
会有一批Jenkins备机存在资源浪费 ,切换master时间过长,会导致有段时间Jenkins服务不可用 。
由于目前业界的一些实现还不能完全的满足我们目前的需求,所以我们进行了vivo jenkins scheduler系统的设计与实现。该系统需要达到如下的目的 :
提升整个构建服务可靠性时长。保证jenkins集群的高可用,解决目前master-slave的单点问题,保证整个构建服务的可靠性时长。降低灾难时服务恢复时长 。①提供精准流控方式 ,在jenkins构建出现请求量过高的时候可以进行流控和持久化操作 ,减少对目前系统的冲击 。
②当系统压力减少后,放开流控可以快速的对堆积的请求进行分配执行 。有效分配任务至各个子节点,保证资源的有效利用。能保证灾难时的及时切换任务至可用节点上,同时能快速的通知管理员进行处理 。能进行数据的可视化分析