最近几年,由于负责的范围的变化。工作逐渐从某个IT领域或者部门,开始关注到整个IT体系的运转和管理。中间也遇到不少困难,同时也有机会去从更高的层面去学习和实践IT治理。文章主要是总结一下我对DevOps相关的理解和认识。

为什么会有DevOps,解决了什么问题:

  1. 现代企业其实都是通过IT系统进行管理和运营的,在变化迅速和竞争激烈的领域,IT系统的新需求数量越来越多,软件发布的频率越来越高,不少互联网公司24小时内会发布几十个到上百个release到生产环境。与此同时,业务对IT服务和系统的稳定性和质量的要求也在不断提高。如何高效稳定地开发并上线新的业务功能,同时提供高质量的IT服务,关系到企业竞争能力的强弱,关乎商业价值的实现。
  2. 开发团队和运维团队在传统的的企业IT部门中是两个独立的团队。他们的构成和人员背景差异非常大,软件开发团队通常擅长于设计和开发软件功能,算法,他们希望能够尽可能多和快得完成客户或产品部分的需求。而运维团队通常把完成的软件部署到生产环境,负责监控和解决软件系统运行时的问题,希望的是系统的稳定地运行,他们竭尽一切需要达到SLA的标准。

关于测试团队:Test这个环节通常会有专门的测试团队负责,在很早期的时候,测试团队和开发团队也是分开的。不过自从敏捷开发流行以后,测试团队的成员就已经被看做开发部门的一部分了,这也部分归功于微软的贡献,他们当时新发明了SDET(软件开发测试工程师)这个概念,以表明测试工程师也是开发人员。他们写测试用例,进行功能和压力测试,同时需要懂得一些开发技术并拥有自动化测试的能力。开发人员对自己的代码质量也要负责,需要写自己负责模块的单元测试代码,软件开发人员之间需要交叉进行代码review。

下面的DevOps图相信很多朋友都见过了,当然这个图也有不同的变化版本。通过这个图来看,开发和运维团队衔接的最关键环节在Release-Deploy这三个步骤。而这一部分是否能够做得好,直接关系到DevOps在整个IT部门实施的成败。这一部分现在的主要解决方案就是CI/CD-持续集成和持续发布。DevOps不只是一个方法论,其涉及到整个IT团队文化的调整,多种新观念新方法论的实践以及现代化运维工具的应用这三个方面。

DevOps两大流派

对于DevOps问题的解决上,其实分成了两大流派。让我们来探讨一下这两派的观点和适用范围。

传统IT公司的DevOps解决方案,代表 - AWS,IBM...

从传统的运维模式转变到更加灵活和高效的DevOps模式。IT部门还是保持传统的人员配置和工作技能,但是在合作,实践和工具的应用上有很多方向的实践转变。

IT部门文化的转变

开发和运维部门必须打破传统的界限,需要共同承担软件系统运行的稳定性和性能上的责任和义务。运维团队有权利去拒绝没有达到生产环境准入标准的Release。开发和运维之间,测试和运维之间充分的透明度和沟通机制。最好能够在在一起办公,或者至少部分运维团队成员和开发团队成员坐在一起。能够容忍错误的发生,当错误的发生时,不要立刻责罚,而要通过分析,找到根本原因,并通过持续的改进来做好系统的强壮性和避免人为错误造成严重的系统故障。

技术和方法论层面的变革
  • 微服务的应用: IT系统应该逐渐从monolithic的模式转向微服务的模式,这样不同功能/模块的开发和发布能够相对独立,不同的敏捷团队可以更加快速地迭代和测试,同时交给运维团队的发布包的粒度更小,出问题后对整个系统影响更小。同时采用新的运维工具可以无感知逐渐升级微服务,迅速恢复或者回滚故障的微服务。

  • CI&CD:持续集成和持续交付,这个概念其实提出的很早。但是直到最近几年才开始被主流的业界接受。传统的软件发布频率往往是以周或者月为单位进行的。在很多情况下这已经不能满足业务快速迭代的要求,同时也越来越不适应快速迭代的敏捷开发模式。而且这种大粒度的集成和发布(通常一段时间的许多变更会在一个发布中上生产环境)出现问题的可能性和影响都比较大。 而持续集成和持续交付的粒度小到开发人员每一次代码的提交。一旦完成代码提交就会触发构建并执行自动化测试脚本和单元测试,同时测试团队的成员也会收到通知进行测试确认。一旦通过就能够自动发布到stage环境进行最后的UAT确认,接着在运维团队确认后自动发布到生产环境。这种小颗粒的集成和发布其实降低了每一次发布的风险。同时给开发和运维团队提供了一个快速沟通和协作的流程。另一方面,CI/CD也保证了开发环境,测试环境和生成环境的代码高度得一致性,这给定位和解决问题带来了便利。

  • Infrastructure as Code: 如今的IT基础架构都运行在虚拟化的平台-共有或者私有云上,从网络,存储到计算能力都是可以同过软件来配置的。这给到基础设施团队和运维团队部署新的服务和计算资源的效率和能力极大得提升。

  • 持续监控和记录:通过监控和日志分析统计实时监控所有系统的运行状态,在出现问题前预警,甚至自动干预和解决,提高整个运维的稳定性和效率。让团队关注在最有可能出问题的环节和系统,提前准备和预防。

