运维

    print(
        '''
    *********************************************
                    _ooOoo_
                    o8888888o
                    88" . "88
                    (| -_- |)
                    O\  =  /O
                ____/`---"\____
                ."  \\|     |//  `.
                /  \\|||  :  |||//  \\
            /  _||||| -:- |||||-  \\
            |   | \\\  -  /// |   |
            | \_|  ""\---/""  |   |
            \  .-\__  `-`  ___/-. /
            ___`. ."  /--.--\  `. . __
        ."" "<  `.___\_<|>_/___."  >""".
        | |:  `- \`.; `\ _ /`; .`/ - `: | |
        \  \ `-.   \_ __\ / __ _ / .-` / /
    == == ==`-.____`- .___\_____/___.-`____.-"== == ==                    `=-- -="
    ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
            佛祖保佑       永不宕机'''
    )

概述

参考:

Operations(运维)

Operation and Maintenance

带你体验正规的运维工作是什么的!

原文链接:https://www.sohu.com/a/156797475_99902604

运维人员对公司互联网业务所依赖的基础设施、基础服务、线上业务进行稳定性加强,进行日常巡检发现服务可能存在的隐患,对整体架构进行优化以屏蔽常见的运行故障,多数据中接入提高业务的容灾能力。通过监控、日志分析等技术手段,及时发现和响应服务故障,减少服务中断的时间,使公司的互联网业务符合预期的可用性要求,持续稳定地为用户提供务。

在安全方面,运维人员需要关注业务运行所涉及的各个层面,确保用户能够安全、完整地访问在线业务。 从网络边界划分、ACL 管理、流量分析、DDoS 防御,到操作系统、开源软件的漏洞扫描和修补,再到应用服务的 XSS、SQL 注入防护;

从安全流程梳、代码白盒黑盒扫描、权限审计,到入侵行为检测、业务风险控制等。

运维人员需要保障公司提供的互联网业 运行在安全、可控的状态下,确保公司业务数据和用户隐私数据的安全,同时还需要具备抵御各种恶意攻击的能力。

在确保业务稳定、安全的前提下,还需保障业务高效的运转,公司内快速的产出。运维工作需要对业务进行各方面优化。

比如,IO 优化提升数据库性能,图片压缩降低带宽使用量等,提供的互联网业务以较小的资源投入带来最大的用户价值和体验。同时,还需要通过各种工具平台提升内部产品发布交付的效率,提升公司内运维相关的工作效率。

工作分类运维

运维的工作方向比较多,随着业务规模的不断发展,越成熟的互联网公司,运维岗位会划分得越细。当前很多大型的互联网公司,在初创时期只有系统运维,随着服务规模、服务质量的 要求,也逐渐进行了工作细分。 一般情况下运维团队的工作分类(见图 1-1)和职责如下。

图 1-1 运维团队的工作分类

系统运维

系统运维负责 IDC、网络、CDN 和基础服务的建设(LVS、NTP、DNS);负责资产管理,服务器选型、交付和维修。详细的工作职责如下:

1.IDC 数据中心建设

收集业务需求,预估未来数据中心的发展规模,从骨干网的分布,数据中心建筑,以及 Internet 接入、网络攻击防御能力、扩容能力、空间预留、外接专线能力、现场服务支撑能力等方面评估选型数据中心。负责数据中心的建设、现场维护工作。

2.网络建设

设计及规划生产网络架构,这里面包括:数据中心网络架构、传输网架构、CDN 网络架构等,以及网络调优等日常运维工作。

3.LVS 负载均衡和 SNAT 建设

LVS 是整个站点架构中的流量入口,根据网络规模和业务需求,构建负载均衡集群。完成网络与业务服务器的衔接,提供高性能、高可用的负载调度能力,以及统一的网络层防攻击能力。SNAT .集中提供数据中心的公网访问服务,通过集群化部署,保证出网服务的高性能与高可用。

4.CDN 规划和建设

CDN 工作划分为第三方和自建两部分。

建立第三方 CDN 的选型和调度控制;根据业务发展趋势,规划 CDN 新节点建设布局;完善 CDN 业务及监控,保障 CDN 系统稳定、高效运行。

分析业务加速频道的文件特性和数量,制定最优的加速策略和资源匹配;负责用户劫持等 CDN 日常故障排查工作。

5.服务器选型、交付和维护

负责服务器的测试选型,包含服务器整机、部件的基础性测试和业务测试,降低整机功率,提升机架部署密度等。

结合对公司业务的了解,推广新硬件、新方案减少业务的服务器投入规模。负责服务器硬件故障的诊断定位,服务器硬件监控、健康检查工具的开发和维护。

6.OS、内核选型和 OS 相关维护工作

负责整体平台的 OS 选型、定制和内核优化,以及 Patch 的更新和内部版本发布;建立基础的 YUM 包管理和分发中心,提供常用包版本库;跟进日常各类 OS 相关故障;针对不同的业务类型,提供定向的优化支持。 7.资产管理

