本文是一篇比较有价值的、介绍SRE的文章。国内的所谓SRE职责其实并不明确,大部分其实还是干普通运维的事。但文中介绍的谷歌的运作方式起点还是相对比较高的,无论对SRE、对开发,甚至对公司都有很高的要求。正如本文所述,谷歌的方式并不一定适合其他公司,但其SRE的建设经验仍然能够带来一定的启发。在阅读本文的时候,我是比较好奇谷歌是如何解决SRE和开发相互推诿的问题的。

译自:How Google SRE And Developers Collaborate

谷歌的SRE是一个专业的工程师组织,致力于设计、构建和维护大型产品服务。SRE可以是软件工程师或系统工程师,但通常会同时具备这两种技能。

谷歌的SRE的任务是:

  • 保证谷歌的产品和基础设施能够满足可用性目标
  • 根据(1),最大化长期特征速度(feature velocity,用于评估新特性的发布速度,参见Feature velocity and Serverless)
  • 使用软件而非人力来完成(1)和(2)
  • 当SRE处理(1)和(3)的效率高于开发时,SRE才会参与其中

可靠性和速度并不是互斥的,通常速度可以受益于可靠性的提升,反之亦然。然而,在产品或服务未达到期望的SLO前,(当需要在可靠性和速度之间进行权衡时)SRE会优先考虑稳定性,而非速度。如果没有达到SLO,此时产品的可靠性要比特征速度更加重要。当产品满足SLO后,以牺牲特征速度为代价来换取额外的可靠性则会适得其反。相比采用粗暴的方式来满足目标,SRE会采用工程和自动化方式(而非人力)来优化运维流程。

SLO是一个很好的判定何时该关注可靠性,何时改关注发布速度的标准。的确,如果产品服务已经达到SLO,那么继续提升像性能、可靠性等标准可能会对产品的发布造成很大影响。

作为一个专家团队,(产品开发团队,以下简称Dev对)谷歌SRE有着很高的需求量;SRE能够带来额外的价值的机会很多。在很多场景下,SRE可能会被放大。但如何某个问题可以被Dev组织解决,那么雇佣一个Dev而非SRE反而是一种更灵活的方式,可以减少跨组织带来的开销。引入SRE的最终的目标是使用足够的SRE来最大化影响和开销的比率(即提高性价比)。谷歌的SRE不应该作为其他公司实现SRE的蓝图,但可以作为研究案例。每个组织都是独特的,其需求和目标可能与谷歌不尽相同。但谷歌过去20年的实践经验提供了许多教训,可以帮助其他公司加速其SRE进程。

谷歌的SRE并不是静态的,它是持续演进的,谷歌的不同部门会根据需要采用不同的模型。与很多组织不同,谷歌的SRE是一个中心化的团队。SRE从最初的寥寥数人,目前已经发展为拥有近千人的团队。如下图所示,SRE团队专于特定产品领域(PA),并与该PA中的开发人员密切合作。SRE PAs的数目是可变的,可能会包含近百个SRE。SRE PAs由Dev伙伴组织提供资助,并在每个组织层面与之合作。一个SRE PA通常要比Dev伙伴组织小一个数量级,但比率可能相差很大。大多数SRE团队都有两个工作点,每个点有6到8个SRE,时区差为5到9个小时,以实on-call轮换。

可以看到谷歌的SRE是一个中心化的独立组织,更像是一个项目人力资源池。SRE和Dev会签订合作条约,规定合作范围和内容,以及合作目标,并由Dev提供资金支持。

这种组织架构看起来更有点像甲乙方的关系。对于大多数公司来说其实并不适合,主要有以下几个方面的考量:

  • SRE进入Dev其实也是有成本的,需要学习了解Dev的产品和服务功能。
  • 跨团队运作存在沟通成本、职责明确等问题
  • 如果公司没有足够的业务资助SRE团队,有可能SRE团队优先会成为某些情况下的成本优化对象。

当然好处也是有的,就是更灵活,也让SRE更加纯粹,避免在项目结束之后变为业务运维之类的角色。

合作原则

SRE的工作是基于合作(engatement)的,与Dev同步展开。一个合作会同时涉及到两方,通常会围绕特定的服务或产品。大多数情况下,SRE和Dev之间的合作就是为了提升稳定性、基础设施以及针对特定产品系统的运维而建立的伙伴关系。其他合作可则能会关注产品的端到端用户体验或某个水平架构主题。任何一种合作都可能会跨多个产品系统。一个典型的SRE团队会与系统开发范围内的Dev团队保持一系列合作。

