Amazon Kinesis Data Streams 中的 IteratorAgeMilliseconds 指标持续增加。
简短描述
Kinesis Data Streams 中的 IteratorAgeMilliseconds 指标可能会增加,原因如下:
- 记录处理速度慢
- 读取限制
- AWS Lambda 函数错误
- 连接超时
- 分片之间的数据分配不均
解决方法
记录处理速度慢
使用者处理逻辑的过载会导致记录处理速度变慢。如果使用 Amazon Kinesis 客户端库 (KCL) 来构建使用者,请检查以下根本原因:
- **物理资源不足:**在需求高峰期,检查您的实例是否有足够的物理资源,例如内存或 CPU 利用率。
- **扩展失败:**使用者记录处理逻辑可能无法随着 Amazon Kinesis 数据流负载的增加而扩展。要验证扩展故障,您可以监控来自 KCL 的其他自定义 Amazon CloudWatch 指标。这些指标与 processTask、RecordProcessor.processRecords.Time、Success 和 RecordsProcessed 操作相关联。您还可以监控 IncomingBytes 和 IncomingRecords CloudWatch 指标,以检查 Kinesis 数据流的总体吞吐量。有关 KCL 和自定义 CloudWatch 指标的详细信息,请参阅使用 Amazon CloudWatch 监控 Kinesis 客户端库。如果您无法缩短处理时间,请增加分片数量以升级 Kinesis 流。
- **重叠处理增加:**如果您发现 processRecords.Time 值的增加与流量负载的增加无关,请检查您的使用者记录处理逻辑。您的记录处理逻辑可能会进行同步阻塞调用,这可能会导致使用者记录处理延迟。您还可以增加 Kinesis Data Streams 中的分片数量来解决此问题。有关所需分片数量的详细信息,请参阅重新分片、扩展和并行处理。
- **GetRecords 请求不足:**如果使用者发送 GetRecords 请求的频率不够高,则使用者应用程序可能会滞后。检查 withMaxRecords 和 withIdleTimeBetweenReadsInMillis KCL 配置。
- **吞吐量不足或 MillisBehindLatest 过高:**如果您将适用于 Apache Flink 的亚马逊托管服务用于 SQL,请参阅吞吐量不足或 MillisBehindLatest 过高或者使用者记录处理滞后。
如果使用者处理滞后并且存在数据过期的风险,则延长数据流的留存期。默认情况下,留存期为 24 小时,您可以将该期限配置为最长一年。有关数据留存期的详细信息,请参阅更改数据留存期。
读取限制
检查 ReadProvisionedThroughputExceeded 指标,以查看数据流中是否存在读取限制。
使用者超过每秒五次 GetRecords 调用的配额可能会导致读取限制。有关 Kinesis 流读取限制的详细信息,请参阅如何检测 Amazon Kinesis Data Streams 中的 ReadProvisionedThroughputExceeded 异常并对其进行故障排除?
Lambda 函数错误
在 CloudWatch 中,查看 IteratorAgeMilliseconds 计数持续增加的流的 Lambda 函数。要确定导致 IteratorAgeMilliseconds 值增加的错误,请查看 CloudWatch 中的错误摘要。Lambda 触发器、阻塞调用或 Lambda 内存预调配中的配置可能会导致 Lambda 函数变慢。查看 Lambda 函数错误的时间戳是否与 Kinesis 数据流的 IteratorAgeMilliseconds 指标增加的时间相匹配。时间戳中的匹配可以确认增加的原因。有关详细信息,请参阅配置 Lambda 函数选项。
**注意:**Lambda 函数可能会因为正在重试而出现错误。Lambda 函数之所以被重试,是因为作为 Kinesis 的使用者,它不会跳过记录。随着这些记录的重试,处理延迟也会增加。然后,您的使用者会滞后于数据流,并导致 IteratorAgeMilliseconds 指标增加。
间歇性连接超时
当您的使用者应用程序从 Kinesis 数据流中提取记录时,该应用程序可能会遇到连接超时问题。间歇性连接超时错误可能导致 IteratorAgeMilliseconds 计数显著增加。
要验证该计数的增加是否与连接超时有关,请检查 GetRecords.Latency 和 GetRecords.Success 指标。如果这两个指标也受到影响,则恢复连接后,IteratorAgeMilliseconds 计数不会增加。
分片之间的数据分配不均
Kinesis 数据流中的某些分片接收的记录可能比其他分片多。这是因为在 PUT 操作中使用的分区键不能在分片之间平均分配数据。这种不均的数据分配会导致对 Kinesis 数据流分片的并行 GetRecords 调用减少,并导致 IteratorAgeMilliseconds 计数增加。
您可以使用随机分区键将数据均匀地分配在流的分片上。随机分区键可以帮助使用者应用程序更快地读取记录。
相关信息
Lambda 事件源映射
对 Kinesis Data Streams 使用者进行故障排除
将 AWS Lambda 与 Amazon Kinesis 结合使用