SRE视角下的DevOps:构建稳定高效的软件交付流程

SRE 和 DevOps 有什么区别和联系?本文对此进行了解读,并着重从 SRE 实践出发阐述了 DevOps 的建设思路。

SRE 就是在用软件工程的思维和方法论完成以前由系统管理员团队手动完成的工作。SRE 的职责是运维一个服务,该服务由一些相关的系统组件组成,为最终用户(可以是内部用户也可以是外部用户)提供服务。SRE 的终极责任是确保该服务可以正常运转。为达成这一目标,SRE 需要完成开发监控系统、规划资源容量、处理紧急事件、跟踪修复事故根源等。SRE 对重复性、手工性的操作有天然的排斥感,并有足够的技术能力快速开发出软件系统以替代手工操作。

DevOps 的核心思想是协调开发 Dev 和运维 Ops 关系,使之能有效沟通和协作,通过工具链、流水线高效衔接,持续反馈,实现研发 Dev 到运维 Ops 流程的持续优化和完善。

一、理解 SRE 和 DevOps 异同

有人说 SRE 就是 DevOps,DevOps 等于 SRE,其实是不对的。DevOps 是一种协调开发和运维之间协作关系的思想理念,SRE 是在 Google 类似于 DevOps 思想理念的一种实践。SRE 更关注站点或产品或应用服务等运行的稳定性,以 “错误预算” 协调开发和运维之间的利益关系,所以 SRE 其实更多是在 Ops 端。但关注 “运维 Ops” 这无疑是正确的,和我们习惯于更关注 “开发 Dev” 是不一样的。SRE 强调用工程化的手段应对运维问题。软件运维问题达到一定规模时,也确实只能通过软件工程化的手段来解决。

SRE 团队替代了很多研发 Dev 的工作,使 Dev 更专注于业务应用或产品的研发,而不再关注软硬件基础设施和中间件工具,所以研发的工作就聚焦化了。同时通过 SRE 团队所构建的自动化工具链、流水线等提升了研发效率。

DevOps 和 SRE 的关系类似于 SOA 和 ESB 的关系。SRE 是 DevOps 思想落地的一种方式。SRE 模型成功的关键在于对工程的关注,如果没有持续的、工程化的解决方案,运维的压力就会不断增加,也就需要更多的人来完成工作。SRE 的终极目标是推动整个系统趋向于无人化运行,也就是智能化,不仅仅是自动化。“如果系统正常运转中需要人工干预,应该将此视为一种 bug”。

SRE 既做运维也做开发。其开发时间不少于 50%。既保障 SRE 有足够的时间和精力去进行真正有创造性的、自主性的研发工作,同时也保障了 SRE 团队有足够的运维经验,深度理解运维的需求,从而让他们设计出切实解决问题的系统。但 SRE 只是关注于运维工具和流程自动化的研发,而不做业务应用或产品的研发。这也从实践说明了 DevOps 的建设是需要靠自己而不是靠外部厂商。因为这是一个持续的,不断变化改进的过程。

二、研发和运维之间的利益冲突

企业中研发 Dev 和运维 Ops 之间最主要的矛盾就是应用服务迭代创新的速度与应用服务稳定运行程度之间的矛盾。我们总是强调敏捷研发、敏捷交付,但是研发之后交付之后改怎么运维却考虑的比较少。虽然目前智能运维 AIOps 等很多人都在讲,但个人觉得目前更多只是噱头,远未到智能运维的阶段。试想基本运维都没做好就去做智能运维,就像让不会走的小孩就要跑起来,有点可笑。要解决 Dev 和 Ops 双方的利益冲突,则需要同时能关注矛盾双方的诉求、保障矛盾双方的利益。既要保证 “速度”,更要关注 “稳定性”。但任何软件系统都不应该一味追求 100% 可靠。对最终用户来说,99.99%、99.999% 和 100% 的可用性并没有实质的区别。因此 DevOps 建设就是追求这种矛盾的统一。

我们说过,在软件整个生命周期过程中,研发阶段可能只占 20%,大部分时间都是在运维、在持续优化。所以 SRE 关注运维是正确的。解决方式就是通过软件工程化、系统化的方法来解决运维问题,这也就是很多人说的 “研发运维一体化”(这里的研发是 “运维研发”,不是 “产品研发”)。企业 DevOps 建设就需要设法协调研发与运维之间的矛盾,满足双方的利益诉求。SRE 是通过高层所定下的 “错误预算” 来协调双方矛盾的(但错误预算有其局限性,我们将在后续详细讨论 DevOps 效率建设问题)。在 DevOps 建设中,研发关注需求、CI,CD 则需要和运维协作,这也是我们一直反对在容器云平台做流水线做 CICD 的一个原因。运维平台、运维工具、运维方法、运维流程、运维组织和运维思想的首先建立是必要的。做好运维,将会更好的支撑敏捷研发和持续部署发布,真正实现敏捷。

