阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

Netflix 如何在 7 分钟内完成失效备援

  • 2018-07-23
  • 本文字数:2508 字

    阅读完需:约 8 分钟

2012 年冬季,美国东部区域的 AWS Elastic Load Balancer 服务出现问题,导致 Netflix 出现长达 7 个小时的服务中断。(Netflix 运行在 AWS 上,没有自己的数据中心。除了视频流,用户与 Netflix 的所有交互都是由 AWS 来处理的。用户在点击“播放”按钮后,我们的 CDN 服务器会提供视频内容。)在服务中断期间,所有进入美国东部的流量都无法访问我们的服务。

为了防止这种情况再次发生,我们决定建立一个区域失效备援系统。失效备援是一种计算机系统保护措施,在主系统发生故障时,备用设备自动接管主系统的工作。

区域失效备援降低了风险

我们扩展到三个 AWS 区域:美国两个(美国东部和美国西部),欧盟(EU)一个。我们保留足够的容量来执行失效备援,足以承担单个区域的服务中断带来的风险。

典型的失效备援如下所示:

  1. 发现其中的一个区域出现问题。
  2. 增大“救世主”区域的容量。
  3. 将一些来自问题区域的流量引到救世主区域。
  4. 将 DNS 从问题区域切换到救世主区域。

让我们来详细解释每一个步骤。

  1. 定位问题

我们需要度量指标,最好是一个可以告诉我们系统健康状况的度量指标。在 Netflix,我们使用一种称为每秒流启动量(简称 SPS)的业务度量指标,也就是已成功开始播放节目的客户端数量。

我们按照区域对这些数据进行分区,可以随时绘制出每个区域的 SPS 数据,并将它们与前一天和前一周的 SPS 数据进行比较。如果 SPS 图出现下降,表示用户无法播放流式节目,说明我们遇到麻烦了。

问题不一定出在云基础设施上。Netflix 生态系统由数百种微服务组成,问题有可能是糟糕的代码部署导致的,也有可能是因为海底电缆被切断,等等。我们可能不知道具体的原因,只知道出问题了。



如果只发现一个区域出现 SPS 下降,那么这是进行区域失效备援的最佳时机。如果多个区域都出现 SPS 下降,那我们就不走运了,因为我们一次只能对一个区域进行失效备援。这就是为什么我们要通过交错的方式,每次只在一个区域里部署微服务。如果部署出现问题,我们可以立即回滚,并调试问题。

  1. 加大救世主区域的容量

一旦确定了问题区域,我们就要准备让救世主区域接收问题区域的流量。在打开开关之前,需要适当地加大救世主区域的容量。

在这种情况下,多少容量才合适呢?Netflix 的流量模式在一天当中不是固定不变的。高峰期通常发生在下午 6 至 9 点左右,不过高峰期在不同区域达到的时间是不一样的。美国东部的高峰流量比美国西部要早 3 个小时,比欧盟区域晚了 8 个小时。

在对美国东部进行失效备援时,我们将来自美国东部的流量发送到欧盟区域,将来自南美洲的流量发送到到美国西部。这样做是为了减少延迟,并为客户提供最佳的体验。

我们可以基于每个微服务的历史数据,使用线性回归的方式预测在一天中的某个时间段被发送到救世主区域的流量。

一旦确定了每个微服务需要承担的流量大小,我们就通过设置每个集群的期望流量来触发伸缩,剩下的就是让 AWS 发挥它的魔力。

  1. 重定向流量

现在,微服务集群已经扩展好了,我们开始重定向从问题区域流向救世主区域的流量。 Netflix 开发了一款名为 Zuul 的高性能、跨地域的边缘代理服务器,并已经将它开源。

这些代理服务用于验证请求、对负载进行分片、重试失败的请求等。Zuul 还可以进行跨区域代理。我们用它将流量从问题区域发送出去,并逐渐增加需要重新路由的流量,直到达到 100%。

有了这种渐进式的代理,我们的服务就可以使用自己的伸缩策略进行反应式的伸缩,以便应对预测伸缩和实际伸缩之间存在的流量变化。

Zuul 承担了繁重的工作,将所有来自问题区域的流量转移到救世主区域。接下来是时候放弃问题区域了,而 DNS 切换在这个时候开始闪亮登场。

  1. 切换 DNS

失效备援的最后一步是更新指向问题区域的 DNS 记录,并将它们重定向到救世主区域。这将导致所有的用户流量从问题区域移走,而 DNS 缓存没有过期的客户端仍然被路由到问题区域。

以上就是有关 Netflix 进行失效备援的背景情况。这个过程需要很长时间才能完成——大约 45 分钟(还是在最好的情况下)。



用闪亮的新技术加速这一过程

我们注意到,大部分时间(大约 35 分钟)都花在等待救世主区域的扩容上。尽管 AWS 可以在几分钟内为我们提供新实例,但启动服务、进行预热、在注册 UP 之前处理其他启动任务占用了太多的时间。

我们认为这个时间太长了。我们希望在 10 分钟内完成失效备援,在不增加业务负担的情况下做到这一点,并且把成本控制在一定范围之内。