记录和管理运维相关的基础物理信息,包括数据中心、网络、机柜、服务器、ACL、IP 等各种资源信息,制定有效的流程,确保信息的准确性;开放 API 接口,为自动化运维提供数据支持。

8.基础服务建设

业务对 DNS、NTP、SYSLOG 等基础服务的依赖非常高,需要设计高可用架构避免单点,提供稳定的基础服务。

应用运维

应用运维负责线上服务的变更、服务状态监控、服务容灾和数据备份等工作,对服务进行例行排查、故障应急处理等工作。详细的工作职责如下所述。

1.设计评审

在产品研发阶段,参与产品设计评审,从运维的角度提出评审意见,使服务满足运维准入的高可用要求。 2.服务管理

负责制定线上业务升级变更及回滚方案,并进行变更实施。掌握所负责的服务及服务间关联关系、服务依赖的各种资源。能够发现服务上的缺陷,及时通报并推进解决。

制定服务稳定性指标及准入标准,同时不断完善和优化程序和系统的功能、效率,提高运行质量。完善监控内容,提高报警准确度。

在线上服务出现故障时,第一时间响应,对已知线上故障能按流程进行通报并按预案执行,未知故障组织相关人员联合排障。

3.资源管理

对各服务的服务器资产进行管理,梳理服务器资源状况、数据中心分布情况、网络专线及带宽情况,能够合理使用服务器资源,根据不同服务的需求,分配不同配置的服务器,确保服务器资源的充分利用。

4.例行检查

制定服务例行排查点,并不断完善。根据制定的服务排查点,对服务进行定期检查。对排查过程中发现的问题,及时进行追查,排除可能存在的隐患。

5.预案管理

确定服务所需的各项监控、系统指标的阈值或临界点,以及出现该情况后的处理预案。建立和更新服务预案文档,并根据日常故障情况不断补充完善,提高预案完备性。能够制定和评审各类预案,周期性进行预案演练,确保预案的可执行性。

6.数据备份

制定数据备份策略,按规范进行数据备份工作。保证数据备份的可用性和完整性,定期开展数据恢复性测试。

数据库运维

数据库运维负责数据存储方案设计、数据库表设计、索引设计和 SQL 优化,对数据库进行变更、监控、备份、高可用设计等工作。详细的工作职责如下所述。

1.设计评审

在产品研发初始阶段,参与设计方案评审,从 DBA 的角度提出数据存储方案、库表设计方案、SQL 开发标准、索引设计方案等,使服务满足数据库使用的高可用、高性能要求。

2.容量规划

掌握所负责服务的数据库的容量上限,清楚地了解当前瓶颈点,当服务还未到达容量上限时,及时进行优化、分拆或者扩容。

3.数据备份与灾备

制定数据备份与灾备策略,定期完成数据恢复性测试,保证数据备份的可用性和完整性。 4.数据库监控 完善数据库存活和性能监控,及时了解数据库运行状态及故障。

数据库安全

建设数据库账号体系,严格控制账号权限与开放范围,降低误操作和数据泄露的风险;加强离线备份数据的管理,降低数据泄露的风险。

5.数据库高可用和性能优化

对数据库单点风险和故障设计相应的切换方案,降低故障对数据库服务的影响;不断对数据库整体性能进行优化,包括新存储方案引进、硬件优化、文件系统优化、数据库优化、SQL 优化等,在保障成本不增加或者少量增加的情况下,数据库可以支撑更多的业务请求。

6.自动化系统建设

设计开发数据库自动化运维系统,包括数据库部署、自动扩容、分库分表、权限管理、备份恢复、SQL 审核和上线、故障切换等功能。

运维研发

运维研发负责通用的运维平台设计和研发工作,如:资产管理、监控系统、运维平台、数据权限管理系统等。提供各种 API 供运维或研发人员使用,封装更高层的自动化运维系统。详细的工作职责如下所述。

8.运维平台

记录和管理服务及其关联关系,协助运维人员自动化、流程化地完成日常运维操作,包括机器管理、重启、改名、初始化、域名管理、流量切换和故障预案实施等。

9.监控系统

负责监控系统的设计、开发工作,完成公司服务器和各种网络设备的资源指标、线上业务运行指标的收集、告警、存储、分析、展示和数据挖掘等工作,持续提高告警的及时性、准确性和智能性,促进公司服务器资源的合理化调配。

10.自动化部署系统

参与部署自动化系统的开发,负责自动化部署系统所需要的基础数据和信息,负责权限管理、API 开发、Web 端开发。结合云计算,研发和提供 PaaS 相关高可用平台,进一步提高服务的部署速度和用户体验,提升资源利用率。

运维安全

运维安全负责网络、系统和业务等方面的安全加固工作,进行常规的安全扫描、渗透测试,进行安全工具和系统研发以及安全事件应急处理。详细的工作职责如下所述。

