《SRE Google 运维解密》第3章讲了拥抱风险,一些关键的观点,在这里与大家分享,融入了我自己的一些理解,希望对你有些帮助。

服务可用性必须100%?其实完全没必要

一个服务客户的产品,不需要追求极端的可用性,因为实在是没有必要。比如一个论坛服务,用户使用智能手机来访问,手机本身有可能故障,手机的蜂窝网络可能出问题,如果用的 wifi 本地路由器可能出问题,小区宽带可能出问题,运营商的骨干网可能出问题,这些都不是论坛服务能够控制的。简单来说,用户在一个有着 99% 可靠性的智能手机上,是不能分辨出 99.99% 和 99.999% 的服务可靠性的区别的。

高可靠性带来高成本

99.99% 的可用性,每年不可用时长不能超过 53 分钟,如果是 99.999% 的可用性,每年不可用时长不能超过 5.3 分钟。多了一个 9,不可用时长只是缩减了 47.7 分钟,但是付出的成本可能是巨大的,需要衡量 ROI 是否值得。成本通常来自两个方面:

  • 冗余物理服务器/计算资源的成本
  • 机会成本

机会成本是说,我们把过多的人力投入到稳定性建设上了,导致投入到业务功能开发的人力就变少了,这个机会成本是很难估量的,但是很重要。

如何度量可用性

通常的做法是按照计划外停机时间来度量,比如:

可用性 = 系统正常运行时间 / (系统正常运行时间 + 系统计划外停机时间)

这个计划外停机时间,通常是指系统不可用的时间,比如系统崩溃了,或者系统的某个功能不可用了,或者系统的某个功能的性能下降了,都可以算作计划外停机时间。与计划外停机时间相对的,显然是计划内停机时间,偶尔通知用户,说凌晨3点我会做系统升级,计划停机3分钟,这个3分钟就是计划内停机时间,这3分钟内的不可用,不影响SLA。

但是,很多系统都是分布式的,尤其是 Google,一个服务,通常不会完全不可用,可能某个 region 不可用,但是其他 region 还可用,所以,大型互联网公司的服务通常是不会 100% 不可用的,可能会部分不可用,此时这个计划外停机时间就不好计算了。怎么办?使用请求数量来统计,可用性计算公式变成:

可用性 = 成功请求数 / 总的请求数

这是服务可用性的度量方法,一个大型互联网公司可能有几千个微服务,老板问技术团队,咱们今年的可用性如何?显然没法使用服务层面的数据,那就把众多微服务做个加权平均?也不那么说得通!那公司整体业务的 SLO 应该怎么算?一般是看业务指标,分享一下滴滴的做法,滴滴最核心的业务就是打车,核心就看打车的订单量,如果订单量下跌 10%,就开始计算不可用时长,这是整个公司最重要的可用性指标。这种指标称为北极星指标,我们现在创业就专门做了一个北极星指标的产品,对北极星指标做 VIP 级别的保障。详情可以了解这里

谁来制定SLO?

在 Google,对于服务于终端用户的产品,通常有个产品技术团队,是这个服务的「商业所有者」,这个团队明确知道自己的商业目标,可以拍板 SLO。因为:SLO 最终是服务于商业目标的!

通常来讲,线上 70% 的故障是变更导致的,更好的 SLO 意味着线上变更的频率会降低,但是低频的变更,就意味着有些功能 feature 不能尽快发布给终端用户,终端用户的体验就会变差,竞争对手可能有更花哨好用的功能,我们无法及时跟进。那好,那就更快的变更,更快的变更通常意味着稳定性变差,所以就需要权衡了,这本质上是一个商业取舍,所以,需要商业所有者来拍板。而这个商业所有者,对于服务于终端用户的产品,通常就是产品团队,最终可能是这个业务的负责人最终拍板。

服务于内部的基础设施,比如 BigTable 这样的服务,没有终端用户,那谁来拍板?基础设施类服务,通常是服务于内部其他服务的,此时应该是 BigTable 的研发团队和上游服务所有者一起拍板,制定 SLO。

BigTable 可能同时服务两类上游服务,举例:一类上游服务是面向终端用户的,他们需要更低的延迟,另一类上游服务可能是离线任务,在 BigTable 里存储离线分析数据,他们需要更大的吞吐。低延迟的上游服务希望 BigTable 的请求队列(几乎总是)为空,这样系统可以立刻处理每个出现的请求。而离线分析的上游服务,需要更高的吞吐,希望 BigTable 繁忙,希望请求队列永远不为空。如果拿请求队列长度作为 SLO,就尴尬了...

所以,对于差异化要求比较大的基础设施,通常会拆分成不同的集群,提供不同维度的 SLO。

提升 SLO 的时候要注意 ROI

举个例子,假设某个服务每一个请求的价值是一样的:

  • 可用性目标希望从 99.9% 提升至 99.99%
  • 增加的可用性:0.09%
  • 服务收入:100万美金
  • 改进可用性后的价值:100万 * 0.09% = 900 美金

可用性提升一个 9,收益是 900 美金,如果提升一个 9 的成本低于 900 美金,就是划算的,如果高于 900 美金,就是不划算的。

SLO和错误预算构建过程

  • 产品管理层定义一个 SLO,确定一项服务在每个季度预计的正常运行时间
  • 实际在线时间是通过一个中立的第三方来测算的:我们的监控系统
  • 这两个数字之间的差值就是这个季度中剩余的不可靠性预算
  • 只要测算出的正常在线时间高于 SLO,也就是说,只要仍然有剩余的错误预算,就可以发布新的版本

