提升 Amazon 管理式 Apache Flink 应用的恢复力,新增系统回滚功能 大数据博客

提升亚马逊托管 Apache Flink 服务应用的韧性

关键要点

介绍亚马逊托管服务为 Apache Flink 引入的系统回滚功能,旨在提升应用的韧性和可用性。解析常见错误场景及其对应用运行的影响。说明如何启用系统回滚功能以及操作可见性的重要性。

在构建应用时,客户即使在采取预防措施的情况下,仍可能遇到代码和配置错误,导致应用停机。为了减轻这一问题,亚马逊托管的 Apache Flink 服务引入了系统回滚功能,可以轻松将应用恢复到先前的运行版本,从而提升应用的稳定性和可用性。

Apache Flink 是一个开源的分布式处理引擎,为流处理和批处理提供强大的编程接口。它同时支持多种编程语言,例如 Java、Python、Scala 和 SQL,并具备多种抽象级别的 API,这些 API 可以在同一应用中互换使用。

托管的 Apache Flink 服务为运行 Apache Flink 应用提供全面管理的无服务器体验,并支持最新发布的版本 Apache Flink 1191。

本文探讨了如何在托管服务中使用系统回滚功能,讨论该功能如何通过提供高度可用的 Flink 应用来提升应用的韧性。通过示例,您还将了解如何使用 API 增强应用操作的可见性,帮助解决应用和配置问题。

系统回滚的错误场景

托管的 Apache Flink 服务在共享责任模型下运作。服务负责确保运行安全、耐用、高可用的 Flink 应用所需的基础设施,而客户则需确保应用的代码和配置正确。

以下是一些常见的错误场景,包括:

错误场景说明代码错误例如,代码中未正确处理 null 值,导致 NullPointerException。并行性错误更新的 Flink 应用的并行性超过应用配置的最大并行性。子网错误运行 VPC 应用时更新应用的子网错误,导致 Flink 作业启动失败。

即使在发生上述错误时,托管的 Apache Flink 应用仍然显示为 RUNNING 状态,实际上底层的 Flink 应用无法处理 incoming 事件并从错误中恢复。

在应用自动扩展期间,错误也可能发生。例如,当应用扩展时,由于快照与 Flink 作业图之间的操作符不匹配,可能无法从保存点恢复。您还可能会在升级到新版本的 Apache Flink 时收到快照兼容性错误。

在这些场景中,您可以执行强制停止操作,或者使用 RollbackApplication API 将应用回滚到先前版本。这两种操作都需要客户干预以恢复问题。

自动回滚到先前的应用版本

如果更新操作或扩展操作失败,系统回滚功能将自动执行 RollbackApplication 操作,将应用恢复到先前版本。这意味着在经历短暂停机后,Flunk 应用将恢复到上一个版本并继续处理事件,提升了可用性。

如果回滚成功,Flink 应用将恢复至先前版本并持续以 RUNNING 状态进行事件处理;如果回滚失败,应用将处于 READY 状态,此时您需要修复错误并重新启动应用。

然而,当托管的 Apache Flink 应用因代码或配置问题而启动失败时,服务不会启动应用,而是返回 READY 状态。在这种情况下,无论系统回滚是否启用,都会表现出此默认行为。

系统回滚在应用转换为 RUNNING 状态之前发生。如果托管的 Apache Flink 应用已经成功转换为 RUNNING 状态且后续出现运行时问题,例如检查点失败或作业失败,则不会执行自动回滚。

为了启用系统回滚,您可以使用控制台或 API。以下是通过 API 启用此功能的示例:

bashaws kinesisanalyticsv2 updateapplication applicationname sampleappsystemrollbacktest currentapplicationversionid 5 applicationconfigurationupdate {ApplicationSystemRollbackConfigurationUpdate {RollbackEnabledUpdate true}} region uswest1

应用操作可观察性

应用版本变化的可观察性至关重要,可以帮助您在出现应用与配置错误时无缝回滚到先前版本。借助版本历史的可见性,您可以获得对应用执行操作的时间顺序信息,提高调试效率。

可以通过 AWS 命令行界面 (AWS CLI) 调用以下两个额外的 API:

