说到系统部署工具,大的互联网公司基本上是本身研发,一键自动部署到数百台到数千台服务器,好比twitter开源的Murder。小的公司可能使用一些开源工具,好比Jenkins、Puppet、Ansible结合一些脚本进行。python
开源的部署工具备Capistrano、瓦力等,在线部署的有http://dploy.io/。其中瓦力是国人开发的一个系统部署工具。git
贝聊以前也使用了瓦力来部署web服务和dubbo服务,在使用的过程当中遇到一些问题:github
为了解决使用瓦力遇到的问题,咱们决定本身研发一个部署工具。web
部署工具主要有如下内容:shell
下面分别就上面的内容作详细说明。数据库
规范和约定api
全部使用部署系统的项目,必须遵循一样的规范,好比部署的文件统一放在:服务器
/data/project/项目名称/模块名称
包括业务日志目录、端口范围、配置文件等等。网络
对于一些基础的JVM参数,部署系统自动检测并加上,好比gc相关的参数。架构
项目配置
项目配置包括项目名称、管理员、项目成员、SVN/Git地址、账号、服务启动的shell、自定义脚本、不一样环境的JVM配置、web容器配置等等。
对于web应用,运维在部署系统配置好端口、域名等参数,部署系统自动生成相应的容器配置(Tomcat/Resin等),减小运维的容器配置管理工做,也便于运维规范的执行。
服务器管理
服务器管理,在一些公司有CMDB系统来进行管理,功能很复杂。咱们的服务器管理和阿里云结合,经过它的API读取服务器列表,这样就简单了。
经过定义服务器组,能够把不一样做用的服务器分组,方便在部署的时候区分,而且也能够只部署一部分服务器:
文件传输
服务器之间的文件传输,常见的方式有scp和rsync。其中scp用于简单的文件传输,而rsync经常使用于增量文件同步。
而同时传输文件到多个服务器,能够用Puppet、Ansible或相似功能的软件。咱们选择了Ansible,经过ssh的方式拷贝文件。若是有多个文件,先打包成一个文件,发到目标服务器再进行解压,减小网络传输的次数。
提交部署效率
为了提升部署的效率,咱们作了不少小优化。
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的应用架构设计的难度。
整体技术架构
业务模型