转转新测试环境,在每台测试服务器都部署了一套HttpAgent(以下简称agent),由eig测试环境管理平台下发命令,agent完成命令接收、解析和响应,实现并发和调度控制,异步调用环境维护脚本。之所以自己开发一整套agent,是因为转转测试环境由多业务组成,复杂度非常高,我们可以根据自己的业务高度定制,做一套适合我们转转的,好用的系统。
概述
agent可以理解为一个轻量级的web服务,技术选型是python2.7+tornado,并开放统一的监听端口。主要工作流程为:接收平台下发的执行请求,agent按照命令进行解析和拆分子任务,并执行相应的脚本,在当前服务器上实现同步与部署的功能,并返回给平台执行结果与日志。除此之外,agent与服务器紧密结合,还承担了服务器性能信息采集、服务状态监控、jacoco数据采集等多种定制化功能。
优点
与现有的ssh直连方式执行命令相比,httpAgent优点在于:
ssh本身需要建立ssh-key授权和kerberos互信,连接成本较高,稳定性也有局限。
agent以http模式接收下发命令,并发支持会更好,而且可控,省时省力;
自更新,自重启,进程守护,安全可靠;
和服务器紧密结合,支持服务器信息采集任务和多种定时任务,定制化程度更高。
agent整体架构
agent整体架构分为install、agent、config、modules、script、util、console、test几部分。本文主要介绍agent作为http web服务器部分的工作原理(上),并抛砖引玉,为下次介绍底层各个模块工作原理做准备。
初始安装(预装)和自更新、自重启
1.预装
agent维护了一份install.sh,完成一键安装。包括主程序、所有依赖软件以及第
三方包,初始化定时、注册、进程守护。在install.sh脚本中,启动了supervisor进程,监管注册进程。
2.自更新、自重启
agent整体工程是一个GIT工程,在crontab里添加了定时任务,每一分钟会定时更新。当有代码提交时,会触发更新,并杀掉agent的所有执行进程,由守护进程自动重启。
agent工作流程
agent接收eig请求和回传日志部分工作流程如下图所示:
有两点另做简要说明:
1. 支持同步和异步调用
对于比较重的任务,如同步、部署、初始化、回收等,耗时较长,agent解析命令之后返回执行状态,另起线程去执行脚本,执行完成之后,返回执行结果及日志。
对于轻量级任务,如授权、删除、jacoco覆盖率统计数据,耗时较短,agent解析完命令之后,立刻执行相应脚本,并返回执行结果。
2. 支持多并发
多并发主要场景如下:当用户首次申请环境及每日凌晨自动同步稳定环境时,下发的命令中会有很多服务需要执行同步操作,此时,agent开劈线程池,用固定数量的线程按照队列顺序执行同步脚本,目的是为了解决瞬时执行大量任务,受服务器性能限制,会有部分任务不被执行就已经死掉的现象。
agent进程守护
agent进程和上传日志进程由supervisor监控,进程被杀掉之后自动重启,保证进程的稳定性。配置如下:
[program:tornado-9889]
command=python2.7 /opt/deploy/agent/HttpAgent.py --port=9889 ;进程启动命令
autorestart=true ;进程死亡自动重启
redirect_stderr=true
stdout_logfile_maxbytes = 50MB ;日志文件最大值
stdoiut_logfile_backups = 20 ;日志维护份数
stderr_logfile = /opt/log/supervisord/tornado-stderr.log ;supervisor统一监管日志
stdout_logfile = /opt/log/supervisord/http_agent.log ;agent日志
loglevel=info
agent监控
由于agent承担着非常重要的中间媒介作用,我们对agent自身的状态也是做了多层监控。
通过supervisor进行进程守护,防止进程挂掉的简单情况;
每一分钟通过crontab进行自动更新agent时,检查supervisor状态,失败则重
启,用于防止supervisor挂掉的情况;
AgentMonitor进程中配置了一组定时任务,包括agent中HttpAgent和CronUpload两个进程的状态检查,失败则发送邮件,用于防止supervisor无法启动进程的情况;
AgentMonitor进程中服务状态监控的定时任务包含了时间戳,存储于redis中,用于防止AgentMonitor进程挂掉的情况。
其中AgentMonitor进程中的定时任务采集的服务器数据存储于redis中的内容如下:
由上图可见,除了agent状态数据之外,还采集了服务器本身的性能数据,包括cpu数据、memory内存信息、磁盘IO读写信息、网络速率信息。
其中cpu数据从top命令中获取的信息,内存、磁盘IO及网络信息是从/proc/meminfo、/proc/diskstats、/proc/net/dev文件获取的信息。
后续
本文只解析了agent上层的工作模式,那么agent调用的底层模块,那些神秘的部署、同步、配置文件规则替换等等是如何工作的呢?请大家期待下次的分享。
领取专属 10元无门槛券
私享最新 技术干货