合作模型是谷歌SRE的基本观念。它描述了合作和一系列最佳实践(高效分配资源、沟通、协调以及SRE和Dev之间的协作)原则。它不是一个基于规则的静态模型,但为相关方提供了清晰的界限并设定了相互预期,并且可以轻松识别异常或降低合作度。

本章描述了合作模型的原则,下面将讨论合作类型以及如何在实践中使用它们。

合作原则是这种组织架构核心。它规定了SRE的工作范畴,避免SRE沦为测试+运维角色。

对齐SRE的使命

如前所述,SRE的使命是提高可靠性、效率以及提高谷歌产品的发布速度,保持团队的健康。这种使命应该贯穿每个合作,且每次合作都应该对这些目标产生可衡量的积极影响。

倡导用户

SRE是用户和用户体验的倡导者--无论是外部用户还是内部用户。事实上,可以由系统(或系统组)罗列出SRE的合作内容,但这不应该削弱SRE对用户如何感知可靠性(或缺乏可靠性)的关注。这种关注反映了强调端到端或以客户为中心、SLOs以及SRE的职责重点是关注开发合作伙伴的可靠性差距和风险,即使这些不在SRE团队的直接责任范围内。建议首先在产品层面对齐,然后再让SRE团队关注关键用户的历程(critical user journeys (CUJs))或端到端体验(即使SRE直接负责的特定领域被划定在一组(可能比较宽泛的)服务下)。

这其实是对SRE的一个高要求,总体目标是做出一个好的产品。

清晰的价值定位

SRE只应承担能够比其他任何人更有效执行的工作。将一个特定的团队添加到Dev团队中会引入额外的组织复杂度并增加孤岛风险。如果所有工作都能保证跟在Dev团队内部一样的质量和效率,那么这种方案是可行的,但在需求变更时,让所有团队更加灵活地转变工作并不是一件容易的事情。

SRE是技术娴熟的专业工程师,他们是备受追捧的人才,薪酬与开发同行相当。为了判定是否添加SRE的headcount ,一个合作应该包括具有持久价值的大量可靠性工作,而不是以on-call内容为主。否则,添加Dev的headcount则更有意义。为了深入了解哪些工程流提供了最高的价值,可以引入一定量的on-call工作。但是,给训练有素的工程师团队提供大量on-call工作可能会导致SRE团队内部的不满。由于Dev团队太小或由于Dev团队在某个单独的位置而无法覆盖其on-call的工作内容而引入SRE是错误的,这并不是证明SRE参与的充分理由。

明确范围

SRE团队的工作范围应该局限于某些服务(或CUJs),并且有明确的相关性和界限。SRE不会对特定的服务负责,通常会对Dev团队的所有服务提供基础的支持。Dev和SRE领导层需要定期协商合作范围。

这一点至关重要,如果没有明确的工作范围和界限,SRE就可能被放大处理很多边界模糊的内容,沦为集多种职责于一身的角色。

由开发资助

SRE PAs接受Dev组织授予的headcount 。SRE不通过其自身的管理链接受headcount ,也不能携带未分配的headcount 。虽然Dev资助了SRE团队,但一旦转移了headcount,则由SRE负责该headcount。SRE PA负责人有义务与资助的Dev伙伴进行协商,以便能高效、有效地使用该headcount。如果无法通过SRE工作提供比Dev伙伴更有价值的工作,则需要将该headcount返回给Dev组织。

资助应该是长期的。因为过程中会花费比较长的时间来招聘SREs,并让其在SREs岗位上就职。出于这种原因,谷歌SRE计划在两年或两年以上的时间范围内为headcount 提供资金,并且不将资金与短期、有时间限制的活动挂钩。员工人数的波动将导致效率低下,并且无法让SRE团队深度参与到产品中。

SRE和Dev领导会审视合作的资助程度,例如按年度进行资助。过程中应该考虑合作类型是否正确以及是否降低或增加资金(如通过授予或返还headcount ,或在SRE内重新分配),最终双方达成一致。然而,SRE领导层拥有在现有headcount的限制下分配项目优先级的权利。否则,可能无法充分考虑到安排足够的合作人员等因素。

战略伙伴关系

