写点什么

我眼中的 DevOps

  • 2011-04-24
  • 本文字数:3576 字

    阅读完需:约 12 分钟

过去一年以来,一批来自欧美的、不墨守陈规的系统管理员和开发人员一直在谈论一个新概念:DevOps。DevOps 就是开发(Development)和运维(Operations)这两个领域的合并。(如果没错的话,DevOps 还包括产品管理、QA、*winces* 甚至销售等领域)

脱节 (The Broken)

那么……为什么要合并这两个领域?原因很多,但首要原因是:我们目前的工作流程是脱节的。绝对的脱节。很多公司的开发部门和运维部门之间存在的深刻矛盾,其实就是这个“脱节”造成的。(意译,求斧正)

下面是一个大家都基本熟悉的例子:部署软件产品。

开发部门要开发一款新产品。这款产品要使用最新最炫的技术,来保证客户的所有花俏的需求,从而给公司带来百万美元的利润。这款产品被要求使用最新的技术和运行平台,还得马上交付。于是开发部门没日没夜的加班、赶代码(cuts code like crazy),终于如期完成了任务。然后他们把自己的“杰作”一股脑的甩给了运维部门,后者还没能完全接手,前者已经迫不及待的开始了庆功会。

接到产品后,运维部门每个人的心中都充满了恐惧。

下面就是运维部门的恐惧之源:({A.B.C}表示 A 或 B 或 C 之一)

  • 这款优秀的产品在目前的底层平台上无法运行,因为这个平台{太古老了,空间不足,不支持某某版本}
  • 这款产品的体系结构跟我们的{存储,网络,部署,安全}模型不匹配。
  • 这款产品的{ 报告,安全,监视,备份,服务提供} 我们搞不懂 ,所以没法把它做成实际可用的产品。

尽管伴随着不绝于耳的抱怨和咒骂,运维部门最终还是把这款产品安装好了。不幸的是,由于做了很多蹩脚的修改和不合理的强迫式运行,这款产品的性能最后被归结为:终极失败(Epic Fail)。

于是非常沮丧的运维部门开始记录各种问题,源源不断的给开发部门提 Issue。而开发部门的回应基本上都是:

  • 这不是我们的错 —— 我们的代码非常完美——而是(运维部门的)部署做的太差劲了。
  • 运维部门比较笨,他们不懂新技术—— 为什么他们没法实现最新的技术呢?为什么他们这么落伍呢?
  • 在我的机器上运行的没问题啊……

两个部门之间的交流很快变成了一场暴风骤雨。客户(以及股东、投资方和管理层)则成了蒙受损失的失败方。最终公司损失了无数的金钱,大家也都失业了。终极的失败。

DevOps 又有啥不同?它有什么好处?

DevOps 就是想方设法的避免这种“终极失败”,同时让大家用更聪明更有效的方式去工作。它是一种框架,包含了很多优秀想法和原则,它鼓励开发部门和运维部门通力合作。在 DevOps 环境中,开发人员和系统管理员会构建一些关系、流程和工具,从而更好的与客户互动,最终提供更好的服务。

DevOps 也不仅仅是一种软件的部署方法。它通过一种全新的方式,来思考如何让软件的作者(开发部门)和运营者(运营部门)进行合作与协同。使用了 DevOps 模型之后,会使两个部门更好的交互,使两者的关系得到改善,从而让很多领域从中受益,例如:自动化、监视、能力规划和性能、备份与恢复、安全、网络以及服务提供(provisioning)等等。

“对于 DevOps 是什么?” 这个问题,DevOps 社区中的每个人的回答都不尽相同。因为我们的工作经验不同,关注的问题也不同。就我个人而言,DevOps 分成四大部分:

简单

KISS(Keep it Simple and Stupid,简单就是美)原则是最重要的。所以本段文字也很简单。我们要尽量提供简单、可重用的解决方案。“简单”节约了书写文档、培训和提供支持的时间。“简单”增加了沟通的速度、避免混淆、减少了开发和运维出错时的风险。“简单”让人更快的发布产品。

部门之间关系