1.安全制度建立

根据公司内部的具体流程,制定切实可行,且行之有效的安全制度。

2.安全培训

定期向员工提供具有针对性的安全培训和考核,在全公司内建立安全负责人制度。

3.风险评估

通过黑白盒测试和检查机制,定期产生对物理网络、服务器、业务应用、用户数据等方面的总体风险评估结果。

4.安全建设

根据风险评估结果,加固最薄弱的环节,包括设计安全防线、部署安全设备、及时更新补丁、防御病毒、源代码自动扫描和业务产品安全咨询等。为了降低可能泄露数据的价值,通过加密、匿名化、混淆数据,乃至定期删除等技术手段和流程来达到目的。

5.安全合规

为了满足例如支付牌照等合规性要求,安全团队承担着安全合规的对外接口人工作。

6.应急响应

建立安全报警系统,通过安全中心收集第三方发现的安全问题,组织各部门对已经发现的安全问题进行修复、影响面评估、事后安全原因追查。

运维工作发展过程

早期的运维团队在人员较少的情况下,主要是进行数据中心建设、基础网络建设、服务器采购和服务器安装交付工作。几乎很少涉及线上服务的变更、监控、管理等工作。

这个时候的运维团队更多的属于基础建设的角色,提供一个简单、可用的网络环境和系统环境即可。

随着业务产品的逐渐成熟,对于服务质量方面就有了更高的要求。这个时候的运维团队还会承担一些服务器监控的工作,同时会负责 LVS、Nginx 等与业务逻辑无关的 4/7 层运维工作。

这个时候服务变更更多的是逐台的手工操作,或者有一些简单批量脚本的出现。监控的焦点更多的在服务器状态和资源使用情况上,对服务应用状态的监控几乎很少,监控更多的使用各种开源系统如 Nagios、Cacti 等。

由于业务规模和复杂度的持续增加,运维团队会逐渐划分为应用运维和系统运维两大块。应用运维开始接手线上业务,逐步开展服务监控梳理、数据备份以及服务变更的工作。

随着对服务的深入,应用运维工程师有能力开始对服务进行一些简单的优化。同时,为了应对每天大量的服务变更,我们也开始编写各类运维工具,针对某些特定的服务能够很方便的批量变更。

随着业务规模的增大,基础设施由于容量规划不足或抵御风险能力较弱导致的故障也越来越多,迫使运维人员开始将更多的精力投入到多数据中心容灾、预案管理的方向上。

业务规模达到一定程度后,开源的监控系统在性能和功能方面,已经无法满足业务需求;大量的服务变更、复杂的服务关系,以前靠人工记录、工具变更的方式不管在效率还是准确性方面也都无法满足业务需求。

在安全方面也出现了各种大大小小的事件,迫使我们投入更多的精力在安全防御上。逐渐的,运维团队形成之前提到的 5 个大的工作分类,每个分类都需要有专精的人才。

这个时候系统运维更专注于基础设施的建设和运维,提供稳定、高效的网络环境,交付服务器等资源给应用运维工程师。应用运维更专注于服务运行状态和效率。

数据库运维属于应用运维工作的细化,更专注于数据库领域的自动化、性能优化和安全防御。运维研发和运维安全提供各类平台、工具,进一步提升运维工程师的工作效率,使业务服务运行得更加稳定、高效和安全。

我们将运维发展过程划分为 4 个阶段,如图 1-2 所示。

image.png

手工管理阶段:业务流量不大,服务器数量相对较少,系统复杂度不高。对于日常的业务管理操作,大家更多的是逐台登录服务器进行手工操作,属于各自为战,每个人都有自己的操作方式,缺少必要的操作标准、流程机制,比如业务目录环境都是各式各样的。

工具批量操作阶段:随着服务器规模、系统复杂度的增加,全人工的操作方式已经不能满足业务的快速发展需要。因此,运维人员逐渐开始使用批量化的操作工具,针对不同操作类型出现了不同的脚本程序。

但各团队都有自己的工具,每次操作需求发生变化时都需要调整工具。这主要是因为对于环境、操作的规范不够,导致可程序化处理能力较弱。此时,虽然效率提升了一部分,但很快又遇到了瓶颈。

操作的质量并没有太多的提升,甚至可能因为批量执行而导致更大规模的问题出现。我们开始建立大量的流程规范,比如复查机制,先上线一台服务器观察 10 分钟后再继续后面的操作,一次升级完成后至少要观察 20 分钟等。

这些主要还是靠人来监督和执行,但在实际过程中执行往往不到位,反而降低了工作效率。

平台管理阶段:在这个阶段,对于运维效率和误操作率有了更高的要求,我们决定开始建设运维平台,通过平台承载标准、流程,进而解放人力和提高质量。

