返回开发者新闻

经验分享:在 Meta 的规模下运行 Presto

2023年4月11日发布者:Neerad Somanchi 与 Philip Bell

Presto 是一款免费的开源 SQL 查询引擎。过去十年来,Meta 一直都在使用 Presto,从中学到许多经验。无论是工具、程序,还是服务,在大规模运行时,我们都需要解决各种问题,应对意想不到的挑战。接下来将与大家分享我们在将 Presto 的使用扩大到 Meta 的规模时所学到的 4 件事,为有意大规模运行自己的查询系统的各位提供一些建议!

快速扩大 Presto 规模以满足日益增长的需要:我们面临过哪些挑战?

部署新版 Presto

图 1:推送新版 Presto 的程序工作流程(图表制作者:Philip S. Bell)

Meta 在世界各地的数据中心运行大量 Presto 群集。新版 Presto 大约每月至少构建并可供部署一次,有时会是每月两次。在 Meta 内快速扩展 Presto 的部署范围时,我们最早面临的挑战之一,便是要在将查询引擎部署到大量群集当中的同时,确保引擎持续可用且稳定可靠。这一点在 Presto 互动式使用案例中一直尤为重要,也就是由用户发起查询并积极等待结果的情况。而在自动的“批量”使用案例下,查询失败则相对不会构成太大的问题,因为系统会在当中自动重试,确保最终能成功查询所需数据。

要解决这个挑战,方法非常简单。守在所有 Presto 群集前方的是一个名为“网关”的负载均衡器,该组件会与 Meta 的其他系统一同负责将 Presto 查询路由至适当的群集。当有 Presto 群集需要更新时,系统会首先将该群集标记为从“网关”排除,即下令“网关”停止向此群集路由任何新的查询。然后,自动系统会等待一段预定的时间,以便目前正在该群集上运行的查询完成。接下来,系统会更新该群集。待该群集恢复使用后,系统便会向“网关”开放该群集,以便“网关”开始向其路由新的查询。

部署新版 Presto 时需要考虑的另外一个方面是可用性。我们需要确保用户在群集更新期间仍能使用 Presto。同样地,自动系统会确保每个地理区域内的每个数据中心始终都有所需数量的 Presto 群集可供使用。当然,我们不能一次关闭过多群集,以免影响用户的使用;也不能一次关闭太少群集,否则部署时间就会变得太长。因此,我们必须在两者之间找到平衡点。

自动启用与停用 Presto 群集

图 2:向群集加入硬件的自动化工作流程(图表制作者:Philip S. Bell)

Meta 的数据仓库在不同区域的分布情况会不断变化。换言之,Meta 会定期启用新的 Presto 群集和停用现有的群集。我们以前的 Presto 群集数量不多,因此当时可手动完成此流程。但随着 Meta 开始逐步扩大 Presto 的使用规模,很快就变得难以手动追踪所有变更。为了解决这个问题,我们采用了自动系统来处理群集的启用与停用流程。

首先,我们需要将群集的配置标准化,也就是说,我们要为 Meta 内的不同 Presto 使用案例构建基础配置。然后,每个群集在基础配置之上可以设置最低限度的附加或覆盖规格。将群集的配置标准化后,我们便可根据基础模板自动生成配置,从而启用任何新的群集。为了启用群集,我们还需要与自动系统的挂钩集成,以便与多项全公司通用的基础架构服务(例如 Tupperware)和数据仓库专用服务集成。当群集上线后,我们会向其传送几个测试查询,由自动系统验证该群集能否成功执行查询。接着,此群集会在“网关”上完成注册,并且开始提供查询服务。

停用群集的流程基本上就是反过来。系统会从“网关”取消注册相关群集,而且会允许任何进行中的查询完成。然后,系统会关闭 Presto 程序,并关闭相应的群集配置。

我们将此自动系统集成到数据仓库的硬件启用与停用工作流程中。最终成果便是整个流程到得以全面自动化:从新硬件出现在数据中心,到 Presto 群集上线并提供查询服务,再到硬件停用后关闭群集的安排,全部都由系统自动处理。实现此流程后,我们得以节省宝贵的人力,缩短了硬件空闲时间,同时将人为错误降至最少。

自动调试和修正

图 3:检测到主机状况欠佳(图表制作者:Philip S. Bell)

在 Meta 大规模部署 Presto 后,我们必须准备好适当的工具和自动系统,以便待命人员(亦即 Presto 的联系人)工作起来更加轻松。

多年来,我们开发了多款“分析器”,帮助待命人员高效地开展调试以及评估出现问题的根本原因。当发现违反面向客户的服务等级协议的行为时,监控系统会发出提醒,然后触发分析器。分析器会从各个监控系统(操作型数据存储,简称 ODS)、发布到 Scuba 的事件,甚至主机级别的记录中获取信息。随后,分析器中的自定义逻辑会将所有这类信息串连在一起,从中推断可能的根本原因。这对于待命人员来说极为实用,因为系统可以提供根本原因分析,方便他们直接跳到思考可行的缓解方案。在某些情况下,我们已将调试和修正程序都全面自动化,甚至无需牵涉到待命人员。以下会介绍几个例子:

检测到主机状况欠佳

