对企业而言,失败往往比成功更具有启发性。另外,如果团队行动太快,又无法以完全透明的方式处理问题,那么失败所带来的影响有可能长期困扰整个团队。我们在LinkedIn最近就遇到了类似的问题,导致大数据生态系统发生了数据丢失的严重事件,也让我们着力反思当前的诊断与响应机制。希望我们从大数据生态系统重大事故中学到的东西,也能给各位带来一点启示。
本文最初发布于领英技术博客,经领英官方授权由InfoQ中文站翻译并分享。
首先来看事件概况:在部分机架中,约有2%的设备因意外操作失误而经历了镜像重装。问题的根源在于,我们Hadoop基础设施主机生命周期管理体系中存在设计错误。更令我们难过的是,这一切发生在LinkedIn的关键业务生产集群之上。
与大多数大数据系统一样,我们的架构也设有内置安全网,能够在突破阈值之前持续对系统加以保护。在LinkedIn,我们拥有两套大规模Hadoop集群,其中存储着大量数据。在每套集群内,所有数据块都拥有3份副本,借此实现机架层级的故障冗余支持。每套集群中的两条摄取管道拥有完全独立的路径,可并行实现对数据库数据的摄取跟踪。下面来看整套架构的高层示意图:
我们的灾难恢复策略主要关注在集群内发生数据丢失时,如何从集群当中复制数据。下面我们将具体比较这种安全理论,在发生重大事件的真实场景之下与实践存在哪些冲突。
在此次事件中,相较于机架层面的实际设备离线率,丢失的数据比例相对并不高(只有约0.02%)。但要命的是,这会导致数据块(HDFS)永久丢失,因为对应的三套副本恰好同时位于受到影响的机架之上。
如果单看理论,即便丢失了受影响机架中的所有计算机,数据丢失量应该仍能维持在极低水平(约0.15%)。而且由于受影响机架并未出现所有计算机离线的问题,所以实际丢失的数据块比例应该很低(约0.03%)——真正情况是,丢失的数据块仅占全部数据总量中的约0.02%,比预期还要低些。我们还假设当设备离线的短暂间隔之内,Hadoop NameNode应该会主动复制部分数据块以缓解总体影响。所以总体而言,受此次问题影响的所有文件占比应该只在0.05%上下。
在LinkedIn,绝大多数预定工作流(基于Spark的应用程序)都通过Azkaban触发。而即使是少量文件损坏,也会导致大量Azkaban工作流遭遇失败。本次损坏的文件归属于热数据集,即由众多工作流共同使用的高访问频率数据集。另外,当Azkaban流尝试读取包含大量文件的大规模数据集时,即使单一文件损坏也会导致本次读取失败。将这些因素综合起来,真正的结果就是虽然只有0.02%的数据丢失,但却有高达10%的工作流发生故障(其中相当一部分与业务收入直接相关)。
总而言之,技术集成虽然能够帮助我们最大程度降低数据块丢失比例,但与之对应,即使是极少量的数据损坏也会给生产体系造成重大影响。
如前所述,我们的架构设计要求在不同的数据中心内部署两套Hadoop集群,其分别拥有自己的并行数据摄取管道。换言之,我们可以将数据从一套集群恢复至另一集群。在首次进行事件响应时,我们以为可以轻松跨越两套集群恢复并行生成的所有数据,因此响应工作的主要难点,应该只体现在处理Azkaban工作流生成的中间数据发生损坏的情形上。
问题在于,除非明确要求,否则这些中间数据不会跨集群复制。出于多种外部因素的考量(包括资本支出、变更频率、易于还原以及恢复时间目标等),在默认情况下,某一集群中Azkaban工作流生成的中间数据不会被尽数复制至另一集群处。正是这样的设定,让我们在此次事故中遭遇到一系列出乎意料的挑战。
首先,我们发现需要恢复的数据副本量要比预期当中多得多。这是因为各个Hadoop集群之间完全彼此独立,因此数据的组织方式也将有所区别。我们在摄取新数据时使用的是基于时间的数据布局。因此,由于固有的不确定性,特定文件夹中的文件在不同集群之间可能有所差异。
另外,我们将较旧的数据压缩至同一个按单日进行分区的大文件当中,希望借此提高查询效率与系统性能。这些细微差异带来的最终影响是,我们很难确定未受影响的集群中丢失了哪些文件。实际上,只要单日分区中的文件发生少量损坏,我们就必须复制当天之内的完整分区。具体来看,复制单一文件大概需要移动1 GB数据,而复制当天完整分区则需要移动约1 TB数据。需要处理的数据量因此显著增加,这就极大影响了恢复工作的执行速度。
为了解决这个问题,我们使用到以下技术:
考虑到LinkedIn所使用Hadoop集群的庞大规模,我们必须与各工作流所有方(我们的客户)合作,以实时方式制定应对策略。某些对延迟非常敏感的工作流所有方选择立即处理部分数据,而另一些所有方则选择等待数据完全恢复。
疫情影响下的远程办公新常态,导致我们无法像往常那样在办公室里面对面交流。为此,我们连夜按照美国与印度时区组织起虚拟团队。从组织形式上看,各团队分别采取以下模式:
总体而言,此次恢复主要分为两项主体计划:数据恢复,与工作流恢复。其中数据恢复由Grid网格团队负责处理,而工作流恢复则拥有专门的轨道通路,各轨道负责人立足所在业务部门确定最佳工作流方法。而后,各方选择最具可行性的方法,并跟踪恢复进度以广泛协作。Grid网格团队以各业务部门的全局优先级为基础建立起一套分阶段的恢复方法,借此保证我们的复杂系统始终保持平衡,且不致在数据恢复与工作注恢复两项高强度工作的压力之下而发生崩溃。在此期间,Grid团队逐步增加计算容量,以适应恢复过程中随时出现的过量资源需求。
回顾整次事件,我们总结出以下教训,未来也将据此认真完善自身运营体系:
在此次事件的冲击下,我们的虚拟团队顶住了压力,感谢你们的奉献。团队成员来自组织内的各个部门,包括产品工程、人工智能与数据科学、基础设施乃至系统与网络团队等。再次衷心感谢你们提供的帮助,特别是由Grid、人工智能与产品工作合作伙伴的工程师们组成的攻坚小组!最后,感谢数据工程领导团队在整个恢复过程中提供的坚定支持!
原文链接:
https://engineering.linkedin.com/blog/2020/learnings-from-a-recent-hadoop-incident
领取专属 10元无门槛券
私享最新 技术干货