早参与,多参与。对于开发人员,要让运维人员常驻到开发部门,全程参与开发流程。邀请运维人员参与你的 Scrum 或者开发会议,与他们分享项目计划、分享新技术的点子和心得。搜集功能性需求(指开发人员用到的需求)的同时也要搜集运维方面的需求。把对于“发布、备份、监控、安全、配置管理和系统功能”的测试作为一项独立的项目流程。软件产品在开发时解决的问题越多,那么在使用时暴露给用户的问题就越少。给运维人员做培训,让他们弄清楚项目的体系结构和核心代码。如果运维人员在反馈 bug 时提供的信息越多,那么你花在排查问题(trouble-shooting) 的时间就越少,这个 bug 也就会更快的被解决掉。

对于运维人员,在遇到问题时需要把开发人员加进来,大家一起解决问题。邀请开发人员参与你们的会议,分享项目进度(roadmaps),并且共同修订工作计划。运维人员一定要了解开发部门下一步的工作方向,从而确保产品运行的底层平台能够良好的支持最新技术。开发人员也会带来相关的技术、知识和工作,帮助你们改善产品的运行环境,使其更加易于维护、简洁有效。

有一些开发领域的概念,例如:“要根据 API 而非封闭的 interface 来构建工具”,分布式版本控制,驱动测试开发,以及诸如敏捷开发、看板管理(Kanban)和 Scrum 等方法论。如果把这些概念应用在运维领域,同样会产生革命性的变革。

不要惧怕新点子和新技术。我们可以随时随地的向他人学习,哪怕是一句“我们再也不要那样做了!”也会让我们从中获益。尽管处于不同的部门,但是我们要共同学习、共同成长,这样才能协同工作的更好!

按照从高到低的顺序,有效的沟通方式应该是:面对面交流 、视频会议、电话、即时通讯软件、Email。

工作中的流程

有自己的流程管理 (process engineering)—— 从原始的笔录到 ISO9001。但它们都存在一个关键的缺陷:过于理想化,它要求每个步骤都必须成功执行。例如:为了搭建一台新主机,会有下列一套简单的流程:

  • 步骤一:装机(把各个硬件组装到一起)。
  • 步骤二:接线、通电。
  • 步骤三:安装操作系统。
  • 接下来还有步骤四、五、六。

如果一切顺利的话,第 N 步结束之后就会有一个功能完整、运行正常的新主机。但万一有个流程没跑通怎么办?比如说在某个步骤断了,走不下去了,或者在这一步得到了异常的输出,有没有另外的步骤来处理这个异常?

所以,流程绝对不会从头到尾一帆风顺,所以我们要把每一步流程都认真对待,找出所有潜在的问题和障碍。跟软件产品一样,在流程的管理中也要有异常处理。我们不必做到精确预见每一个问题,但一定要保证:即使流程出错,它还能往下走

把不同领域的所有流程串到一起。这些领域包括:部署、监控、能力计划 (capacity planning) 等等。从逻辑上讲,“部署”是软件开发周期的最后一环,所以它应该属于“开发流程”,而非“运维流程”。另一个例子是度量和监控。在开发领域,如果不理解底线标准和估算,就什么评估都做不了。把开发部门和运维部门的流程衔接在一起,也会让两个部门更好的配合、相互理解、承担共同的责任。最后还有个优点:文档只需要一份而不是两份(开发一份、运维一份),从而节省了资金。

自动化,自动化,还是自动化。构建或使用简单、可扩展的工具(确保提供 API, 机器可读的输入、输出 – 参考 James White 的文章:Infrastructure Manifesto )。使用 Puppet 一类的工具做配置管理。要扩展这些自动化工具,使其能够支持多个领域(开发领域和运维领域),并且在产品的不同环境(开发环境、测试环境、发布环境和生产环境)中使用相同的工具(也叫 end-to-end)。这样不但会在产品支持和管理方面带来经济效益,而且也可以在编写新代码的同时,进行产品的发布和管理。

最后,在构建流程和自动化时,要把 KISS 原则牢记于心。越复杂就越易错。只有简单的流程和工具才易于实现、易于管理和易于维护。

持续改进

不要停止创新和学习。当今技术发展的很快,客户的需求也往往如此。把“持续改进和持续集成” 加入到你的工具和流程中去,这也是运维人员向(优秀的)开发人员学习的好途径,可以学到诸如测试驱动开发等最佳实践。例如:可以向你的部署流程中加入单元测试。做监控时也应该增加些行为测试,提高交付质量。尝试用开发领域中的工具(例如 Hudson )在运维领域中做些工作(例如浏览数据 (explore)、测量性能(measure) 等等)。