当在多个计算机上大规模运行 Presto 时,我们发现某些“状况欠佳”的主机会导致过量的查询失败情况。根据调查,我们找出了导致主机“状况欠佳”的几个根本原因,其中包括:

  • 硬件层级问题,此类问题因负责监控所有队列的监控系统覆盖范围不足而未被发现
  • 不确定的 JVM 漏洞,这些漏洞有时会导致查询失败数量稳步增加

为了解决这一问题,我们如今会监控 Presto 群集中的查询失败情况。具体来说,我们会尽可能将每次查询失败归因,找出导致失败的主机。此外,我们还设置了提醒系统,以便当特定主机导致的查询失败次数异常地多时发出提醒。自动系统随之便会开始从 Presto 队列中排除相应主机,以此遏制失败情况。

调试排队问题

当 Presto 群集正在运行的查询达到自身的并行处理量上限,每个群集都可以按照使用案例、硬件配置和查询大小来将查询排入队列。Meta 设置了一种十分精密的路由机制,以便将 Presto 查询分派到可以执行此查询的“适当”群集,充分利用资源。除了 Presto 之外,路由的决定过程中也涉及到多个系统,需要考虑到多个因素:

  • Presto 群集目前的排队状况。
  • 硬件在不同数据中心的分布情况。
  • 查询所用表格的数据位置。

如此复杂的流程,使待命人员很难确定在生产环境中遇到的任何排队问题的根本原因。此时,分析器便可再次发挥作用,从多个来源提取信息并得出结论。

负载均衡器的稳定性

图 4:负载均衡器的稳定性(图表制作者:Philip S. Bell)

如上所述,在所有 Presto 群集前方有一个负载均衡器把关,负责路由 Meta 的每一个 Presto 查询。最初,Presto 的应用并未扩大至如今的内部使用规模,因此那时的“网关”非常简单。然而,随着 Presto 在 Meta 的使用率大幅增加,我们在扩展性方面多次遇到问题。其中一个问题便是“网关”因负载过重而出现故障,这可能导致所有用户都无法使用 Presto。部分稳定性问题的根本原因在于服务短时间内无意间以数百万条查询轰炸“网关”,导致“网关”程序崩溃,无法路由任何查询。

为避免这种情况,我们着手提高“网关”的稳定性,使其更能承受这种无意的 DDoS 式流量。为此我们实现了限速功能,以在负载过重时拒绝查询。我们可以针对不同方面的每秒查询次数启用限速功能,例如限制每位用户、每个来源或每个 IP 位址的每秒查询次数,也可以全局地针对所有查询限速。我们实现的另外一项增强功能是自动缩放。有了这个能在全 Meta 支持增加或减少工作数量规模的服务,现在的“网关”实例数量便可灵活调整。这意味着当负载过重时,“网关”可以扩展以处理额外流量,但又不会超出 CPU 或内存的上限,这样便可避免出现上述的崩溃情况。在自动缩放与限速功能的相辅相成下,我们可以确保“网关”可靠稳定,得以承受无法预测的恶劣流量状况。

对于使用 Presto 扩展自己的数据湖仓的团队,我们有什么建议?

图 5:Presto 架构扩展(图表制作者:Philip S. Bell)

在扩展 Presto 规模时,请牢记以下几个重点:

  1. 设立易懂且明确的面向客户的服务等级协议。随着您扩展 Presto 的使用范围,便越来越需要就可以追踪客户痛点的重要指标(例如排队时间和查询失败率)制定服务等级协议。如果用户数量庞大,缺乏适当的服务等级协议会令您难以确定事件影响,进而可能大大地阻碍您缓解生产问题。
  2. 监控和自动调试。随着 Presto 使用范围的逐步扩展,以及群集数量不断增加,监控和自动调试变得更加重要。
    • 设置周密的监控机制有利于找出生产问题,防止问题范围变得太大。如果尽早发现问题,便能确保我们在可行情况下尽可能减轻用户影响。
    • 在出现影响客户的生产问题时,人工调查的方法可能难以调整规模。因此,务必实现自动调试系统,以便快速确定根本原因。
  3. 实现良好的负载均衡。随着 Presto 队列不断扩大,您必须针对 Presto 群集制定完善的负载均衡解决方案。在大规模的情况下,即使负载均衡的效率只是稍微低下,都有可能因为工作负载庞大而产生巨大的负面影响。
  4. 配置管理。在没有妥善规划的情况下,可能难以管理大规模 Presto 群集的配置。因此,在可行情况下,我们应该将配置设置为可以经常性重新载入,这样 Presto 实例就无需重启或以破坏性方式更新,也不会导致查询失败和客户不满。

本文由 Meta 产品工程师 Neerad Somanchi 与 Meta 开发者外协推广人员 Philip Bell 合作撰写。

如需深入了解 Presto,欢迎浏览 prestodb.io、在 YouTube 上观看 Philip Bell 的 Presto 简介,或在 TwitterFacebookLinkedIn 上关注 Presto。

如需了解有关 Meta Open Source 的更多信息,请访问我们的 Open Source 网站、订阅我们的 YouTube 频道,或在 TwitterFacebookLinkedIn 上关注我们。