DCOS应用案例(二):在线会议系统——互联网持续集成典型实践

DCOS应用案例第二弹!通过本案例说明,如何改造原有的互联网应用上云,以及借助容器的快速部署特性,架构持续集成。

顺便做个预告,本周末北京 Mesos User Group No.4 聚会,小数与你不见不散~

这是一个在线会议工具,用户可以通过微信登陆并接入系统,邀请好友开始远程会议。该应用架构复杂度中等,为典型的互联网应用。

该应用的技术架构如下图所示。

如图所示,其架构图中包括 Redis,Mysql,OSS,file-server 等存储节点,也包括 web-server,api-server,push server 等服务节点,还有前端的 nginx 反向代理等。

服务节点间存在相互依赖。

所有节点都部署在阿里云,部分存储服务使用了阿里云服务。

系统痛点:

部署耗时:由于我们的服务较多,版本发布的时候,需要每个服务都单独编译、打包、部署,一般要1到2个小时才能完成部署任务;迁移麻烦:如果需要部署新的机器,每个新机器还需要配置环境,部署麻烦;扩展性差:现在的服务依赖都是单向直接依赖,没有做负载均衡,不能扩展。

第一步:系统 Docker 化 & 上云

经过对其业务流进行梳理,我们大致得到以下架构。

架构图中包括以下内容:

  1. 每个服务的端口使用;
  2. 服务间依赖关系;
  3. 服务是否有状态;
  4. 分别标注对外服务、对内服务及存储;

对应用大致做了以下改造:

  1. 服务节点 Docker 化;
  2. 服务节点无状态化,具备横向扩展能力;
  3. 抽离配置文件,解耦组件间依赖;
  4. 多实例化的服务之间进行服务发现。

上云步骤:

  1. 为每一个子项目编写 Dockerfile
  2. 安装私有 Docker Registry
  3. 部署应用
  4. 监控与测试

第二步:持续集成

持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。而Jenkins是一个自动构建服务,使用Java实现,有成百上千插件,使用他可以很方便实现持续集成。

  1. 搭建 Jenkins
    对于 Jenkins 的安装和部署,这里不再累述。

    值得一提的是,数人云集群使用 Apache Mesos 进行资源的统一调度,通过数人云可以快速搭建 Jenkins。把Jenkins运行到 Mesos 上,或者说利用 Mesos 向 Jenkins 提供 slave 资源,一方面通过分布式特性加快构建过程,另一方面也提高了资源利用率。通过配置 Jenkins-on-Mesos 插件,Jenkins Master 可以在作业构建时根据实际需要动态的向 Mesos 申请 slave 节点,并在构建完成的一段时间后将节点归还给 Mesos。 具体教程请见 快速搭建 Jenkins 持续集成环境加速产品迭代

  2. 代码库创建工程
    需要内部的代码库或者公共代码库为每一个组件创建一个项目。本案使用了 Github 作为代码库,Jenkins 已原生支持 Github。这里要注意的是,需要保证 Jenkins 有权限 pull/push 上面我们所创建的 git repo。另外,工程要包含 Dockerfile,以便在构建过程中生成 Docker 镜像。

  3. 镜像构建任务
    在 Jenkins 里创建构建任务, 任务从 git repo 拉取代码,指定 release 的 tag,使用 repo 里的Dockerfile,构建 Docker 镜像,并推送镜像到 Registry 里。

根据不同的系统架构,可以将构建任务拆成不同的粒度。最简单的,一个任务构建所有的子项目。如果项目比较复杂的情况下,每次构建时间会比较长,造成不必要的资源浪费,那么可以将构建任务拆分到颗粒度更小的子项目。

构建触发设置,可以为每次 push 后进行构建。但一般情况下,每个子项目也是有多人协作的,而且并不是每一次代码提交都需要进行构建,因此构建触发策略设为 Tag push 触发,及每当增加 tag 时,触发构建任务。 4. 镜像发布任务
在 Jenkins 里新建任务, 在这个任务里,通过调用数人云 Rest API 获取认证token, 发布应用到 Mesos 集群。

可以设置发布任务的自动触发,比如当一个构建任务完成后触发,或者每天晚上2点触发,要根据不同的环境需要来进行选择。

发布脚本中,通过调用数人云 Rest API 获取认证 token, 以应用的形式发布到数人云平台。这里用curl命令发布应用。也可以用 python、shell 等脚本调用 API 发布应用,我们也推荐这样做,可以更好的检查调用API的返回。

后续

以上,实现了整套系统上云以及构建持续集成的过程。下一步便是构建从开发、集成到生产的完整运维体系。一般情况下,针对一个互联网产品,开发环境由开发进行构建和发布,可以设置为 push 触发或者前面提到的 tag push 触发;集成环境由 QA 进行构建和发布,QA 定期发布并进行集成测试,发现问题后再回退到之前版本;生产环境往往通过手动方式触发发布,在发布前需要做好客户通知、应急处理等各项准备。

值得注意的是,将多份环境进行统一发布管理,还需要配备配置服务器用于管理不同环境的配置信息,而这是另一个话题了。

重要提示:数人云新版DCOS已发布了持续集成服务,上述通过 Jenkins 部署和配置持续集成过程仍显得比较繁重,那么通过数人云DCOS管理界面,通过简单的操作就可以实现自动构建的全过程,具体请参见数人云用户手册