tg免费加速器ListApplicationOperations 列出对应用执行的所有操作,包括 UpdateApplication、ApplicationMaintenance和 RollbackApplication,按时间顺序排列。DescribeApplicationOperation 提供 ListApplicationOperations API 列出的特定操作细节,包括错误详情。

此外,您应查阅 AWS CloudWatch 日志,以获取故障排除的帮助。在日志中,您可以找到附加的详细信息,包括堆栈跟踪信息。一旦识别出问题,进行修复并更新 Flink 应用。

系统回滚流程

下图展示了一个 RUNNING 状态的托管 Apache Flink 应用,版本 ID 为 3。该应用成功从 Amazon Kinesis 数据流 源中消费数据、处理并写入到另一个 Kinesis 数据流的接收端。

为演示系统回滚,我们故意在应用代码中引入了错误。在应用的 main 方法中引发异常,如下所示:

javathrow new Exception(Exception thrown to demonstrate systemrollback)

更新应用时,版本 ID 增加到 4,此时应用 状态 显示为 UPDATING。

一段时间后,应用回滚到先前版本,即 版本 ID 3。

现在,应用成功返回至版本 3,并继续以 RUNNING 状态处理事件。

为了解决版本 4 的问题,您可以列出托管 Apache Flink 应用 sampleappsystemrollbacktest 的所有操作:

bashaws kinesisanalyticsv2 listapplicationoperations applicationname sampleappsystemrollbacktest region uswest1

这将显示在 Flink 应用上执行的操作列表:

json{ ApplicationOperationInfoList [ { Operation SystemRollbackApplication OperationId Z4mg9iXiXXXX StartTime 20240620T1652130100 EndTime 20240620T1654490100 OperationStatus SUCCESSFUL } { Operation UpdateApplication OperationId zIxXBZfQXXXX StartTime 20240620T1650040100 EndTime 20240620T1652130100 OperationStatus FAILED } { Operation StartApplication OperationId BPyrMrrlXXXX StartTime 20240620T1526030100 EndTime 20240620T1528050100 OperationStatus SUCCESSFUL } ]}

检查 UpdateApplication 操作的详情,记录下 OperationId。使用 AWS CLI 或 API 更新应用时,可以在 UpdateApplication API 响应中获取该 OperationId。要查明出错原因,可以利用 OperationId 调用 describeapplicationoperation。

使用以下命令调用 describeapplicationoperation:

bashaws kinesisanalyticsv2 describeapplicationoperation applicationname sampleappsystemrollbacktest operationid zIxXBZfQXXXX region uswest1

这将显示操作的详细信息,包括错误信息。

json{ ApplicationOperationInfoDetails { Operation UpdateApplication StartTime 20240620T1650040100 EndTime 20240620T1652130100 OperationStatus FAILED ApplicationVersionChangeDetails { ApplicationVersionUpdatedFrom 3 ApplicationVersionUpdatedTo 4 } OperationFailureDetails { RollbackOperationId Z4mg9iXiXXXX ErrorInfo { ErrorString orgapacheflinkruntimeresthandlerRestHandlerException Could not execute application } } }}

请检查 CloudWatch 日志,以获取实际错误信息。以下代码显示了相同的错误及完整堆栈跟踪,帮助您理解问题的原因。

提升 Amazon 管理式 Apache Flink 应用的恢复力,新增系统回滚功能 大数据博客

javaAmazon Managed Service for Apache Flink failed to transition the application to the desired state The application is being rolledback to the previous state Please investigate the following error orgapacheflinkruntimeresthandlerRestHandlerException Could not execute application

最后,您需要修复问题并重新部署 Flink 应用。

结论

本文阐述了如何启用系统回滚功能以及该功能如何帮助减少不良部署场景中的应用停机时间。另外,解释了该功能的工作原理以及如何进行故障排除。希望您能从中获益,并了解到如何提升 Flink 应用的韧性和可用性。我们鼓励您启用此功能,以增强亚马逊托管 Apache Flink 应用的韧性。

有关系统回滚的更多信息,请参考 AWS 文档。

关于作者

Subham Rakshit 是 AWS 的高级流媒体解决方案架构师,主要工作地点在英国。他致力于帮助客户设计和构建流媒体架构,以便从分析流媒体数据中获取价值。闲暇时,他喜欢与两个小女儿一起解谜。您可以在 LinkedIn 上与他联系。