卓越的产品是一项长期投资。合作不应该仅限于SRE PA层面。SRE PA作为一个整体,应该具有与Dev 组织相同并与之互补的战略愿景,不能仅仅进行一系列毫无联系的合作。SRE PA领导需要有SRE PA愿景,并负责与Dev组织领导优先协商任务。

每个单独的合作都是根据多年的规划建立起来的。合作有望在Dev和SRE之间建立一个共同的路线图,所开展的工作应该在SRE和Dev之间双向移动。SRE不应仅仅执行Dev交过来的任务。

应该在安排出现问题之前设定预期值。否则在胁迫下,很难达成书面协议。系统及其组件会发生变化、合并和偏差。SRE需要小心地使用产品,如果没有足够的启动时间,就不能立即支持新系统。

Dev所有权

不考虑合作的类型,服务本身以及服务的可靠性隶属于Dev团队(即便在某些形式的合作下日常生产权限属于SRE)。这意味着保障服务可靠性的责任并没有下发到SRE团队中,SRE团队的成员是专业的可靠性工程师,他们通过某种类型的合作与Dev团队建立伙伴关系,并帮助Dev团队达到可靠性目标(这反过来规定了SRE对Dev的责任)。

积极、稳健的开发人员参与是服务健康的一部分。由于SRE并不会控制headcount的分派,因此不能单独负责某个服务,历史上,当Dev合作结束之后,这些服务仍然由SRE提供服务,但通常结局都比较糟糕。因此,如果Dev团队打算减少人员配置,则还需要减少服务本身,并将剩余用户迁移到其他服务。一旦Dev不再资助,SRE的服务合作将立即结束,分配的headcount将在Dev合作结束之后返回给Dev团队。

这也是谷歌PA的一种好处,合作是有期限的,因此开发团队不会无限制地将一些事情交给SRE。一旦合作结束,SRE将不再管理该Dev团队的事务。这反过来也对Dev团队本身提出了一定要求。

联合合作伙伴关系

开始并继续与SRE进行合作是Dev和SRE双方共同协商的结果。不能强制SRE接受某个合作,Dev也不能强制资助某一方,Dev和SRE任一方都可以结束合作。

如果Dev或SRE某一方想要结束合作,那么就应该结束本次合作,并以符合上述资助原则的方式重新审查(重新部署或返回)headcount 职位。以非协商一致的方式结束合作是双方应该避免的事情。

共同的努力

SRE和Dev可以带来不同的专长:SRE注重可靠性原则、系统架构和生产最佳实践,而Dev组织通常更加擅长其业务领域。服务的成功是一种共同努力的结果。除了不同的团队担任不同的角色外,双方都有一个共同的目标。包括联合OKRs(目标和关键结果),并遵守错误预算策略(即当服务/CUJ达不到SLO时冻结特性发布)。Dev和SRE的共同目标是使用更有效的方式保证服务的SLO,因此违反SLO,对Dev和SRE 双方都是一个严重的问题。

SLOs和错误预算提升了对可靠性目标的理解,并可以以此衡量合作是否成功。这也使得SRE和Dev需要联合起来考虑如何在可靠性和特性速度之间进行权衡。冻结策略提供了一种简单的方法,可以在客户/用户信任有被破坏的危险时,调整这种平衡,使其达到可靠性。

运维和on-call责任也是一项共同努力,随着服务变得更加成熟,大部分(但不是100%)的维护责任通常由SRE承担。

SLOs是一个很好的团队粘合剂,可以让双方为同一目标而共同努力。但由于是不同的团队,SRE领导也需要对项目的SLO进行评估,避免因为不合理的SLOs或不成熟的团队导致无法达成目标。

SRE不是一个"运维团队"

SRE的使命不是处理运维工作,而是提升系统的可靠性。on-call是结束SRE的一种手段,通常这种方式提供了其他方面无法提供的宝贵见解,但on-call工作本身并没有长期价值。on-call不应该是SRE的核心工作,且单凭这一点并不能证明成立SRE团队是合理的。应该严格限制SRE的运维工作,SRE团队的苦力工作(中断,生产清理等)不应该超过50%的时间。如果超过该阈值,Dev必须负责处理额外的运维工作。这种机制保障了SRE有足够的时间来改善项目,进而降低运维压力。

Dev应该至少承担一部分运维职责。典型示例包括升级下的次级on-call轮换、非生产环境的所有权、和/或处理非关键运维工作。接触运维对于维持和培养Dev团队的生产知识至关重要。应以书面形式跟踪责任划分,以避免误解。