运维工具的应用

下图列出的是DevOps各个环节的常用工具。代码的版本管理是Git(Git应该算是一统天下了,其他的版本工具基本都已经很边缘化了)构建工具每种语言都不同,下图里列的是Java相关的构建工具Maven和Gradle。在整个DevOps工具库中最重要和关键的工具必然是CI&CD工具,这是CI/CD在DevOps的核心地位决定的。CI&CD最流行的工具的就是Jenkins了,功能强大而且是开源软件。通过持续集成和交付,真正串联起了开发,测试和运维团队,通过工具和流程让三个团队能够协同工作。其次我觉得是自动化部署工具也非常重要,让运维团队能够迅速发布和创建标准环境。这些工具有Chef,Puppet和Ansible。总体来讲,我觉得Ansible是比较推荐的工具,第一是能够很好的和Docker一起结合使用。另外一点是Ansible采用的是Push模式去部署应用环境,不需要在其他节点上安装任何Agent程序,灵活性很高。

顶级互联网公司SRE派,代表 - Google

两本指导手册,可以在这个网站免费看。在 https://landing.google.com/sre/ 有Google总结的很多关于SRE相关的信息和资源,可以作为参考。这也是是谷歌力推的运维团队的模式。不过这种模式也只有类似Google这样的“豪门”公司可以采用。我阅读了那个网站的介绍,并大概看了两本指导手册,发现SRE就是事实上谷歌的运维团队。但是谷歌本身有着极高的准入标准,哪怕是运维团队的成员也是以SDE的能力和标准来招聘的,其SRE团队成员中软件工程师和系统工程师各占一半。他们通常会以软件工程的思维去处理运维问题,做一些自动化的流程,编写工具提高运维效率和系统稳定性,甚至能够直接去review开发团队提交的代码。SRE团队和产品,开发团队基本处在平等的地位,甚至相比之下还有些许特权。他们不但可以直接拒绝不符合运维要求的版本,甚至可以在某些情况下退出运维的工作,交给原来的开发团队。

谷歌制定了一套标准,还整出了SLI,SLO和SLA三种系统运维指标,其中SLO是由SRE制定的。一旦开发出来的系统达不到SLO(service level objective),SRE团队会要求开发团队必须将主要精力放在增强稳定性上。为此他们还发明了一个名词叫Error Budget,就是说一个系统能够有一定的错误余量(原因是只要是人类做的东西总是有可能会出问题~~~),如果某时间段的Error Budget被用完了,那么这个系统的最优先级任务将不再是新功能开发和上线,而是保证其质量和稳定性,直到其Error Budget再次恢复为正。

我们其实可以看到,与其说SRE是运维人员,还不如把他们归类为专注于系统性能和稳定性的软件工程师团队。这种用软件工程师团队覆盖运维工作的做法,在成本上和实际的企业文化上可能并不是所有公司都能够采用的。不过如果有能力采用这种模式的公司,我觉得还是应该尝试一下。

最后引用Google自己的一句话作为结尾吧,

这句话其实说出了谷歌团队心目中的SRE和DevOps的关系,

class SRE implements interface DevOps

对本文格式不满意可以访问原文地址https://www.rockysky.tech