要不断的总结教训。要积极主动的、在不同领域寻找错误的根源。 一旦收到错误报告,就果断把开发小组和运维小组找来,一起解决这个问题。有时候开发人员很简单的几次代码重构,就可以很好的避免底层运行环境的改变,减少运维人员的负担。总之,遇到问题时,开发部门和运维部门要密切配合、共同解决,而不是互相推诿、踢皮球。

对我来说…

最后,对我来说,DevOps 的主要内容是:跟谁共同工作、如何共同工作。它最吸引我的地方就是致力于把不同部门不同分工的人召集到一起,共同努力解决问题。这样的工作环境,是我所憧憬的乐园。

关于译者

申思维,2005 年本科毕业于华南理工大学计算机学院。一直从事 Web 领域的开发,3 年多 Java、2 年多 Ruby on Rails 的工作经验。目前在摩托罗拉公司工作,一名普通的程序员。

声明:本文已获原创作者 James Turnbull 的许可。

原文链接: http://article.yeeyan.org/view/139924/170387

英文链接: http://www.kartar.net/2010/02/what-devops-means-to-me/

2011-04-24 00:0016063

评论

发布
暂无评论
发现更多内容

一起学习Python的Sanic框架:路由和蓝图

宇宙之一粟

Python 4月月更 sanic

【课程汇总】Hello HarmonyOS系列课程,手把手带你零基础入门

HarmonyOS开发者

HarmonyOS ArKUI 3.0

Ampere Computing释放观测云“芯”算力,强强联合推动可观测性发展

观测云

可观测性 可观测

云融科技加入龙蜥社区,助力金融行业数字化转型

OpenAnolis小助手

数字化转型 龙蜥社区 CLA 云融科技

嵌入式Linux下完成LCD屏文字显示(帧缓冲框架)

DS小龙哥

4月月更

Docker Compose 部署Kibana和 Elasticsearch本地集群 8.1.3

Geek漫游指南

elasticsearch

云原生虚拟化:基于 Kubevirt 构建边缘计算实例

火山引擎边缘云

容器 k8s 边缘计算 Kubevirt

Gartner调查研究:中国的数字化发展较之世界水平如何?高性能计算能否占据主导地位?

GPU算力

GPU服务器 GPU算力

人为什么看不到真相?

源字节1号

网站开发

真正的量子计算机触手可及!英特尔宣布规模化生产硅量子比特

科技新消息

Java类应用高内存问题排查指南

中原银行

Java JVM 问题排查 中原银行 高内存

在互联网+的背景下,企业如何创新客户服务?

小炮

客户服务

Java 并发编程总结

Joseph295

web前端培训React 泛型组件

@零度

前端开发 React

深度报告:异构时代,芯片需集成多个模板

Finovy Cloud

人工智能 云计算 gpu GPU服务器

【建议收藏】吐血整理Golang面试干货21问-吊打面试官-1

利志分享

golang golang 面试

spring-cloud-kubernetes自动同步k8s的configmap更新

程序员欣宸

Java Kubernetes 4月月更

被滥用的“架构师”!

博文视点Broadview

从mybatis-plus-generator看如何编写代码生成器

Rubble

4月日更 4月月更

观测云入驻阿里云计算巢,为用户构建稳定安全的云上连接

阿里云弹性计算

Kafka设计的基本原理

平凡人生

CrashSight 接入上报常见问题及解决方案

WeTest

java培训redis的集群策略

@零度

redis JAVA开发

vue中使用element-resize-detector

CRMEB

nginx proxy_next_upstream 与openresty balancer.set_more_tries的使用

飞翔

nginx openresty

超越 iTerm!号称下一代 Terminal 终端神器,用完爱不释手!

沉默王二

APISIX jwt-auth 插件存在错误响应中泄露信息的风险公告(CVE-2022-29266)

API7.ai 技术团队

api 网关 APISIX CVE

大数据培训Flink面试宝典

@零度

flink 大数据开发

基于 TiDB 的 Apache APISIX 高可用配置中心的最佳实践

API7.ai 技术团队

微服务网关 api 网关 APISIX TiDB

深入理解JMM-CPU多核硬件架构剖析及Java内存模型

janyxe

JVM cpu Java内存模型

Talent Plan 学习营初体验:交流+坚持 开源协作课程学习的不二路径

PingCAP

我眼中的DevOps_研发效能_James Turnbull_InfoQ精选文章