随着国家信息化建设程度越来越高,尤其是近年来“互联网+”概念的兴起,互联网思维已经深入各行各业,尤其是在经济、文化生活中发挥着越来越重要的作用。随着互联网的不断发展,伴随而来的是各种业务需求,从系统开发、部署、上线,到后期的优化、维护,传统的方法已无法更好地满足各方面需求。因此,如何开发并设计一个符合企业业务需要、提高运维人员效率的自动化运维平台,已经成为各高校研究的一个重要课题。在这样的背景下,作者站在运维人员的角度,通过理论研究、实际应用,希望能够解决如何更高效地实现持续集成以及后期的系统监控这一问题。
(一)研究背景及意义
随着互联网的不断发展,特别是近年来“互联网+”的兴起,大到谷歌、百度、阿里、腾讯等知名互联网公司,小到学校、政府、中小型企业等,都会涉及系统运维方面的需求,面对越来越复杂的业务需求,同时代码迭代间隔变短,投入的人力、财力及时间成本也不断增加,传统的运维技术已无法满足人们的需求。这主要体现在以下几个方面。
1.工作内容重复,效率低下
尽管运维技术在不断地发展,但是大多数运维人员每天都在做一些重复性的工作:小到日常巡检、软件安装、日志收集,大到系统变更、产品上线,全程都离不开运维人员。运维工程师常常被这些琐碎的事情围困,尽管付出时间不少,但是工作效率普遍不高。
2.缺乏高效的IT运维机制
传统的运维管理由于缺少自动化的运维管理机制,也没有明确的职责划分,所以出现问题的时候,往往是运维人员被迫地去处理故障,这样给快速定位问题及解决问题都带来不少挑战;同时,缺乏规范的流程管理,没有对故障进行有效的跟踪,缺少规范化的故障处理机制。
3.没有有效的IT运维技术工具
互联网的规模变得越来越复杂,服务器的数据动辄成百上千台,如果单靠人工的方式,很难从繁杂的警告信息中去判断问题查找根源。同时,大多数企业的系统迭代上线过程都是手工操作,需要运维人员逐一远程到设备执行命令,这样的工作量太大,也都是一些重复的工作。在上线后,可能又要去分析代码的执行情况,工作繁重。对于系统监控部分,虽说有的大公司已经开发了一些监控工具,但是对于其他单位来说,这样的成本过高。
在传统的软件生命周期中,开发与运维分别从属不同部门,彼此之间联系不多。随着敏捷开发概念的提出,DevOPs的概念被提了出来。DevOPs可以看作开发、运营、质量保证三者之间的交集,加强了开发人员与运维人员之间的联系,有效地将开发、测试、部署、监控、维护等联系了起来。DevOPs的目标就是实现这些过程的自动化和可重复性。
(二)自动化运维国内外研究状况
国内外互联网公司是最先引入自动化运维技术的。互联网公司的内容往往分布在多个或大或小的IDC中,越来越多的“眼球”在盯着ICP所提供的内容,互联网公司进行内容存储的基础设施也呈现出了爆发式的增长。因此,随着业务的增长,运维部门显得愈发重要。运维系统需要足够地完善、高效、流程化。谷歌、腾讯、百度和阿里等规模很大的公司内一般都有统一的运维团队,有一套或多套自动化运维系统可供参照,运维部门与开发部门是相互平行的视角,并且也更加关注IT基础设施在架构层面的优化,以及超大规模集群下的自动化管理和切换。国内外一线互联网公司自动化运维技术的应用是目前自动化运维技术发展成果的应用。
1.基于CMDB的自动化运维
CMDB(Connguration Management Database)配置管理数据库。CMDB侧重于数据的管理,它是将IT基础架构的相关组件存储为配置项,维护每个配置项的详细数据,配置项之间的关系数据以及事件、变更历史等管理数据。通过将这些数据存储到数据库中,可以为企业了解和管理数据类型之间的因果关系提供信息支持。同时,CMDB与所有服务支持和服务交付流程都紧密相连,支持这些流程的运转、发挥配置信息的价值,同时依赖于相关流程保证数据的准确性。可实现IT服务支持、IT运维以及IT资产管理内部及三者之间的流程整合与自动化。在实际的项目中,CMDB常常被认为是构建其他ITIL流程的基础而优先考虑,ITIL项目的成败与是否成功建立CMDB有非常大的关系。
2.百度的自动化运维
百度主要面临的运维挑战包括突发的流量变化、复杂环境的关联影响、快速迭代的开发模式以及运维效率、质量、成本之间的平衡等。百度的运维团队认为,当服务器规模达到上万台时,运维视角需要转为以服务为粒度。万台并不等于“百台×100”;机器的运行状态,也不再代表业务的工作状态;运维部门为研发提供前置服务,服务与服务之间关系随着集群的扩大逐渐复杂 起来。
百度的自动化运维技术框架划分为部署、监控、业务系统、关联关系四大部分,整个框架更多突出了业务与IT基础设施的融合,注重“关联关系”的联动。所谓关联关系,主要是指任务与任务之间的时序依赖关系、任务与任务之间的数据依赖关系、任务与资源之间的引用依赖关系,分别对应到任务调度、数据传输、资源定位的服务流程中,形成了多条服务链。
3.谷歌SRE
谷歌的SRE不只是做Operation方面的工作,更多的是保障整个Google服务的稳定性。运维工作会涉及许多琐事,所谓琐事,就是与运维相关的重复性、手工性工作,与服务器线性增长的事项也是琐事,这些琐事大都可以被自动化所代替。谷歌倾向于自动化的偏好源于谷歌特有的业务挑战:谷歌的产品和服务是全球部署的,不能也不可能手动运维系统。对于真正的大型服务来说,一致性、快速性和可靠性决定了它们在运维过程中选择了自动化。SRE用的大型管理工具应该是专门的团队开发的。关于构建自动化平台,SRE给出了经验之谈,只有负责运维该组件的团队才是组件自动化的责任人,与组件的使用方没有关系,也不需要第三方来介入它的自动化。系统团队负责系统的自动化,网络团队负责网络的自动化,为了让这些自动化服务得到编排,他们对外发布服务接口,让其他团队调用。
4.主要运维工具分析
目前,在生产环境中,主要流行以下几种运维工具,它们各有优缺点,其具体情况如下。
(1)Zabbix
Zabbix是一个基于Web界面的分布式监控系统,入门容易,上手简单,是国内外应用最广泛的监控工具。Zabbix管理和配置比较简单,自动监控、发现功能可以减少运维人员的工作量。同时,Zabbix提供丰富的API接口,方便数据采集,也可以生成直观的报表。当出现告警时,可以自动远程执行命令,做出补救工作。Zabbix可以实现一些基础的监控,但是深层次的监控需要进行一些定制开发,难度较大。同时缺少数据汇总功能,有些常用数据的获取,数据报表也需要二次开发。
(2)Nagios
Nagios是一款开源的企业监控系统,其最大的特点是强大的管理中心,对服务和主机进行监控。在复杂的企业环境中,Nagios可以实现对主机的内存、磁盘、CPU、网络等参数的监控;在服务方面,可以实现对SMTP、HTTP、NNTP等的监控。Nagios支持丰富的插件,通过这些插件,实现监控和告警功能。但是,Nagios配置相对复杂,初学者不易掌握。且只能查看告警事件,而无法获取历史数据,这就对分析故障原因造成困难。
(3)Canslia
Canslia是加州大学伯克利分校发起的一个开源监控项目,其主要用于在大型服务器集群环境中监控众多网络节点。Canglia适合监控系统性能,通过曲线报表工具监控节点状态,部署方便,可以自定义监控项,可通过表格和图像进行监控结果展示,但是Canslia没有报警机制,以致于当出现告警事件时,不能及时报警。
(4)HPOpenview
HP Openview是由一系列功能模块组成,通过这些模块,实现网络管理、系统管理、数据库管理、业务可用性管理、流程管理和报表管理的功能的系统管理工具。Openview的主要优点是提供了全套的系统管理工具,并且能够生成可视化的运维报告,运维人员根据需求对系统进行全方位的管理。但是,作为一款商业产品,尽管其功能丰富,但对于一些小企业而言,性价比不高。
(三)自动化运维平台相关理论与实现技术
1.持续集成及Jenkins
(1)持续集成(Continuous Integration,CI)
随着软件项目开发复杂度的提高,需求变更导致的产品迭代间期不断变短,如何快速适应这种变化并保证软件产品质量成为IT工作者面临的问题。在这种背景下,团队成员更好地协同开发并保证工作质量尤为重要。持续集成正是针对这一类问题的一种软件开发实践。持续集成,倡导团队成员经常集成他们的代码,每次集成都是通过自动化的过程实现,包括自动化发布、编译、测试、上线、分析等。由于不断集成迭代,有利于问题的提早发现、解决,最终保证软件项目沿着预期的计划稳定进行,降低项目实施过程中的风险。
持续集成是一个自动化周期性的过程,从远程检出代码、编译构建、远程部署、执行测试、报表分析等都是自动化完成的,无须人工干预。在进行持续集成前,需要设置专门的集成服务器用于构建,同时,预先设置持续集成环境,如代码托管工具、远程连接方式、插件安装以及在构建前后的操作等。(www.xing528.com)
持续集成的核心价值在于:持续集成通过减少在软件开发中的重复劳动,通过自动化完成代码的编译、环境部署、单元测试、产品上线等,从而节省时间成本、人力成本,提高软件开发效率;持续集成可以使项目组成员在开发过程中的任一节点进行集成,这有利于提前发现集成过程中的问题,发现模块缺陷,降低系统集成风险,提高项目团队成员信心;持续集成促进项目变得更加透明。通过持续集成,开发人员会有阶段性的成果输出,提高客户对产品质量的信心。
(2)持续集成组成部分
目前,业界普遍认同的一个完整的持续集成系统需要遵循以下几个原则。一是开发人员向版本控制软件提供的代码在集成过程中,不会出现错误。常用的版本控制软件有IBM Ratlonai Clear Case、cvs、Subversion、Git等。二是软件开发人员在开发前,需要先从代码库检出代码,完成部分模块或者在特定时间,及时向代码库提交代码设置特定的集成服务器进行集成构建。在集成过程中,可以根据情况,手动进行构建,如修复系统;也可以进行例行构建,如每个工作日结束后进行构建。三是每次构建需要确保构建成功。当构建失败时,需要根据报表信息,分析构建失败错误原因,修复BUG,处理完这些错误后,手动启动构建任务,直至构建成功。
(3)Jenkins简介
在软件开发过程中,系统集成工具很多,比较著名的工具有Cruise Control、Bamboo、Continuum、Jenklns等。Cruise Control是CI Server的“老者”,诞生已有多年。在许多方面,Cruise Control服务器已经成为持续集成实践的同义词。Cruise Control的平台核心非常小,但是扩展性非常强。比如对版本管理工具的控制都是在本地的工具客户端完成的,它进行统一接口的封装。而现在,CruiseControl已发展成为一个家族式系统,包括CruiseControl.java、CruiseControl.net、CruiseControlruby等适应不同的语言环境的软件。
Continuum是最新的CI服务器之一,也是值得关注的一个新进入者。Continuum的安装和配置很简单,只要下载和释放ZIP文件,运行命令性程序,就可以运行了。基于Web的界面使配置项目很容易,而且还不需要安装Web服务器,因为Continuum内置了ettyWeb服务器。并且,Continuum可以作为Windows服务运行,还在应用程序的某些部分嵌入了上下文敏感的文档,从而提供了很多帮助。
Ailassian Bamboo是一款持续集成构建服务器软件(非开源软件),Bamboo是澳大利亚公司Ailassian开发的产品。Bamboo的特点是:简单的用户界面,容易安装,如果顺利的话,5分钟内就可以让它运行起来;自动检测设置,如果Server上使用了Maven、Ant或者java设置,Bamboo会自动检测它们;连续监测build的colourcoded日志;容易显示所有项目。
2. SNMP协议简介及在监控方面的应用
简单网络管理协议(SNMP),是一种为在IP网络中管理网络节点(如交换机、路由器、服务器等)而定义的应用层协议,是在1988年8月,Internet工程任务组织(Internet Engineering Task Force,IETF)的研究小组为了解决Internet上的路由器管理问题而提出的,之后在RFCll57中成为正式标准,SNMP采用了Client/Server模型的特殊形式:代理/管理站模型,对网络的管理与维护是通过管理工作站与SNMP代理间的交互工作完成的。每个SNMP从代理到负责回答SNMP管理工作站(主代理)关于MIB定义信息的各种查询。利用SNMP协议,一个管理工作站可以远程管理所有支持这种协议的网络设备,监控设备状态(如磁盘利用率、CPU利用率、接口吞吐量),修改网络配置,接收网络报警事件。
SNMP协议主要由三部分组成,分别是管理信息结构SMI(Structuxe of Management Information)、管理信息库MIB和管理协议SNMP。
SMI指定了在SNMP的MIB中用于定义管理目标的规则,为MIB定义对象及使用对象提供模板,是一系列公共的结构以及相关的表示符号。
MIB是网络管理协议访问的管理对象数据库,它包括了SNMP可以通过网络设备的SNMP管理代理进行设置的变量。MIB是基于对象标识树的,对象标识是一个整数序列,中间以“.”分隔。这些整数构成可以描述为一个树型结构,各个数据项构成了树的叶子节点。每个MIB对象都由一个唯一的对象标识符(OID)来标识和命名,这个标识符取决于MIB对象在树中的位置。
SNMP的工作方式有两种:轮询和陷阱。轮询是指管理员通过设置一个代理软件,通过该软件发送SNMP查询请求,收集设备信息,然后将结果保存到MIB中,运维人员通过查询MIB得到设备相关信息。轮询是网络监控的一种主动形式。但是,轮询存在一些缺陷,如缺少实时数据,轮询间隔设置的长短会对运维效率产生影响。而陷阱则是当有异常事件发生时,通过中断的方式向SNMP发送消息,这种工作方式可以解决故障的实时性问题,但是设置陷阱需要消耗系统资源。在实际环境中,SNMP管理者结合上述两种工作方式的优缺点,采用面向自陷的轮询方法。
在网络监控中,一个网络设备以守护进程的方式运行SNMP代理。该守护进程能相应来自网络的各种请求。SNMP代理提供大量的OID,而一个OID是一个唯一的键值对。一个SNMP管理可以代理查询键值对中的特定信息,从而获取设备的各种 信息。
3.Web相关技术
(1)python及Django简介
Python是由Guldo van Rossum于20世纪80年代末~20世纪90年代初在荷兰国家数学和计算机科学研究所设计出来的。其第一个版本发行于1991年。Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。一开始,Python的设计哲学便是“优雅”“明确”“简单”。它具有以下几个优点。
简单、易学。Python具有相对较少的关键字、结构简单和一个明确定义的语法,学习起来更加简单。
免费、开源。Python是FLOSS(自由/开放源码软件)之一。用户可以自由地发布这个软件的拷贝、阅读它的源代码、对它进行改动、把它的一部分用于新的软件中。
可移植。Python可以被移植到其他平台上。
可扩展。如果用户需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,可以使用C或C++完成那部分程序,然后从Python程序中调用。
丰富的库。Python是开源的,有许多组织、个人贡献了第三方库。利用这些第三方库,开发人员可以完成许多工作,包括正则表达式、Web框架(如Django)、科学计算(如MatPlotlib、Numpy、Scipy)、HTML/XML解析器、GUI(Tkinter、PyQt、WxPython等)、用于连接数据库的MySQLdb及图像处理方面的PIL等。
Python可以写后端、前端、GUI、数值计算、科学运算、网络编程、大数据开发、组件集成、图像处理,因此Python成为运维工程师的一把利器。
Django是一个用Python写Web的开发框架,最初是源自一个在线新闻Web站点,是为了实现Web页面的快速开发而研发的。其于2005年开源,近年来,由于敏捷开发的提出,得到了迅猛发展,应用也越来越广泛。
Django是一个基于MVC结构的框架,与传统的MVC框架有所不同。在Django框架中,控制器接受用户输入的部分由框架自行处理。Django更加关注的是模型(Model)、模板(Template)和视图(Views),称为MTV模式。Django视图不处理用户输入,而仅仅决定要展现哪些数据给用户,而Django模板仅仅决定如何展现Django视图指定的数据。当Django服务器启动时,它会自动加载项目录下的setting.py。该文件包含了项目的配置信息,其中最重要的是,它告诉Django哪个模块用作本站的URLCONF。当在浏览器中输入URL的时候,Django会自动装载URLesconf,默认会从url.py中匹配视图函数。如果找到视图函数,则会把HttpRequest对象作为第一个参数。最后view函数返回一个HttpResponse对象。
(2)Nginx简介
随着信息网络的不断发展,用户对于Web服务器性能的要求不断提高,特别是云计算和大数据理论的相继提出,如何更好、更快地处理和响应客户端请求成为Web服务器面临的主要问题之一。与此同时,随着用户规模的扩大,服务器可能面临着在短时间内产生大量的请求的情况,如何在大量并发请求的情况下不间断地提供稳定优质的服务,使客户端用户的体验满意,也是Web服务器亟须解决的一个问题。当前,市场上比较流行的Web服务器主要有Apache,微软的IIS、Sun、Nginx、Tomcat等。Nginx作为近年来应用范围越来越广的服务器,有以下几个特点。
Nginx作为一种性能强大的Web及反向代理服务器,支持内核poll模型,能经受高负载的考验。有报告表明,它能支持高达 50000个并发连接。
Nginx具有较高的稳定性。高可靠性来自其核心框架代码的优秀设计和模块设计的简单性。Nginx采取的是分阶段资源分配技术,占有内存小,内存占用率低,而并发能力强,许多国内外网站都使用其作为服务器,如百度、新浪、腾讯等。而其他HTTP服务器,当并发连接数过大时,物理内存耗尽导致频繁交换,从而速度变慢,甚至失去响应。
Nginx支持热部署。Nginx启动简单,并且几乎可以保证7×24小时不间断运行,连续工作几个月都不需要重新启动。即使在对版本进行升级时,也可以不停止服务,完成修改配置文件、更换日志文件等任务。
Nginx采用master-worker工作模型,充分利用了SMP的优势,同时减少了工作进程在磁盘I/O的阻塞延迟。
虽然Nginx发行很晚,但是近几年发展迅速,国内一些知名互联网公司都选它作为Web服务器。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。