谷歌能够保证SRE的核心职责的一个原因也有组织架构的一部分因素在起作用。由于合作期限的约束,使得Dev团队不能将所有运维和on-call职责都交给SRE。

运维并不是零和游戏

SRE合作应该关注降低整体的运维压力,而不是将运维职责从一处转移到另一处。一个成功的合作会将运维压力降低到理想程度。Dev应该保证24/7 on-call升级路线。

授人以渔

SRE不应该作为生产的人类抽象层。这种方法不可扩展,加强了孤岛,破坏了关键反馈回路,并将生产复杂性转化为证明SRE存在的理由。相反,SRE应该帮助Dev更深刻地理解服务的生产特性

提升生产标准

SRE应促进使用通用生产平台和标准化基础设施。这种平台有几个优点:

  • 提供了一致的服务管理基础设置,降低了实现跨服务需求的实现成本
  • 降低生产中运营个人服务的持续成本(例如,入职时间、工程师培训时间、劳动)。
  • 总体降低支持生产中所有服务的成本;通过使传授技能,工程师可以更轻松地处理不同的服务
  • 降低开发人员和SRE之间以及不同SRE团队之间转移服务的成本。
  • 提高工程师在团队之间的流动性。
  • 简化并降低生产风险
  • 提高工程师的速度
  • 提高整体的生产服务资源利用率

SRE应发布SRE PA级别的生产平台标准---该原则适用于服务,与SRE的支持级别无关。

有意义的工作

必须考虑工作质量。谷歌的SRE与Dev有着相同的流动机会,因此需要一个新颖、富有挑战性、有趣的环境来实现个人发展。SRE在OKR规划方面与Dev密切合作,但最终拥有自己的OKR。

进度追踪

与SRE的合作是一项重大投资,需要结构化规划和进度追踪。SRE和Dev共享一个的路线图,并跟踪目标进展,定期审查服务的健康状况、关键性、业务合理性和优先级。 这可以通过业务审查、季度报告和生产健康审查等方式实现。

左移(shift left)

SRE合作可能发生在服务生命周期的任意阶段--不局限于生产启动阶段。通常在服务生命周期的早期(即"左移",如,在设计和实现阶段)引入SRE是最具影响力和效率的。在设计阶段,可以很容易地更改基本架构和基础设施决策,但对于一个完全产品化的系统来说,修改这些决策通常非常困难或代价高昂。早期与SRE建立合作关系可以防止以后出现严重的问题。

总结

谷歌SRE的成功带有特定的企业基因:

  • 公司体量:保证了SRE的"就业市场"
  • 公司人员素质:保证了Dev和SRE团队的人员能够遵守相关流程约定,并能够保证绝大部分人员的技能水平和职业素养。

因此谷歌的SRE并不一定适用于其他企业,但其所提倡的SRE中心化也有其存在的意义,除了灵活地支持各个业务线,也可以让SRE避免沦为业务运维工具人。让SRE和Dev以SLOs作为决定提高可靠性还是特征速度的分界线,以此可以让各个团队有一个共同的目标。另外一个至关重要的是合作约定,该约定类似合同,除了保证SLOs的完成,也是可以避免SRE放大化的一个重要条约。

除了对SRE和Dev的硬性要求外,文中还提出了一些建议性的意见。但这需要各个团队成员具有一定程度的职业素养,且能够形成正反馈才能真正实现。文中所描述的SRE更像是个战斗旅和专家顾问的角色,不应该将其作为传统运维或on-call轮岗人员,这样会降低SRE的工作热情,无法发挥SRE的真正作用。

我个人认为理想的业务应该是一个个可以正反馈的闭环,相关成员都能够在保证交付的前提下,提升业务的可靠性,并从中得到技能提升和成就感。作为项目管理人员,应该细化项目的迭代周期,考虑项目可能存在的风险点,避免因为操之过急,导致开发进度和可靠性都无法满足。