三、DevOps 建设思路

对 DevOps 的错误理解之一就是一个人什么都干。要提升软件工程效率,就必须实现分工。这和社会生产发展规律也是一样的。只有分工才能提升效率。因此 DevOps 建设首先就需要考虑职责分工。从 SRE 实践我们看到,DevOps 建设要关注运维,运维要分层,职责要轮换,体系要简单,追求矛盾的统一。用软件工程化的方式建设软件基础设施来支撑产品研发,提升研发效率。

(1)DevOps 建设重点在运维

Google SRE 虽然也做运维工具和运维组件的研发,但本质上是运维团队。只有运维团队把软硬件基础设施准备好了,应用或产品开发团队才能更好的享受软硬件基础设施所带来的便利。研发的敏捷性往往是由运维的稳定性驱动的。只有持续构建部署稳定可靠的应用服务,研发才能真正地实现敏捷迭代,而不是陷于应对繁琐的基础设施工作中不能自拔。这和我们习惯的关注 CICD 的 DevOps 理念是不同的。只有从整体上考虑 DevOps,从顶层设计考虑 DevOps,才能把 DevOps 建设好。开发和运维的工作量基本上是 2:8,完成开发,应用或产品的生命周期才刚刚开始不久,更长生命阶段是在运维和完善。因此软硬件基础设施的建设和完备是产品研发的基础和巨人的肩膀。

(2)软硬件基础设施运维分层

软硬件基础设施内容众多,这也是 DevOps 建设比较困难的一个地方。从 SRE 来看,其通过团队职责的细化实现了基础设施的分层运维。这涉及到组织架构的优化。和我们传统一个团队什么都运维的思路是不同的。通过专业化的分工使运营效率大幅提升。而通过提供服务化的方式又可以和其他团队平滑合作。

DevOps 建设中运维内容我们可以简单的划分为:硬件基础设施(服务器、存储、网络、DataCenter、机柜、机架……)资源、软件基础设施和通用工具(OS、通信、认证、权限、监控、日志、调度、配置、消息组件……)、数据平台和数据工具(数据库、大数据平台、机器学习平台……)、应用支撑平台(虚拟化、云管、PaaS、服务治理平台、负载均衡器、中台服务……)、业务应用和业务系统等。业务应用和业务系统在这些软硬件基础设施之上部署运行,由各个运维团队来进行日常维护和管理。同时这些团队需要完成日常运维工作所需的工具开发、自动化流程等。

我们可以很容易的看到,软件产品的研发需要考虑的内容很多。如果没有运维的经验,软件产品也很难设计好。比如组件的部署方式、部署位置、部署数量等等。因此要设计研发出真正好的软件产品,需要具备相应的运维意识和能力。

(3)职责轮换,促进理解和提升技能

这里职责轮换包含两个循环:一是 Dev 和 Ops 职责的轮换,二是 Ops 内部开发和运维人员的职责互换,这部分其实就是 google 的 SRE。开发和运维角色互换,更有助于开发理解运维工作,而运维的经验也让开发人员更关注部署、运维的细节,避免开发导致的部署和运行缺陷。

很多开发人员从来没做过运维,没有运维经验和体会,不理解应用服务和产品的稳定性运维运营问题,所以也很难设计出满足稳定性的产品和应用来,在稳定性、客户体验等众多方面都达不到要求,也使很多开发人员难以虚心求教,反而自以为是,带来大量的产品问题。

以 Ops 内部小循环带动 DevOps 大循环,真正理解软件工程生命周期过程,减少设计和编码缺陷,提升系统稳定性和用户体验,这才是建设 DevOps 的意义,也是软件人员快速成长的捷径。不过这样的方式无疑改变了传统的项目管理方式和组织管理方式。组织改进最严重的阻碍是来自于组织文化、领导想法和领导魄力。打破传统守旧的文化和思维体系,可能难于上青天。不过若要获得成功,就必须在整个组织里培养一种生机型的文化和组织战略。

(4)保持简单

软件工程的一个关键思想是保持简单。把复杂的系统简化,是一个合格的软件架构师、工程师必须考虑的问题。软件系统本质上是动态的和不稳定的。需求在不断的变化,软件系统在不断的改进和调整。唯一不变的是变化。DevOps 的工作就是在系统灵活性和稳定性之间选择平衡,在敏捷研发部署和系统稳定运行之间达成一致。最简单的流程和步骤将会是最高效的。软件的简单性是稳定性的前提。

