首页 存档 技术 查看内容

来自Google的高可用架构理念与实践

2018-3-30 13:00 |来自: 互联网 416 0

摘要: 编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由前 Google SRE 孙宇聪分享。转载请注明来自高可用架构公众号 ArchNotes。 孙宇聪,CTO @ coding.net 。2007 - 2015 年初在 Google 的 Moutain V ...

编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由前 Google SRE 孙宇聪分享。转载请注明来自高可用架构公众号 ArchNotes。


孙宇聪,CTO @ coding.net 。2007 - 2015 年初在 Google 的 Moutain View 担任 SRE 职位。 参与了 Google 的两个项目:第一个是 Youtube,工作内容涵盖 Video transfer、Coding、Streaming、Global CDN 等;第二个是 Google Cloud Platform Team,主要工作是管理 Google 全球 100 万台左右的服务器,开发用于管理 Google 整个云平台的任务调度、协作的集群管理系统 Omega 。

我先做一下自我介绍,我是 07 年加入的 Google,在总部任 SRE,今年年初回到 Coding (http://coding.net) 任 CTO。SRE 的全称是 Site Reliability Engineering ,基本相当于国内的运维,但是更偏开发。

在 Google 我参与了两个比较大的 Project。

第一个是 YouTube,其中包括 Video transcoding,streaming 等。Google 的量很大,每个月会有 1PB 级别的存储量。存储、转码后,我们还做 Global CDN。到 2012 年的时候,峰值流量达到 10 TBps,全球 10 万个节点,几乎每台机器都是 16/24 核跑满, 10G uplink 也是跑满的状态。

然后我加入了 Google Cloud Platform Team, 也就是 Borg 团队。这个团队的主要工作是就是管理 Google 全球所有的服务器,全球大概有 100 万台左右。另外就是维护 Borg 系统,同时我也是 Omega 系统运维的主要负责人,很可惜这个项目最后由于各种各样的原因在内部取消了。

下面我想跟大家分享的是关于可用性、可靠性上面的一些理念和思考。

一、决定可用性的两大因素

谈可用性不需要绕来绕去,大家只谈 SLA 即可。大家可以看下面这个图:


要谈可用性,首先必须承认所有东西都有不可用的时候,只是不可用程度而已。一般来说,我们的观念里一个服务至少要做到 99.9% 才称为基本上可用,是合格性产品。否则基本很难被别人使用。

从 3 个 9 迈向 4 个 9,从 8 小时一下缩短到 52.6 分钟的不可用时间,是一个很大的进步。Google 内部只有 4 个 9 以上的服务才会配备 SRE,SRE 是必须在接到报警 5 分钟之内上线处理问题的,否则报警系统自动升级到下一个 SRE。如果还没有,直接给老板发报警。

大家之前可能听说谷歌搜索服务可用度大概是全球 5 个 9,6 个 9 之间。其实这是一个多层,多级,全球化的概念,具体到每个节点其实没那么高。比如说当年北京王府井楼上的搜索集群节点就是按 3 个 9 设计的。

有关 SLA 还有一个秘密,就是一般大家都在谈年 SLA,但是年 SLA 除了客户赔款以外,一般没有任何实际工程指导意义。 Google 内部更看重的是季度 SLA,甚至月 SLA,甚至周 SLA。这所带来的挑战就更大了。

为什么说看这个图有用,因为 99%、99.9% 是基本可以靠运气搞定的哦。到 3 个 9 可以靠堆人,也就是 3 班倒之类的强制值班基本搞定。但是从 3 个 9 往上,就基本超出了人力的范畴,考验的是业务的自愈能力,架构的容灾、容错设计,灾备系统的完善等等。

说了这么多,作为一个架构者,我们如何来系统的分解“提升 SLA”这一个难题呢。

这里我引入两个工业级别的概念 MTBF 和 MTTR。

MTBF: Mean time between Failures。 用通俗的话讲,就是一个东西有多不可靠,多长时间坏一次。

MTTR: Mean time to recover。意思就是一旦坏了,恢复服务的时间需要多长。

有了这两个概念, 我们就可以提出:


一个服务的可用度,取决于 MTBF 和 MTTR 这两个因子。从这个公式出发,结合实际情况,就很好理清高可用架构的基本路数了。那就是: 要么提高 MTBF, 要么降低 MTTR。除此之外别无他法。

要注意的是,考虑 MTBF 和 MTTR 的时候都不能脱离现实。

理论上来说,作为一个正常人类,收到突发报警、能正确的分析出问题所在、找到正确的解决方案、并且 【正确实施】的时间极限大概是 【两分钟】。这个标准我个人觉得是高到天上去了。作为一个苦练多年的 Oncall 工程师,我 2 分钟能看清报警,上了 VPN,找到 dashboard,就不错了。就算是已知问题,有应对方案,能敲对命令,完全成功,也至少需要 15 - 20 分钟。所以如果按照这个标准的话,管理的服务如果想达到 4 个 9,那么一年只能坏 1 次,2 次就超标了。实现高可用基本靠运气~

回过来接着说说 MTBF 吧。请各位想一下,影响服务MTBF的三大因素!

  1. 发布

  2. 发布

  3. 还是发布!

这个术语上叫 Age Mortality Risk。

一般一个服务只要你不去碰他一年都不会坏一次。更新越频繁,坏的可能性就越大。凡是 Software 都有 BUG,修 BUG 的更新也会引入新的 BUG。发布新版本,新功能是 MTBF 最大的敌人。

二、高可用性方案

说了 MTBF 和 MTTR 这两个定义,那么具体究竟应该如何落地实践来提高可用性呢?

首先说几个大家可能都听腻了的方案

一、提高冗余度,多实例运行,用资源换可用性。

虽然道理很简单,实现起来可不简单,有很多很多细节上的东西需要考虑。

第一个细节:N 2 应该是标配。

N 2 就是说平时如果一个服务需要 1 个实例正常提供服务,那么我们就在生产环境上应该部署 1 2 = 3 个节点。大家可能觉得 N 1 很合理,也就是有个热备份系统,比较能够接受。但是你要想到:服务 N 1 部署只能提供热备容灾,发布的时候就失去保护了。

因为刚才说了, 发布不成功的几率很高!

从另一个角度来讲,服务 N 2 说的是在丢失两个最大的实例的同时,依然可以维持业务的正常运转。

这其实就是最近常说的两地三中心的概念有点像。

第二个细节: 实例之间必须对等、独立。

千万不要搞一大一小,或者相互依赖。否则你的 N 2 就不是真的 N 2。如果两地三中心的一个中心是需要 24 小时才能迁移过去的,那他就不是一个高可用性部署,还是叫异地灾备系统吧。

第三个细节:流量控制能力非常重要。

想做到高可用,必须拥有一套非常可靠的流量控制系统。这套系统按常见的维度,比如说源 IP,目标 IP 来调度是不够的,最好能按业务维度来调度流量。比如说按 API, 甚至按用户类型,用户来源等等来调度。

为什么?因为一个高可用系统必须要支持一下几种场景:

  1. Isolation。A 用户发来的请求可能和 B 用户发来的请求同时处理的时候有冲突,需要隔离。

  2. Quarantine。用户 A 发来的请求可能资源消耗超标,必须能将这类请求钉死在有限的几个节点上,从而顾全大局。

  3. Query-of-death。大家都遇到过吧。上线之后一个用户发来个一个异常请求直接搞挂服务。连续多发几个,整个集群都挂没了,高可用还怎么做到?那么,对这种类型的防范就是要在死掉几台服务器之后可以自动屏蔽类似的请求。需要结合业务去具体分析。

但是想要达到高可用,这些都是必备的,也是一定会遇到的场景。还是那句话,靠人是没戏的。

二、变更管理(Change Management)

还记得影响 MTBF 最大的因子吗?发布质量不提高,一切都是空谈。

第一点: 线下测试(Offline Test)

线下测试永远比线上调试容易一百倍,也安全一百倍。

这个道理很简单,就看执行。如果各位的团队还没有完整的线下测试环境,那么我的意见是不要再接新业务了,花点时间先把这个搞定。这其中包括代码测试、数据兼容性测试、压力测试等等。

台上一分钟,台下十年功。

可用性的阶段性提高,不是靠运维团队,而是靠产品团队。能在线下完成的测试,绝不拍脑门到线上去实验。

第二点:灰度发布

这个道理说起来好像也很普通,但是具体实施起来是很有讲究的。

首先灰度发布是速度与安全性作为妥协。他是发布众多保险的最后一道,而不是唯一的一道。如果只是为了灰度而灰度,故意人为的拖慢进度,反而造成线上多版本长期间共存,有可能会引入新的问题。

做灰度发布,如果是匀速的,说明没有理解灰度发布的意义。一般来说阶段选择上从 1% -

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部