这个时候对服务的变更动作进行了抽象,形成了操作方法、服务目录环境、服务运行方式等统一的标准,如程序的启停接口必须包括启动、停止、重载等。通过平台来约束操作流程,如上面提到的上线一台服务器观察 10 分钟。

在平台中强制设定暂停检查点,在第一台服务器操作完成后,需要运维人员填写相应的检查项,然后才可以继续执行后续的部署动作。

系统自调度阶段:更大规模的服务数量、更复杂的服务关联关系、各个运维平台的林立,原有的将批量操作转化成平台操作的方式已经不再适合,需要对服务变更进行更高一层的抽象。

将每一台服务器抽象成一个容器,由调度系统根据资源使用情况,将服务调度、部署到合适的服务器上,自动化完成与周边各个运维系统的联动,比如监控系统、日志系统、备份系统等。

通过自调度系统,根据服务运行情况动态伸缩容量,能够自动化处理常见的服务故障。运维人员的工作也会前置到产品设计阶段,协助研发人员改造服务使其可以接入到自调度系统中。

在整个运维的发展过程中,希望所有的工作都自动化起来,减少人的重复工作,降低知识传递的成本,使我们的运维交付更高效、更安全,使产品运行更稳定。对于故障的处理,也希望由事后处理变成提前发现,由人工处理变成系统自动容灾。

SRE

SRE 到底是干什么的??

有很多人问过我想了解一下 SRE 这个岗位,这是个很大的话题,在这篇博客中把想到的一些介绍一下吧。

SRE 到底是什么?这是一个最早由 Google 提出的概念,我的理解是,用软件解决运维问题。标准化,自动化,可扩展,高可用是主要的工作内容。这个岗位被提出的时候,想解决的问题是打破开发人员想要快速迭代,与运维人员想要保持稳定,拒绝频繁更新之间的矛盾。

SRE 目前对于招聘来说还是比较困难。一方面,这个岗位需要一定的经验,而应届生一般来说不会有运维复杂软件的经历;另一方面就是很多人依然以为这就是“运维”工程师,认为做的是一些低级重复的工作,对这个工作有排斥。最根本的,其实这个岗位寻找的要么是具有运维经验的开发人员,要么是具有软件开发技能的运维工程师。所以比较难以找到合适的人。

在现实生活中,不同公司的 SRE 岗位大有不同,有一些甚至可能还是传统运维的名字换了一个岗位名称。

比如蚂蚁金服有两种 SRE,一种是负责稳定性的,就是大家所理解的 SRE;另一种叫做资金安全 SRE,并不负责服务正常运行,而是负责金钱数目正确,对账没有错误,工作内容以开发为主,主要是资金核对平台和核对规则(没有做过,只是个人理解)。某种意义上说,已经不算是 SRE 而是专业领域的开发了。

Netflix[1] (2016 年)的模式是谁开发,谁维护。SRE 负责提供技术支持,和咨询服务。Netflix 在全球 170 个国家有服务,Core SREs 只有 5 个人。

微软有专门的 Game Streaming SRE[2],负责 XBox 在线游戏的稳定性。

所以不同公司的 SRE 的内容各有偏重,取决于公司要提供什么样的服务。

我们可以学习网络分层的方式,将 SRE 大致的工作内容从下往上分成 3 个大类:

  1. Infrastructure:主要负责最基础的硬件设施,网络,类似于 IaaS,做的事情可参考 DigitalOcean
  2. Platform:提供中间件技术,开箱即用的一些服务,类似于 PaaS,做的事情可参考 Heroku, GCP, AWS 等
  3. 业务 SRE:维护服务,应用,维护业务的正常运行

Infrastructure

Infrastructure 和 Platform SRE 其实可有可无,这些年商业化的服务其实越来越多了,比如,如果公司选择全部在 AWS 部署自己的服务的话,那么就不需要自己建立 Datacenter,维护网络之类的工作了,只需要几个 AWS 专家即可。

如果有的话,工作内容也可大可小。可以从管理购买的 VPS 开始,也可以从采购硬件服务器开始。

我觉得 Infrastructure SRE 的工作内容可以这样定义:

  1. 负责服务器的采购,预算,CMDB 管理。要知道(能查询到)每一台的负责人是谁,在干什么。这个非常重要,如果做不好,会造成极大的资源浪费。
  2. 提供可靠软件的部署环境,一般是虚拟机,或者 bare mental。
  3. 操作系统的版本统一维护,Linux 发行版的版本,Kernel 的版本等。
  4. 维护机器上的基础软件,比如 NTP,监控代理,其他的一些代理。
  5. 提供机器的登录方式,权限管理,命令审计。
  6. 维护一套可观测性的基础设施,比如监控系统,log 系统,trace 系统。
  7. 维护网络,大公司可能都会自己设计机房内的网络。其中包括:
  8. 网络的连通,这个是必要的。对于上层用户(Platform SRE)来说,交付的服务应该是任意两个 IP 是可以 ping 通的,即管理好 3 层以下的网络。
  9. NAT 服务
  10. DNS 服务
  11. 防火墙
  12. 4 层负载均衡,7 层负载均衡
  13. CDN
  14. 证书管理