大道至简,保持简单就需要从软件工程的各个阶段各个层次以最简单的方式解决最复杂的问题。至简源码、最短链路、最小依赖、自动化、自服务等首先软件工程和业务系统的简单化,从而实现可预期的稳定性。

1. 最简化源码

删除不需要的源码和注释,使代码最简化。我们知道添加到项目中的每行代码都可能引入新的缺陷和错误。敢于剪除多余的冗枝,绿植往往会长的更好。没有什么可以去掉的时候,往往才是最好的、最合适的。所以在编码阶段就要敢于删除冗余不用的代码,不要想着某一天还会用到。不删除,基本上这些代码永远也用不上了。

2. 最短链路

我把最短链路作为微服务设计的一个原则。一方面是效率考虑,一方面也是简单化。避免复杂链路的容易出现的循环调用。最短链路在 DevOps 建设中也可以作为一个原则,指导研发人员服务的设计和系统架构。

3. 最小化依赖

最短链路原则会减少服务、系统之间的依赖关系。但不仅仅是服务之间。其实我们在讨论容器云平台设计时也说过,引入的不必要组件导致了整个平台的复杂化、资源浪费和不稳定。

4. 自动化

自动化是 DevOps 建设的基本要求之一。自动化才能消除众多的人工重复性操作,从而减少人为错误,提升工作效率。最简单的例子,我们有数百台容器节点,每三个月需要按要求修改密码。如果人来做,是很大的工作量,而自动化,几分钟就可以按规则修改完毕。Google SRE 就是通过软件工程的方法实现自动化运维,把人工运维工作降到最低。

5. 自服务

首先团队需要实现自给自足。这在团队职责划分、团队服务能力抽象整合、标准化信息服务 API 等建设都需要有合理的规划和设计。SRE 开发工具、自动化流程、平台等一方面实现自身运维运营需求,另一方面支撑产品研发团队可以自己掌控和执行自己的发布流程。

四、总结

我们可以把 SRE 看作是 DevOps 理论的一项具体实践。SRE 的很多方法和做法是值得我们思考和尝试的。同时也不能完全照搬 SRE 的实践,不能把它当作最佳实践神化。SRE 以软件工程化、系统化思路是用错误预算来解决开发运维之间的协作问题,有其合理性,也有局限性。不过其关注运维、限制 SRE 运维总时间投入以确保研发能力、保持简单化、运维分层等思想是非常值得吸收的实践经验,值得我们在建设 DevOps 中思考和采用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/840966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】yolov8 seg实例分割训练,交通灯

文章目录 一、类别定义二、标注后再清洗数据三、训练yolov8 seg四、部署五、代码资料 一、类别定义 类别0: 类别1: 类别2: 类别3: 类别4: 类别5: 类别6: 类别7: 二、标注后再清洗…

同名在线查询系统微信小程序源码下载支持多种流量主,附带系统教程

同名在线查询系统微信小程序源码下载支持多种流量主这是一款支持查询同名的一款微信小程序 该款小程序支持多种查询模式 重名查询,热度查询,概率香查询 源码免费下载地址抄笔记(chaobiji.cn)

Keras深度学习框架第二十讲:使用KerasCV中的Stable Diffusion进行高性能图像生成

1、绪论 1.1 概念 为便于后文讨论,首先进行相关概念的陈述。 Stable Diffusion:Stable Diffusion 是一个在图像生成领域广泛使用的技术,尤其是用于文本到图像的转换。它基于扩散模型(Diffusion Models),这…

Aiseesoft iPhone Unlocker for Mac激活版:一键解锁工具

在数字时代,手机解锁问题时常困扰着我们。Aiseesoft iPhone Unlocker for Mac作为一款专为Mac用户打造的解锁工具,以其简洁易用的界面和强大的功能,成为了解决iPhone解锁问题的最佳选择。 Aiseesoft iPhone Unlocker for Mac激活版下载 Aisee…

redisson 使用fastJson2序列化

前因:一个项目:有人用redisTemplete存数据(使用了fastjson2),使用redisson取的时候就会报错。要让redisTemplete与redisson序列化一致 一、自定义序列化器 import com.alibaba.fastjson2.JSON; import com.alibaba.fa…

Mybatis-Plus笔记

1.MP基础 1.1 MP常见注解 TableName(“指定表明”) TableName("tb_user") // 指定表名 Data NoArgsConstructor AllArgsConstructor Builder public class User {private Long id;private String userName;private String password;private String name;private I…

JVM学习-堆空间(三)