谷歌的SRE和开发是如何合作的的更多相关文章

  1. [Android 新特性] 谷歌发布Android Studio开发工具1.0正式版(组图) 2014-12-09 09:35:40

    Android Studio是谷歌于13年I/O大会推出的Android开发环境,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的Androi ...

  2. 谷歌推出全新Android开发语言Sky:让App更流畅

    土豆网同步更新:http://www.tudou.com/plcover/VHNh6ZopQ4E/   使用HTML 创建Mac OS App 视频教程. 官方QQ群: (1)App实践出真知 434 ...

  3. 谷歌protobuf(protocol-buffers)各种开发语言数据类型转换说明

    官方文档:https://developers.google.cn/protocol-buffers/docs/proto proto2 proto3

  4. 谷歌SRE运维模式解读

    谷歌SRE运维模式解读 前面我和你分享了一些关于运维组织架构和协作模式转型的内容,为了便于我们更加全面地了解先进的运维模式,今天我们再来谈一下谷歌的SRE(Site Reliability Engin ...

  5. 【转载】谷歌酝酿将苹果Swift作为安卓APP主要开发语言

    TNW中文站 4月8日报道 安卓操作系统的软件开发语言是Java,而在过去几年中,有关Java的版权,谷歌(微博)和甲骨文之间发生了长期的诉讼.最新外媒消息称,谷歌正在考虑将苹果开发的Swift作为未 ...

  6. 谷歌宣称web组件才是web开发的未来

    谷歌宣称web组件才是web开发的未来 虽然今年的谷歌I/O大会没有出现像去年谷歌眼镜发布时直播疯狂跳伞这样的活动,但是上周仍然有不少产品推出.谷歌宣布对谷歌地图.搜索.安卓,以及其他 很多产品做出更 ...

  7. 百度王一男: DevOps 的前提是拆掉业务-开发-测试-运维中间的三面墙

    这是一个创建于 375 天前的主题,其中的信息可能已经有所发展或是发生改变. 由数人云.优维科技.中生代社区联合发起的 系列 Meetup < DevOps&SRE 超越传统运维之道&g ...

  8. 谷歌 google

    google Google是搜索引擎名,也是一家美国上市公司名称.Google公司于1998年9月7日以私有股份公司的形式创立,以设计并管理一个互联网的搜索引擎.Google公司的总部称作“Googl ...

  9. 读SRE Google运维解密有感(一)

    前言 这几天打算利用碎片时间读了一下"SRE Google运维解密"这本书,目前读了前几章,感觉收获颇多,结合自己的工作经历和书中的要点,写一些感悟和思考 SRE 有关SRE我就不 ...

随机推荐

  1. [python][flask] Flask 入门(以一个博客后台为例)

    目录 1.安装 1.1 创建虚拟环境 1.2 进入虚拟环境 1.3 安装 flask 2.上手 2.1 最小 Demo 2.2 基本知识 3.解构官网指导 Demo 3.1 克隆与代码架构分析 3.2 ...

  2. Nginx编译安装及常用命令

    一个执着于技术的公众号 前言 前面我们已经了解Nginx基础入门知识,今天就带大家一起学习下Nginx编译安装部署 准备工作 一台linux机器(本次实验以CentOS 7.5为例) 到Nginx官方 ...

  3. Map传参优雅检验,试试json schema validator

    背景 笔者目前所在团队的代码年代已久,早年规范缺失导致现在维护成本激增,举一个深恶痛疾的例子就是方法参数使用Map"一撸到底",说多了都是泪,我常常在团队内自嘲"咱硬是把 ...

  4. 石油储运生产 2D 可视化,组态应用赋能工业智慧发展

    前言 当前,国际油价低位徘徊导致各国石油化工行业投资大幅缩减,石油化工建设行业竞争环境日趋严峻,施工企业的利润空间也被不断压缩.内外交困的环境下,促使企业采取更有效的管理手段来提高效率和降低成本.石油 ...

  5. git 本地项目关联新repo

    git initgit remote add origin repo-url git pull origin master --allow-unrelated-histories git add . ...

  6. MySQL用户管理与字符集

    用户管理与字符集 一.用户管理 用户名的概念 用户名是由两部分组成的 user和host 1.1 创建用户 create user 'yysue'@'192.168.5.38' identified ...

  7. 设计并实现加法器类 Adder

    学习内容:设计并实现加法器类 Adder 代码示例: package 实验三; import java.util.Scanner; public class Adder { private int n ...

  8. 通过CSS让图片变的清楚

    image { width: 100%; height: 100%; border-radius: 10upx; //让图片变清楚 image-rendering: -moz-crisp-edges; ...

  9. js循环调用axios异步请求,实现同步

    准备: const axios = require('axios'); // axios请求 const res = []; const arr = ["a", "b&q ...

  10. Vue自定义组件之v-model的使用

    自定义组件之v-model的使用 v-model的语法糖可以为下面v-bind && @input联合完成: <input v-model="text"> ...