每一项既可以是一个很大的团队,也可以只有一个人去对商业化的 Infra 服务。可以使用开源的产品,也可以自己研发。

Platform SRE

Infrastructure SRE 维护的是基础设施,Platform SRE 使用他们提供的基础设施建立软件服务,让公司内的开发者可以使用开箱即用的软件服务,比如 Queue,Cache,定时任务,RPC 服务等等。

主要的工作内容有:

  1. RPC 服务:让不同的服务可以互相发现并调用
  2. 私有云服务
  3. 队列服务,比如 Kafka 或者 RabbitMQ
  4. 分布式的 cronjob 服务
  5. Cache
  6. 网关服务:反向代理的配置
  7. 对象存储:s3
  8. 其他一些数据库:ES,mongo 等等。一般来说,关系型数据库会有 DBA 来运维,但是 NoSQL 或者图数据库一般由 SRE 维护。
  9. 内部的开发环境:
  10. SCM 系统,比如自建的 Gitlab
  11. CI/CD 系统
  12. 镜像系统,比如 Harbor
  13. 其他的一些开发工具,比如分布式编译,Sentry 错误管理等等
  14. 一些离线计算环境,大数据的服务

业务 SRE

有了 Platform SRE 的支持,开发人员写代码就基本上不需要关心部署的问题了。可以专注于开发,使用公司开箱即用的服务。这一层的 SRE 更加贴近于业务,知道业务是怎么运行的,请求是怎么处理的,依赖了哪些组件。如果 X 除了问题,可以有哪些降级策略。参与应用的架构设计,提供技术支持。

主要的工作内容有:

  1. 参与系统的设计。比如熔断、降级,扩容等策略。
  2. 做压测,了解系统的容量。
  3. 做容量规划。
  4. 业务侧的 Oncall。

对于一个专业的 SRE 来说,上述技能也不应该有明显的界限,比如说业务 SRE 也需要掌握一些网络技能,Infra SRE 也要写一些代码。很多工具每一个岗位的人都多少用的到,比如 Ansible/Puppet/SaltStack 这种 IT 自动化工具,或者 Grafana/Prometheus 这种监控工具,只有理解才能用的正确。换个角度讲,对于业务 SRE 来说,虽然基本上不会去管理四层以下的网络,但是如果遇到网络问题,能通过已有的工具和权限排查到交换机问题,去找 Infra SRE 帮忙:“请帮我看下 xx IP 到交换机是否有异常,因为 xxx 显示的结果是 xx”,总比 “我怀疑 xx 有网络问题,请帮忙排查下” 要好一些吧?

以上是工作职责的大体划分,这个分层其实没有什么意义,倒是可以让读者了解一下 SRE 都涉及哪一些工作。

下面是一些日常的工作内容。

部署服务

部署分成两种:

  1. Day 1:将服务部署上线的那一天
  2. Day 2+:服务部署之后,还会进行很多更新,升级,配置更改,服务迁移等等

Day2+ 的工作要做很多次,Day 1 做的很少,在不断的迭代升级之后,还能保证有一个可靠的 Day 1 操作是很难的。换句话说,我们在服务部署之后一直改来改去,还要保证这个服务在一个全新的环境能够可靠的部署起来。部署环境的硬编码,奇奇怪怪的 work around,都会破坏 Day 1 的可靠性。之前一家公司,扩容一个新机房的过程简直是噩梦,太多的奇怪配置,hardcode,导致踩过无数个坑才能在一个新的机房部署起来全部的服务。

Day2+ 的操作也不简单,主要要关注稳定性。对于重要的变更操作要设计好变更计划,如何做到灰度测试,如果出了问题应该如何回滚,如何保证回滚可以成功(如何测试回滚)等等。

部署的操作最好都是可以追踪的,因为并不是所有会引起问题的操作都会立即引起问题。比如一个操作当时做完没有什么问题,但是过了 1 个月,偶然的重启或者内存达到了某一个指标触发了问题。如果能记录操作的话,我们可以回溯之前做过的变更,方便定位问题。现在一般都用 git 来追踪部署过程的变更(gitops[3])。

Oncall

Oncall 简单来说就是要保证线上服务的正常运行。典型的工作流程是:收到告警,检查告警发出的原因,确认线上服务是否有问题,定位到问题,解决问题。

收到告警并不总意味着真正的问题,也有可能告警设置的不合理。告警和监控面板并不是一个静态的配置,它应该是每天都在变化的,时刻在调整的。如果发现没有标志真正线上问题的告警发了出来,就应该修改告警规则。如果发现当前的监控无法快速定位问题,应该调整监控面板,添加或者删除监控指标。业务在发展,请求量在变化,某些阈值也需要不断地调整。