JVM在进行GC时,并非每次都对新生代、老年代、方法区(元空间)三个区域一起回收,大部分时间回收的都是新生代 针对Hotspot VM的实现,它里面的GC按照回收区域分两大类型:一种是部分收集(Partial GC),一种是整堆收集(Full …

Mysql之InnoDB索引

1.索引简介 官网介绍:MySQL :: MySQL 8.0 Reference Manual :: 10.3.1 How MySQL Uses Indexes 索引用于快速查找具有特定列值的行。如果没有索引, MySQL 必须从第一行开始,然后读取整个表以找到相关的行。表越大,花费就越多。如果表中有相关…

【C++算法】BFS解决单源最短路问题相关经典算法题

1.迷宫中离入口最近的出口 首先我们可以将这道题目简化一下,可以往我们这一章的主题上面来想想。 我们利层序遍历来解决最短路径问题,是最经典的做法。我们可以从起点开始层序遍历, 并组在遍历的过程中记录当前遍历的层数。这样就能在找到出口的时候&…

k8s遇到的错误记录

时隔四年有开始重新鼓捣k8s了,重新安装后遇到的错误记录如下: Error: Package: kubelet-1.14.0-0.x86_64 (kubernetes) Requires: kubernetes-cni 0.7.5 Available: kubernetes-cni-0.3.0.1-0.07a8a2.x86_64 (kubernetes) …

【zotero6】ZotCard笔记模板分享

zotcard插件下载链接:传送门 因为zotero出了新的zotero7,现在下载插件会出现zotero6和zotero7不兼容的情况,通过这个链接可以区分适配不同版本的插件。 下载后点击工具的附加组件 然后选择通过文件添加 就可以添加插件了 再通过 工具->…

F.费用报销【蓝桥杯】/01背包

费用报销 01背包 思路&#xff1a;f[i][j]表示前i个票据在容量为j的背包中能占的最大值。 #include<iostream> #include<algorithm> using namespace std; int day[13]{0,31,28,31,30,31,30,31,31,30,31,30,31}; int dp[1005][5005]; int s[13]; int last[1005];…

android实现PhotoShop里的魔棒效果

魔棒是画板工具一个重要的功能&#xff0c;非常实用&#xff0c;只要轻轻一点&#xff0c;就能把触摸到的颜色区域选中&#xff0c;做复制、剪切、擦除等工作。 那怎么实现呢&#xff1f; 先来看看效果&#xff1a; 要实现这个效果&#xff0c;需要对安卓canvas和paint理解比…

【html】网页布局模板01---简谱风

模板效果: 这是一种最简单,最干净的一种网页布局。 模板介绍: 模板概述: 这个模板是一个基础的网页布局模板,包括一个头部区域(header),其中包含网站标题(logo)和导航菜单(nav),以及一个页脚区域(copy),用于显示版权信息。整体布局简洁明了,适合作为各种类…

不靠后端,前端也能搞定接口!

嘿&#xff0c;前端开发达人们&#xff01;有个超酷的消息要告诉你们&#xff1a;MemFire Cloud来袭啦&#xff01;这个神奇的东东让你们不用依赖后端小伙伴们&#xff0c;也能妥妥地搞定 API 接口。是不是觉得有点不可思议&#xff1f;但是事实就是这样&#xff0c;让我们一起…

探索编程乐趣:绘制螺旋图的奇幻之旅

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;编程的魔法世界 二、绘制螺旋图的准备工作 三、代码实战&#xff1a;…

X-SCAN:Rust从零实现一个命令行端口扫描工具

0. 成品预览 本文将基于Rust构建一个常见的网络工具&#xff0c;端口扫描器。 按照惯例&#xff0c;还是和之前实现的文本编辑器一样&#xff0c;我给这个工具起名为X-SCAN,它的功能很简单&#xff0c;通过命令行参数的方式对指定IP进行扫描&#xff0c;扫描结束之后返回该IP…

Spring AMQP 随笔 8 Retry MessageRecoverer ErrorHandler

0. 列位&#xff0c;响应式布局好麻烦的 … 有意思的&#xff0c;chrome devtool 在调试响应式的分辨率的时候&#xff0c;比如说在 宽度远远大于 768 的时候&#xff0c;按说浏览器也知道大概率是 web端方式打开&#xff0c;样式也是如此渲染&#xff0c;但一些事件(没有鼠标…

【IC设计】牛客网-序列检测习题总结

文章目录 状态机基础知识VL25 输入序列连续的序列检测VL26 含有无关项的序列检测VL27 不重叠序列检测VL28 输入序列不连续的序列检测参考资料 状态机基础知识 VL25 输入序列连续的序列检测 timescale 1ns/1ns module sequence_detect(input clk,input rst_n,input a,output re…