我们保留所有三个区域的容量,用于容纳失效备援流量。既然我们已经为这些容量付过钱了,为什么不用它们呢?于是,我们启动了 Nimble 项目。

我们的想法是为每个微服务维护一个热备份实例池。当我们准备好进行失效备援时,可以简单地将热备份实例注入到群集中,让它们处理实时的流量。

未使用的预留容量称为槽(trough)。 Netflix 的一些团队使用槽容量来运行批量作业,所以我们不能简单地将所有可用的槽变成热备份。相反,我们可以为每个微服务维护一个影子集群,并为这些影子集群准备足够多的实例,以便在一天当中的某个时间段处理失效备援流量。剩下的实例可用于批处理作业,其他人可以自由使用。

在进行失效备援时,我们并不是通过传统的伸缩方法触发 AWS 为我们提供实例,而是将影子集群中的实例注入到实时集群中。这个过程大约需要 4 分钟,而过去需要 35 分钟。

由于容量注入很快,我们不必谨慎地通过代理来移动流量,以便触发伸缩策略。我们只需要简单地切换 DNS 并打开闸门,就能极大地缩短服务中断的时间。

我们在影子集群中添加了过滤器,防止暗实例发出错误的度量指​​标。错误的度量指标会给度量空间造成混乱,影响正常的运营。

我们还通过修改服务发现客户端来阻止影子集群中的实例自己注册到注册服务上。在触发失效备援之前,这些实例将一直呆在小黑屋中(这当然是一句俏皮话了)。

现在,我们可以在 7 分钟内完成区域失效备援。因为利用了现有的预留容量,所以不会产生任何额外的基础设施成本。用于编排失效备援的软件由三名工程师组成的团队使用 Python 开发。

英文原文: https://opensource.com/article/18/4/how-netflix-does-failovers-7-minutes-flat

感谢张婵对本文的审校。

2018-07-23 18:011457
用户头像

发布了 731 篇内容, 共 433.5 次阅读, 收获喜欢 1997 次。

关注

评论 1 条评论

发布
暂无评论
发现更多内容

第十一周课后练习

饭桶

第11周学习总结

饭桶

每周学点 TARS——服务鉴权功能

TARS基金会

DevOps 后端 鉴权 TARS

今天,我们和人民大学一起干了件大事!

数据君

数据库

云图说|AI开发难!难!难!端云协同多模态AI开发套件你需要了解一下

华为云开发者联盟

AI 分布式协同 开发

量化交易系统APP软件开发(现成)

系统开发

大企软件系统问题多?归乡名企工程师:解决很简单,分分钟做个新系统

Philips

敏捷开发

一不小心,就入选Gartner魔力象限了

数据君

数据库

架构师训练营第 1 期 -week12

习习

如何利用小熊派获取MPU6050六轴原始数据

华为云开发者联盟

物联网 IoT 小熊派

年薪百万offer从何入手?这份“通关面试手册”带你轻松碾压字节面试官

比伯

Java 编程 架构 面试 计算机

人工智能应用实操:手把手教你用Python控制IoT智能硬件

智能物联实验室

物联网 IoT

解析—MyBatis在SpringBoot中动态多数据源配置

比伯

Java 编程 程序员 架构 计算机

Meet new Sentinel Go committers!

阿里巴巴云原生

开源 开发者 云原生 sentinel 中间件

Linux中父进程为何要苦苦地知道子进程的死亡原因?

linux大本营

c++ Linux 后台开发 进程

架构师训练营第 1 期 - 第十一周总结

Todd-Lee

极客大学架构师训练营

详解TCP IP网络协议栈底层原理到徒手实现

赖猫

c++ Linux 编程 程序 网络协议栈

如何在高速发展中等一等老人 银行数字化服务显温度

CECBC

银行 养老服务

阿里 双11 同款流控降级组件 Sentinel Go 正式 GA,助力云原生服务稳稳稳

阿里巴巴云原生

开源 开发者 云原生 中间件 双十一

【硬件篇之电源纹波噪声测试】

良知犹存

硬件

Reactor线程模型浅析

赖猫

c++ Linux 编程 reactor 编程语言

程序员的真实故事

Learun

敏捷开发

架構師訓練營第 1 期 - 第 11 周總結

Panda

架構師訓練營第 1 期

追忆

刘旭东

回忆 情绪

架构师训练营第 1 期 - 第十一周作业

Todd-Lee

极客大学架构师训练营

CloudIDE插件在手,按时下班不愁

华为云开发者联盟

ide Cloud CloudIDE

通用软件快速开发平台对企业信息化的影响

雯雯写代码

软件 快速开发 企业信息化

开源软件联盟PostgreSQL分会投稿指南

PostgreSQLChina

数据库 postgresql 软件 投稿

话题讨论 |程序员35岁被裁,是真的吗?你离35岁还有几年?

Java_若依框架教程

话题讨论

架構師訓練營第 1 期 - 第 11 周作業

Panda

架構師訓練營第 1 期

Gemini双子新约软件系统开发|Gemini双子新约APP开发

系统开发

Netflix如何在7分钟内完成失效备援_架构_Amjith Ramanujam_InfoQ精选文章