定位问题没有一概而论的方法了,需要根据看到的实时,结合自己的经验,然后做推测,然后使用工具验证自己的推测,然后确定问题的根因。

但是解决问题是可以有方法论的,叫做 SOP,标准操作流程[4]。即:如果出现了这种现象,那么执行那种操作,就可以恢复业务。SOP 文档应该提前制定,并且验证其有效性。

需要注意的是上述定位问题、解决问题并没有顺序关系。一个经常犯的错误是,在出现故障的时候,花了很长时间定位到故障的根因,然后再修复。这样花的时间一般会比较长。正确的做法是先根据现象看现有的 SOP 能否恢复业务。比如说当前错误只发生在某一个节点上,那么就直接下线这个节点,具体的原因后面再排查。恢复当前的故障永远是第一要务。但是恢复操作也要经过测试,比如猜测可以通过重启解决问题的话,可以先重启一台做测试,而不是一次性将所有服务重启。大部分情况是需要临场分析的,是一个紧张又刺激的过程。

故障到底多久恢复算好?出现多少故障是可以容忍的?怎么标志服务的稳定性到底如何?我们使用 SLI/SLO 来衡量这些问题。

制定和交付 SLI/SLO

维护服务等级协议,听起来像是一个非常简单的事情,只要“设定一个可用率”然后去实现它就好了。然而现实的情况并不是。

比如,制定可用率的时候,并不是说我们去“实现 4 个 9”(99.99% 的时间可用)就够了,我们有以下问题要考虑:

  1. 如何定义这个可用率?比如我们以可用率 > 99.9% 为目标,有一个服务部署了 5 个 Zone, 那么有一个 Zone 挂了,其余的 Zone 是可用的,那么可用率被破坏了吗?这个可用率是每一个 Zone 的还是所有的 Zone 一起计算的?
  2. 可用率计算的最小单位是什么?如果 1min 内有 50s 没有达到可用率,那么这一分钟算是 down 还是 up?
  3. 可用率的周期是怎么计算的?按照一个月还是一个周?一个周是最近的 7 天还是计算一个自然周?
  4. 如何对 SLI 和 SLO 做监控?
  5. 如果错误预算即将用完,有什么措施?比如减少发布?如果 SLI 和 SLO 没有达到会怎么样?

等等,如果这些问题不考虑清楚的话,那么 SLI 和 SLO 很可能就是没有意义的。SLI/SLO 也适用于对公司内部用户的承诺,让用户对我们的服务有预期,而不能有盲目的信任。比如 Google 在 SLI/SLO 还有预算的时候,会在满足 SLI/SLO 的时候自行对服务做一些破坏,让用户不要对服务有 100% 可用的错误预期。SLI/SLO 也会让 SRE 自己对当前服务的稳定性有更好的认识,可以根据此调整运维、变更、发布计划。

故障复盘

故障复盘的唯一目的是减少故障的发生。有几个我目前认为不错的做法。

故障复盘需要有文档记录,包括故障发生的过程,时间线的记录,操作的记录,故障恢复的方法,故障根因的分析,为什么故障会发生的分析。文档应该隐去所有当事人的姓名对公司的所有人公开。很多公司对故障文档设置查看权限,我觉得没什么道理。有些公司的故障复盘甚至对外也是公开的[5]。

故障在复盘的时候应该将当事人的名字用代码替代,可以营造更好的讨论氛围。

不应该要求所有的故障复盘都产生 Action。之前一家的公司的故障复盘上,因为必须给领导一个“交待”,所以每次都会产生一些措施来预防相同的故障再次发生,比如增加审批流程之类的。这很扯,让级别很高的领导审批他自己也看不懂的操作,只能让领导更痛苦,也让操作流程变得又臭又长,最后所有人都会忘记这里为什么会有一个审批,但是又没有人敢删掉。你删掉,出了事情你负责。

Blame Free 文化?之前我认为是好的。但是后来发现,有些不按照流程操作导致的问题确实多少应该 Blame 一下,比如下线服务的时候没有检查还没有 tcp 连接就直接下线了,或者操作的时候没有做 canary 就全部操作了,这种不理智的行为导致的故障。但是条条框框又不应该太多,不然活都没法干了。

容量规划

容量规划是一个非常复杂的问题,甚至有一些悖论。容量要提前做好规划,但是容量的规划需要知道业务的扩张速度,扩张速度这种事情又不是提前能计划好的。所以我一直觉得这个事情很难做,也一直没有见过做的很好的例子。

但是至少可以对维护的系统建立一个模型,知道多少机器,多少资源,能容纳多少容量。这样遇到大促之类的活动也能及时估算需要的资源数量。

用户支持

用户支持也是日常的一部分。包括技术咨询,以及用户要求的线上问题排查。

