《看论文》是分析计算机与软件工程领域论文的系列文章。在本系列的每篇文章中,我们都会阅读一篇来自OSDI和SOSP等顶级会议的论文。论文,这里不会详细介绍所有的细节,但是会筛选出论文的重点内容,如果你对相关论文非常感兴趣,可以直接点击链接阅读原文。本文是关于2018年OSDI期刊的论文——Maelstrom:MitigatingDatacenter-levelDisastersbyDrainingInterdependentTrafficSafelyandEfficiently[^1],Facebook通过流量管理系统Maelstrom转发数据中心的流量,当一个或更多当数据中心发生故障时,故障对业务的影响会减轻。许多工程师可能认为数据中心级别的故障并不常见,但实际上这是经常发生的问题。飓风在美国是比较常见的自然灾害,因为飓风造成的停电和洪水经常影响数据中心[^2],而人为因素如光缆断裂、软件故障和配置错误会影响整个数据中心[^3]。作为自2014年开始投入生产的系统,2018年至今,Maelstrom已经帮助Facebook减轻了100多个数据中心故障造成的损失。由于数据中心停机是不可能发生的事件,作为工程师,如何减少类似事件的影响在线服务和业务的紧急情况已成为确保可用性的必要条件。Maelstrom的论文中介绍了很多具体的实践经验,比如定期测试、runbook设计等,但这些都不是作者关注的重点。这里重点介绍一下Maelstrom对流量的分类以及不同流量的放电过程。数据中心作为流量调度的维度,粒度非常粗。如果我们直接将数据中心的流量转发到其他配置转发的数据中心,可能会出现很多问题。因此,在对数据中心的流量进行放电时,我们必须针对依赖关系和资源约束设计不同的策略。为了区分数据中心流量的特征,Maelstrom将数据中心流量分为四类:图1-TrafficType无状态流量(Stateless):绝大多数网络流量都是无状态的,我们可以很容易地将这些流量分类为转发到其他数据中心;粘性流量(Sticky):为了提高用户体验,在某些场景下,系统会针对每个用户通过特定的机器进行处理,以维持用户会话。对于这个流量,我们可以发送新的Sticky流量转发到其他数据中心,并强制断开已建立的会话以触发客户端重连;复制流量(Replication):当数据中心层面发生故障时,我们可能需要修改或管理存储系统的复制流量,我们可能需要在其他数据中心创建副本来处理读取请求,以及副本的创建需要占用数据中心内或跨数据中心的网络资源;有状态流量(Stateful):当主节点上的主从复制系统出现故障时,我们需要将主节点的状态复制到健康数据中心的从节点,从节点进程成为主节点以服务请求;根据流量的特点,我们需要采用不同的方式进行转发,接下来我们将分别介绍Maelstrom的不同流量流程类型和所花费的时间。无状态流量无状态流量是四种流量中最简单的转发过程。为了保证整个系统的稳定性,在引流数据中心流量的过程中,我们引入了引流倍增器(DrainMultiplier),引入了几个不同的Phase来防止流量移动过快而影响其他数据中心的负载:图2-清空无状态流量整个数据中心的大部分流量在10分钟内清空。Facebook将以10分钟为基准来衡量灾难发生时转发请求的速度。粘性流量与无状态流量相比,粘性流量的排放稍微复杂一些。Maelstrom不仅会修改边缘路由器以将新请求转发到其他数据中心,还会通过重启容器任务来销毁本地建立的会话:图3-DrainStickytraffic如上图所示。Maelstrom在42分钟开始修改边缘路由的权重以重定向会话请求,并在75分钟重新启动容器任务以销毁本地会话。为了减少大规模重启对其他数据中心的影响,我们将减少容器流量。任务的重启速度,所以这里大约需要25分钟才能将50%的粘性流量转发到其他数据中心。复制流量数据存储服务的复制流量可以通过配置直接关闭,我们可以将新的请求指向其他数据中心的只读副本,如下图,可以看到当我们关闭数据中心的复制,复制流量由此产生的网络请求很快归零,但数据存储服务的恢复过程相对复杂:图4-排空和恢复复制流量因为整个系统在期间仍然要处理外部请求关闭期间,其他数据中心存储服务中仍有数据的增删改查操作。当数据存储的副本重启时,过期的副本会占用10倍的网络带宽来赶上主节点的状态,这可能会导致骨干网和数据中心网络拥塞,影响其他服务;从上图可以看出复制流量重启后对整体网络流量的影响。我们可以针对不同的流量引入带宽限制,减少突发流量带来的事故。有状态流量排出有状态流量是最复杂的过程。如下图所示,Ads、Aggregator-leaf和Classification服务都将数据存储在多租户状态存储中。当灾难发生时,Maelstrom会将数据存储在数据中心之外。提升master节点的节点,然后将流量转发到这个节点:图5-Drainingstatefultraffic因为不同服务的分片是独立的,我们可以并行提升和转发不同分片的写操作,从中转发有状态流量数据中心是一个比较难的工作,我们大概用了18分钟就完成了。总结减少数据中心级别的故障是一个很大的话题,但Maelstrom的解决方案似乎非常简单——将数据中心流量转发到其他数据中心。但是,该解决方案涉及的组件较多,并且面临各种潜在问题。在实际实施过程中,会遇到很多没有考虑到的细节问题,需要大量的工程经验来对数据中心流量进行分类,根据特点进行分类处理,是一种值得学习和借鉴的方法。我们在处理类似问题的时候,也要学会把大问题分解成小问题,一个一个解决。本文转载自微信公众号“毫无逻辑”,可关注下方二维码。转载本文请联系真诺逻辑公众号。