扩展阅读

SRE心里话:要求100%服务可用性就是老板的无知的更多相关文章

  1. Kubernetes 服务部署最佳实践(二) ——如何提高服务可用性

    引言 上一篇文章我们围绕如何合理利用资源的主题做了一些最佳实践的分享,这一次我们就如何提高服务可用性的主题来展开探讨. 怎样提高我们部署服务的可用性呢?K8S 设计本身就考虑到了各种故障的可能性,并提 ...

  2. 数据一致性(consistency)、服务可用性(availability)、分区容错性(partition-tolerance)

    数据一致性(consistency).服务可用性(availability).分区容错性(partition-tolerance) 分布式系统理论基础 - CAP 2016-04-04 18:27 b ...

  3. SLA服务可用性怎么达到?

    SLA:服务等级协议(简称:SLA,全称:service level agreement).是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定.通常这个开销是驱动提供服 ...

  4. LA服务可用性4个9是什么意思?怎么达到?

    SLA:服务等级协议(简称:SLA,全称:service level agreement).是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定.通常这个开销是驱动提供服 ...

  5. SLA服务可用性4个9是什么意思?怎么达到?

    SLA:服务等级协议(简称:SLA,全称:service level agreement).是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定.通常这个开销是驱动提供服 ...

  6. 浑身尖刺的服务可用性守护者——hystrix熔断器实践记录

    netflix公司的产品hystrix(长满刺的豪猪),在高可用目标下具有一定熔断.限流.降级的作用.这里主要写一些自己在使用时的问题解决思路,原理请自行理解,包括线程池与信号量模式等. 注意三个参数 ...

  7. Pod 健康检查和服务可用性检查

    Kubernetes 对 Pod 的健康状态可以通过两类探针来检查:LivenessProbe 和 ReadinessProbe,kubelet 定期执行这两类探针来针对容器的健康状况. Livene ...

  8. zabbix通过invoke调用监控服务可用性

    1. 通过脚本判断线上服务是否可用 telnet 127.0.0.1 端口 #线上调用的是使用的dubbo端口 通过invoke 抓取返回的code值,脚本如下 #返回code:0则视为正常,返回其他 ...

  9. 详解GaussDB(for MySQL)服务:复制策略与可用性分析

    摘要:本文通过介绍GaussDB(for MySQL)读写路径,分析其可用性. 简介 数据持久性和服务可用性是数据库服务的关键特征. 在实践中,通常认为拥有 3 份数据副本,就足以保证持久性. 但是 ...

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

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

随机推荐

  1. 力扣467(java)-环绕字符串中唯一的子字符串(中等)

    题目: 把字符串 s 看作是 "abcdefghijklmnopqrstuvwxyz" 的无限环绕字符串,所以 s 看起来是这样的: "...zabcdefghijklm ...

  2. 阿里云贾扬清:大数据+AI工程化,让数据从「成本」变为「资产」

    简介: 近年来,数字经济发展迅速,企业转型背后频频涌现「数字力量」的身影.云计算.大数据.人工智能的快速融合形成了数字经济的新基建,也为数字经济发展带来了新的机遇. 5 月 20 日,阿里巴巴副总裁. ...

  3. WPF 多线程下跨线程处理 ObservableCollection 数据

    本文告诉大家几个不同的方法在 WPF 里,使用多线程修改或创建 ObservableCollection 列表的数据 需要明确的是 WPF 框架下,非 UI 线程直接或间接访问 UI 是不合法的,设计 ...

  4. 2019-9-19-dotnet-找不到-PostAsJsonAsync-方法

    title author date CreateTime categories dotnet 找不到 PostAsJsonAsync 方法 lindexi 2019-09-19 14:53:58 +0 ...

  5. 用Vue仿了一个类似抖音的App

    大家好,我是 Java陈序员. 今天,给大家介绍一个基于 Vue3 实现的高仿抖音开源项目. 关注微信公众号:[Java陈序员],获取开源项目分享.AI副业分享.超200本经典计算机电子书籍等. 项目 ...

  6. 【OpenVINO™】基于 C# 和 OpenVINO™ 部署 Blazeface 模型实现人脸检测

     前言 OpenVINO C# API 是一个 OpenVINO 的 .Net wrapper,应用最新的 OpenVINO 库开发,通过 OpenVINO C API 实现 .Net 对 OpenV ...

  7. k8s-nginx实战部署1

    目录 yaml 资源清单 run_deploy.sh .gitlab-ci.yml yaml 资源清单 deploy.yaml apiVersion: v1 kind: ConfigMap metad ...

  8. gin-vue-admin开发教程 01安装与启用

    目录 目标 视频教程地址: 环境要求 前端环境安装文档: 安装node npm cnpm yarn(选装) 后端环境安装文档: Golang1.14.2 环境的安装 goland的配置 gin-vue ...

  9. ansible系列(28)--ansible的playbook异常处理

    目录 1. playbook的异常处理 1.1 Playbook错误忽略 1.2 task执行失败强制调用handlers 1.3 控制Tasks报告状态为OK 1.4 changed_when检查任 ...

  10. Windows server 2012 R2开机进入cmd,关闭后黑屏

    出现此问题,一般只有两种情况,操作系统装置前和操作系统装置后出现: 第一种: 装置操作系统的时候没有选择"Windows Server 2012 R2 Strandard( 带有GUI的服务 ...