快速理解DevOps概念和意义-兼谈SRE的更多相关文章

  1. 炒了8年的概念,到底该如何理解DevOps这个词?

    什么是DevOps及误区 DevOps概念从2009年提出已有8个年头.可是在8年前的那个时候,为什么DevOps没有迅速走红呢?即便是在2006年Amazon发布了ECS,微软在2008年和2010 ...

  2. 到底该如何理解DevOps这个词

    炒了8年的概念,到底该如何理解DevOps这个词? 转载本文需注明出处:EAII企业架构创新研究院,违者必究.如需加入微信群参与微课堂.架构设计与讨论直播请直接回复公众号:“EAII企业架构创新研究院 ...

  3. 从代码的视角深入浅出理解DevOps

    对于DevOps的理解大家众说纷纭,就连维基百科(Wikipedia)都没有给出一个统一的定义.一般的解释都是从字面上来理解,就是把开发(Development)和运维(Operations)整合到一 ...

  4. 垃圾回收机制GC知识再总结兼谈如何用好GC(转)

    作者:Jeff Wong 出处:http://jeffwongishandsome.cnblogs.com/ 本文版权归作者和博客园共有,欢迎围观转载.转载时请您务必在文章明显位置给出原文链接,谢谢您 ...

  5. 字符编码那点事:快速理解ASCII、Unicode、GBK和UTF-8

    原作者:阮一峰(ruanyifeng.com),现重新整理发布,感谢原作者的无私分享. 1.引言 今天中午,我突然想搞清楚 Unicode 和 UTF-8 之间的关系,就开始查资料. 这个问题比我想象 ...

  6. [转帖]十分钟快速理解DPI和PPI,不再傻傻分不清!

    十分钟快速理解DPI和PPI,不再傻傻分不清! https://baijiahao.baidu.com/s?id=1605834796518990333&wfr=spider&for= ...

  7. zw版·Halcon与delphi(兼谈opencv)

    zw版·Halcon与delphi(兼谈opencv) QQ群 247994767(delphi与halcon) <Halcon与delphi>系列,早两年就想写,不过一方面,因为Halc ...

  8. 快速理解web语义化

    什么是Web语义化 Web语义化是指使用恰当语义的html标签.class类名等内容,让页面具有良好的结构与含义,从而让人和机器都能快速理解网页内容.语义化的web页面一方面可以让机器在更少的人类干预 ...

  9. 快速理解高性能HTTP服务端的负载均衡技术原理(转)

    1.前言 在一个典型的高并发.大用户量的Web互联网系统的架构设计中,对HTTP集群的负载均衡设计是作为高性能系统优化环节中必不可少的方案.HTTP负载均衡的本质上是将Web用户流量进行均衡减压,因此 ...

随机推荐

  1. 关于 5G,我们应该了解的

    2020年元旦,我看了高通之前发布的一篇关于5G的文章,标题为“Everything You Need to Know About 5G”,主要包括5G是什么.有什么优势以及未来的前景等内容.我斗胆翻 ...

  2. $Poj1723/AcWing123\ Soldiers$ 排序

    $Poj$ $AcWing$ $Description$ $Sol$ 分别处理$x$坐标和$y$坐标.$y$坐标显然很好处理,就是排个序然后取中位数就好了.$x$没有$y$那么直接叭.所以我首先写了个 ...

  3. .Net Core Web Api实践之中间件的使用(一)

    前言:从2019年年中入坑.net core已半年有余,总体上来说虽然感觉坑多,但是用起来还是比较香的.本来我是不怎么喜欢写这类实践分享或填坑记录的博客的,因为初步实践坑多,文章肯定也会有各种错误,跟 ...

  4. 【C++】几个简单课本例题

    // // main.cpp // 2_1 // // Created by T.P on 2018/2/28. // Copyright © 2018年 T.P. All rights reserv ...

  5. Linux学习之路--常用命令

    #ls  显示文件信息 #ll  显示文件(不包括隐藏文件)具体信息 等于 #ls -l #ll -a 显示所有文件(包括隐藏文件)具体信息 #ll -htr aa  显示最近修改的文件 h是易读的 ...

  6. shiro整合springmvc

    说明   代码及部分相关资料根据慕课网Mark老师的视频进行整理   其他资料: shiro官网 流程 配置 1) 配置web.xml整合shiro 把shiro整合到springMVC实质上是在we ...

  7. AcWing 213. 古代猪文 数学知识

    传送门 题目描述: 给定整数n,q,计算 $q^{\sum_{d|n} C_{n}^{d}}$ mod 999911659. 输入格式 输入包括一行,包含两个整数n,q,用一个空格隔开. 输出格式 输 ...

  8. 【一起学源码-微服务】Feign 源码三:Feign结合Ribbon实现负载均衡的原理分析

    前言 前情回顾 上一讲我们已经知道了Feign的工作原理其实是在项目启动的时候,通过JDK动态代理为每个FeignClinent生成一个动态代理. 动态代理的数据结构是:ReflectiveFeign ...

  9. 从零开始入门 K8s | GPU 管理和 Device Plugin 工作机制

    作者 | 车漾  阿里巴巴高级技术专家 本文整理自<CNCF x Alibaba 云原生技术公开课>第 20 讲. 关注"阿里巴巴云原生"公众号,回复关键词" ...

  10. how to render html tag

    使用autoescaping If autoescaping is turned on in the environment, all output will automatically be esc ...