贝聊架构师林毅:一个可供参考的系统部署工具

社区广播:运维派(Yunweipai.com)是国内最早成立的IT运维社区,欢迎大家投稿,让运维人不再孤寂的成长!

说到系统部署工具,大的互联网公司基本上是自己研发,一键自动部署到数百台到数千台服务器, 比如 twitter 开源的 Murder。小的公司可能使用一些开源工具,比如 Jenkins、Puppet、Ansible 结合一些脚本进行。

开源的部署工具有 Capistrano、瓦力等,在线部署的有 http://dploy.io/。其中瓦力是国人开发的一个系统部署工具。

贝聊之前也使用了瓦力来部署 web 服务和 dubbo 服务,在使用的过程中遇到一些问题:

  • 对运维规范支持不够
  • 不能在界面显示部署失败的原因
  • 读取 tags 列表非常慢,经常要多次刷新,导致部署过程很长
  • 如果项目下有 N 个模块,每次部署此项目下所有的模块,要重复编译此项目 N 次(Java 项目),很耗时间
  • 业务系统多的时候项目列表眼花缭乱
  • 不能只部署一部分服务器

为了解决使用瓦力遇到的问题,我们决定自己研发一个部署工具。部署工具主要有以下内容:

  • 规范和约定
  • 项目配置
  • 服务器管理
  • 文件传输
  • 提高部署效率
  • 部署过程的日志收集

下面分别就上面的内容做详细说明。

规范和约定

所有使用部署系统的项目,必须遵循同样的规范,比如部署的文件统一放在:

/data/project/ 项目名称 / 模块名称

包括业务日志目录、端口范围、配置文件等等。

对于一些基础的 JVM 参数,部署系统自动检测并加上,比如 gc 相关的参数。

项目配置

项目配置包括项目名称、管理员、项目成员、SVN/Git 地址、帐号、服务启动的 shell、自定义脚本、不同环境的 JVM 配置、web 容器配置等等。

对于 web 应用,运维在部署系统配置好端口、域名等参数,部署系统自动生成相应的容器配置(Tomcat/Resin 等),减少运维的容器配置管理工作,也便于运维规范的执行。

服务器管理

服务器管理,在一些公司有 CMDB 系统来进行管理,功能很复杂。我们的服务器管理和阿里云结合,通过它的 API 读取服务器列表,这样就简单了。

通过定义服务器组,可以把不同作用的服务器分组,方便在部署的时候区分,并且也可以只部署一部分服务器:

文件传输

服务器之间的文件传输,常见的方式有 scp 和 rsync。其中 scp 用于简单的文件传输,而 rsync 常用于增量文件同步。

而同时传输文件到多个服务器,可以用 Puppet、Ansible 或类似功能的软件。我们选择了 Ansible,通过 ssh 的方式拷贝文件。如果有多个文件,先打包成一个文件,发到目标服务器再进行解压,减少网络传输的次数。

提交部署效率

为了提高部署的效率,我们做了很多小优化。

减少 Ansible 执行命令次数

Ansible 执行命令的速度有点慢,尽量减少 Ansible 执行命令的次数,比如有多个文件需要发送到目标服务器,打包成一个文件后再进行传输。

保存编译结果

由于 Java 代码编译很耗 CPU,我们把编译的工作放到独立的服务器,把编译结果(jar/war 文件)存储到阿里云的 NAS,方便跨 ECS 读取文件。

为什么要把编译结果保存到 NAS?如果一个项目有 N 个模块,部署新版本的时候,创建类似这样的部署记录:

如图中所示,对于同一个分支,要编译 N 次。

假设每次编译需要 30 秒,如果不保存编译的结果,部署 N 个模块光是编译就要 N x 30 秒。保存编译结果有利于提高部署的效率。

日志收集

我们的系统收集 Java 项目的编译日志、执行 shell 的日志、业务日志等。收集这些日志的目的是为了在 web 界面上直观地看到部署过程中的问题。

收集日志通常使用 agent 的方式,比如常见的 filebeat。

我们使用 python 实现了 agent,每个服务器上启动一个,如下图:

由于只收集部署时的日志,agent 并不需要一直常驻内存,在部署的时候启动 agent 即可。当 agent 遇到退出指令,或超过 120s 没有日志的时候自动退出,下次需要再启动。

如果一次部署几百台、几千台服务器的时候,上传的日志的 TPS 是很高的,每个 agent 可以批量上传日志,降低 TPS,并且使用 NoSQL 数据库 (比如 Redis) 保存日志。

日志展示的效果图:

跨 IDC 的处理

贝聊的服务全部部署在阿里云,阿里云有经典网络和 VPC 专有网络,如果所有 IDC 使用 VPC 专有网络 + 高速通道,则比较简单,因为全部使用内网进行通讯。

如果已经使用了阿里云经典网络,建议转换到 VPC 网络,可以降低跨 IDC 的应用架构设计的难度。

总体技术架构

业务模型

目前我们的系统只支持 Java 项目的部署,以后会支持多种语言,并且我们考虑在今年年底把它开源。

作者介绍:林毅,贝聊架构师,10 年以上 Java 开发经验,先后供职于网易、YY、贝聊等公司,精通分布式 web 系统开发。(原文来自微信公众号:高效开发运维)

网友评论comments

发表评论

电子邮件地址不会被公开。 必填项已用*标注

暂无评论

Copyright © 2012-2017 YUNWEIPAI.COM - 运维派 - 粤ICP备14090526号-3
扫二维码
扫二维码
返回顶部