这里就需要提到文档的重要性了。如果没有维护好文档,那么用户就会一遍又一遍问相同的问题。写文档也是一个技术活,优秀的需要很长时间的积累。文档也需要经常更新。我一般会这样,保持这样一种状态:用户可以不需要任何人就从文档中找到他需要的所有答案。如果我发现用户的问题无法从文档中找到,或者难以找到在文档中的什么地方,就会更新文档,或者重新组织文档。如果用户的问题已经从文档中找到,那么就直接发文档给他。如果用户的问题显然是文档看都没有看过(有很多人根本不看文档的,只看文档是谁写的然后径直去问这个人),就直接忽略。

优秀的文档应该尽量引入少的专有名词,少使用没有用处的专业词汇描述,只描述具有指导意义的事实,假定用户没有相关的背景知识,列举使用例子,举一些现实会用到的例子而不是强行举例子,明确 Bad Case。等等。这其实是一个很大的话题了,这里就不展开了。

暂时就想到这一些了。下面写一些我经常见到的误解,和经常被别人问的问题。

有关做项目没有专业团队得不到训练。

这方面是听到最多的抱怨。虽然说 SRE 在工作上应该是开发时间和运维时间各 50%,但是真实的情况是,即使 SRE 有一些开发工作,也大部分是面向内部用户,面向公司内部的开发者的。大部分项目是一些想法,需要去尝试一下行不行,基本上不会有专业的设计资源,PM 资源。这种项目就需要 SRE 有多方面的技能,包括对产品的理解,清楚地知道它有什么痛点,最好是自己经历过的痛点,然后需要懂设计,管理好开发进度。然而这种人非常少。其实能写中型项目代码的 SRE 就已经非常少了。所以大部分公司内部项目都会做的又难用又复杂。

即使是有专业配套 PM 和设计,甚至前端资源。基本上也是一个灾难。我也经历过这样的团队。这种内部项目对标的不是互联网项目,而更像是 toB 的项目。用户 UI 的设计,交互逻辑,操作流程,交付周期等需要的都是另一个领域的知识。否则的话人越多,也只会徒增沟通成本,拖慢项目进度。

回到经常听到的这个抱怨,说在 SRE 的团队没有像开发团队那样有“正规军”,有设计和 PM,大家各司其职,后端开发只要对齐 API 然后实现就好了。大部分的应届生会有这样的幻想,但实际上不是这样。被搞错的最重要的一点是,学习主要是靠自己的,和别人没有太大的关系。我觉得可能是在一个大团队里面,有很多人一起做一件事情,心里的怀疑和焦虑会少一点,人们会对这样的工作状态感到踏实,误以为是“成长”,自己做所有的工作焦虑更多。

事实是,在大团队工作可能学到更多的沟通技能,比如和不同的人对齐不同的阶段工作目标,要想要学到其他的东西还是要靠自己。比如拿到一个设计,如果照样子去实现了,其实不会学到什么东西。而要去理解为什么这么设计,为什么不那么设计。如果自己去做,思考的过程也基本是这样的,可以怎么设计,选择什么好。都是:思考,选择,尝试,经验,思考……

另一个需要澄清的误区是,模仿并不是学习。在团队中经历了一个设计,如果记住了这个设计,下次碰到类似的问题也用这个设计去解决。这也不能叫做是学习。我见过有在业务部门做过支付的 SRE 写的代码,在内部系统中去实现了订单业务的订单、交易等概念完成一个运维流程,甚至 Model 的名字都没改过。拿着锤子找钉子,会让系统变得更加糟糕和复杂。

总之,工作分的细并不代表工作就会更加专业。一个人身兼数职业可以在每一个方面做得很专业。重要的是不断学习,使用正确的做事方式,向优秀的项目和优秀的开发者学习。

有关脏活累活。

每一项工作都会有脏活累活:学不到什么东西,做起来没有意思。可能是整理系统的监控,可能是整理现有的文档,可能清理一些年久的运维脚本,可能是需要和不同的团队做一些沟通工作[6]等。

这是不可避免的,如果可以的话,学会从每一项工作中找一些偷懒的方法吧,比如用脚本处理一些工作,用更聪明的方式工作等等。

但是如果这种工作的比例太高的话,就要思考工作方式的问题了。如果陷入恶性循环,看能不能从工具和工作流程上做一些改变。如果不能的话,考虑换一份工作吧。

有关背锅。

互相甩锅的工作环境无疑是非常糟糕的工作环境。如果相同的团队、或者不同的团队之间需要相互勾心斗角的话,如果工作环境不允许大方承认(SRE 无可避免地会犯一些错误)自己的错误,说明公司营造的氛围有问题。比如某些公司规定,发生 P1 级别的错误就必须开除一个 Px 级别的员工,发生 P0 级别的错误就必须开除一个 Py 级别的员工一样。如果是这种情况的话,公司实际上是在用一种懒惰地方法通过提高人的压力来提高系统的稳定性。有没有效果不知道,但是确定的是不会有人在这种情况下工作的开心。建议换一份工作。

