Uber's Failover Architecture: Reconciling Reliability and Efficiency in Hyperscale Microservice Infrastructure

Uber 提出的故障转移架构(UFA)通过根据业务关键性区分服务并引入非关键服务的抢占机制,将稳态资源配比从 2 倍降至 1.3 倍,在消除超过一百万个 CPU 核心的同时,将利用率提升至约 30% 并维持了 99.97% 的高可用性。

Mayank Bansal, Milind Chabbi, Kenneth Bogh, Srikanth Prodduturi, Kevin Xu, Amit Kumar, David Bell, Ranjib Dey, Yufei Ren, Sachin Sharma, Juan Marcano, Shriniket Kale, Subhav Pradhan, Ivan Beschastnikh, Miguel Covarrubias, Chien-Chih Liao, Sandeep Koushik Sheshadri, Wen Luo, Kai Song, Ashish Samant, Sahil Rihan, Nimish Sheth, Uday Kiran Medisetty

发布于 Tue, 10 Ma
📖 1 分钟阅读☕ 轻松阅读

Each language version is independently generated for its own context, not a direct translation.

这篇论文讲述的是 Uber 如何从“花钱买安心”的粗放模式,转型为“精打细算”的聪明模式的故事。

想象一下,Uber 是一个巨大的全球交通调度中心。为了应对任何可能的灾难(比如某个城市的大停电、服务器机房着火),他们过去一直遵循一个极其保守的原则:“双备份”策略

1. 过去的困境:为了安全,一半的卡车在睡觉

以前,Uber 的做法是:

  • 场景:假设 Uber 有 A 和 B 两个巨大的数据中心(就像两个城市)。
  • 旧模式:为了安全,他们规定:无论 A 城发生什么,B 城必须随时准备好接住全世界所有的订单。这意味着,B 城平时只处理自己的一半业务,却必须预留双倍的卡车和司机(服务器资源)来应对 A 城突然瘫痪的情况。
  • 结果:这就好比一家餐厅,为了防备隔壁店倒闭,自己雇了两倍的厨师。但隔壁店很少倒闭,所以一半的厨师每天大部分时间都在无所事事地发呆
  • 代价:这种“双倍容量”模式导致 Uber 的服务器利用率极低(只有 20%),浪费了巨额资金(相当于闲置了 100 万个 CPU 核心)。

2. 核心洞察:灾难其实很少见

Uber 的数据团队做了一个调查,发现了一个惊人的事实:

  • 真正的“全盛期灾难”(即两个城市同时出问题,或者流量达到历史最高峰时发生灾难)一年平均只发生不到 20 个小时
  • 结论:为了这每年 20 小时的极端情况,让 99.9% 的时间都浪费一半的资源,太不划算了!

3. 新方案:Uber 故障转移架构 (UFA)

于是,Uber 设计了一套新的“聪明”系统,叫 UFA。它的核心思想是:分级管理,动态调配

比喻:医院急诊室与候诊区

想象 Uber 的服务器是一个超级大医院

  • T0/T1 级服务(Always-On):这是ICU 里的危重病人(比如叫车匹配、支付)。无论发生什么,他们必须随时有床位,随时有医生。
  • T3/T5 级服务(Restore-Later):这是普通感冒或体检(比如内部工具、测试环境、非核心功能)。

UFA 的运作方式:

  1. 平时(稳态):让“感冒病人”占用“备用 ICU 床位”

    • 以前,ICU 的备用床位是空的,谁也不让坐。
    • 现在,UFA 允许那些“感冒病人”(非核心服务)暂时坐在 ICU 的备用床位上。
    • 好处:平时这些床位不浪费,资源利用率从 20% 提升到了 30%。
  2. 灾难发生时(故障转移):快速腾挪

    • 假设 A 城(主医院)着火了,所有病人要转移到 B 城(备用医院)。
    • 第一步(踢人):B 城里的“感冒病人”(非核心服务)会被瞬间请出去(暂停服务),把宝贵的 ICU 床位让给“危重病人”(核心服务)。
    • 第二步(扩容):被请出去的“感冒病人”不会消失,他们会被迅速转移到临时搭建的帐篷(云端弹性资源或批处理集群)里继续治疗。
    • 第三步(恢复):等 A 城修好了,或者 B 城稳定了,再把这些“感冒病人”从帐篷里接回医院,或者等他们恢复健康。

关键的安全网:如何防止“踢人”导致“危重病人”死亡?

这是最 tricky 的地方。如果“感冒病人”(非核心服务)挂了,会不会把“危重病人”(核心服务)也拖死?

  • 以前的情况:如果“挂号处”(非核心)坏了,“急诊医生”(核心)可能会因为等不到挂号信息而停摆。这叫“故障传递”。
  • UFA 的解决方案
    • 切断依赖:Uber 开发了一套自动安检系统(静态分析和运行时检测),在代码上线前就检查:如果“挂号处”挂了,“急诊医生”能不能自己独立工作?
    • 强制“故障开放”:如果“急诊医生”依赖“挂号处”,系统会强制要求医生修改代码,改成“即使没有挂号信息,我也先接诊,事后补单”。
    • 结果:即使把“感冒病人”全踢走,ICU 里的危重病人依然能正常运转,互不干扰。

4. 成果与影响

这套系统上线后,效果立竿见影:

  • 省钱:直接砍掉了 100 万个 CPU 核心 的闲置资源(相当于省下了一个中型数据中心的电费和维护费)。
  • 高效:服务器利用率从 20% 提升到了 30%。
  • 安全:在真实的灾难演练中(比如 2026 年 1 月的一次 17 小时故障转移),核心服务的可用性依然保持在 99.97%,用户几乎感觉不到任何变化。
  • 速度:从发现故障到完成资源切换,只需要 8 分钟 就能把备用资源全部激活。

总结

这篇论文讲的是 Uber 如何从一个**“为了安全不惜一切代价”的保守派,转变为一个“在确保安全的前提下,极致利用每一分资源”**的聪明派。

他们不再盲目地购买双倍资源,而是通过精细的分级(把服务分三六九等)、智能的调度(平时混用,战时腾挪)和严格的安检(确保踢掉低优先级服务不会误伤高优先级服务),成功地在可靠性成本之间找到了完美的平衡点。

这就好比一家餐厅,以前为了防万一,雇了双倍厨师;现在他们发现,只要把“切菜工”(非核心)和“主厨”(核心)的依赖关系理顺,平时让切菜工在主厨的备用灶台上帮忙,一旦主厨灶台着火,立刻把切菜工赶到临时灶台,主厨依然能做出顶级大餐,而且餐厅的运营成本直接减半。