如何转行?

其实难度没有想象的高,毕竟大学里面没有一个叫做 SRE 的专业。SRE 要求的知识也是编写代码、设计系统、了解操作系统和网络等。所以在大学里面将本科的课程好好学好,尝试做(并维护)一些自己的项目,毕业的时候基本上就满足要求了。非科班的人要转行的话,也可以参考大学的课程内容去补足这方面的知识。

需要注意的是,培训班出来的做开发完成业务可能够,但是做 SRE 远远不够。SRE 不仅需要 make things work,还要知道背后的原理。

面试会问什么?

我觉得和后端开发的面试内容基本上差不多。

如果是去应聘的这个岗位所需要的一些技能,比如 K8S,监控系统等,可能也会问一些领域内的知识。虽说这部分工具性的东西都可以学习,但是如果人家要一个经验丰富的、或者入职就能干活的,那么面试成功的机会就会小很多。当然,也不必沮丧,这是市场的供需关系决定的,如果对方执意要找符合特定要求的候选人,那么对方的选择的范围也会小很多,不必因为错失了这种机会而后悔没去学习什么工具。话又说回来,技能越多,选择也会越多。

排查错误可能是转行做 SRE 最大的一个门槛,这个需要一些经验。如果没有经验的话,就补足一些操作系统的知识,这样遇到未知的问题也可以通过已知的知识和工具去排查。

做 SRE 需要会写代码吗?

会,而且写代码的要求并不会比一个专业的后端开发低。

选择大公司还是小公司?

这属于两种截然不同的工作环境。小公司一般都有一个救火英雄式的人物,在公司的时间比较长,知道所有组件的部署结构,什么都懂。跟着这种人学习会成长很快。

大公司细分领域很多。本文前面列出的内容可能每一项在大公司中都是一个团队,对某个领域可以深入研究。

所以还是看想要做什么了。我个人比较喜欢靠谱的小公司,或者大公司中靠谱的小团队。

如何判断一家公司是否靠谱?

对于 SRE 这个职位,我总结了一些判断的技巧。比如可以判断一下对方目前的业务和 SRE 员工的数量是否处于一个“正常”的状态,人数是否在随着业务(机器的数量)现象增长?这是一个不好的迹象。是否 SRE 的数量过多?如果 SRE 人太多,有两个可能的原因:1)某个领导为了扩大自己的影响力在为一些“不必要的”岗位招人,这样会导致人多事少,大家开始做一些奇奇怪怪的事情,发明奇奇怪怪的需求,以各种各样的方式浪费自己的时间来领公司的工资;2)这个公司的基础太差,大部分工作都是需要人力运维,导致基本上有多少机器就需要多少人。总之,都不是什么好事情。

一些技术比较好的公司,都没有庞大的 SRE 队伍,比如 Instagram, Netflix(现在可能人数不少了),以及一些创业公司,甚至都可以没有专门的 SRE,优秀的 SRE 首先要是开发者,优秀的开发者也离 SRE 不远了。一些耳熟能详的服务,比如 webarchive 这样的数据量,其实背后也只有几个人在维护[7]。前几年面试了国内的一家公司,在机房遍布全球,业务已经发展的比较庞大(上市了)的时候,SRE 团队也只有 10 个人。

另外我比较喜欢问的一个问题是对方关于 AIOps 怎么看。因为我之前搞了两年这个东西,最后得到的结论是,这基本上是个浪费时间、欺骗上层领导的东西[8]。AI 这东西的不可解释性本质上就和运维操作将就因果相违背的。所以经常喜欢问面试官怎么看这个技术,基本上就可以判断靠不靠谱。当然了,这是我个人的职业阴影导致的后遗症,只能代表个人意见。

就说这么多吧,都是一些个人理解,不一定对。写这篇文章感觉自己好像指点江山一样,其实我自己也干了才几年而已,所以本文内容仅供参考。如果有什么问题可以在评论提出,我能回答的话就尽量回答。

引用链接

[1]Netflix: https://www.youtube.com/watch?v=koGaH4ffXaU

[2]Game Streaming SRE: https://azure.microsoft.com/mediahandler/files/resourcefiles/devops-at-microsoft-game-streaming-sre/DevOps%20at%20Microsoft%20-%20Xbox%20game%20streaming%20SRE.pdf

[3]gitops: https://www.weave.works/technologies/gitops/

[4]SOP,标准操作流程: https://en.wikipedia.org/wiki/Standard_operating_procedure

[5]对外也是公开的: https://github.com/danluu/post-mortems

[6]一些沟通工作: https://www.kawabangga.com/posts/4294

[7]背后也只有几个人在维护: https://archive.org/details/jonah-edwards-presentation

[8]是个浪费时间、欺骗上层领导的东西: https://www.kawabangga.com/posts/4145


最后修改 September 9, 2024: perf (65cb84d7)