通过 Amazon OpenSearch Service 的背压和准入控制提高弹性 | 亚马逊网络服务

通过 Amazon OpenSearch Service 的背压和准入控制提高弹性 | 亚马逊网络服务

源节点: 2723961

亚马逊开放搜索服务 是一种托管服务,可以轻松地在 AWS 云中大规模保护、部署和操作 OpenSearch 集群。 去年,我们介绍了 分片索引背压准入控制,它监视集群资源和传入流量,以有选择地拒绝请求,否则这些请求会造成内存不足等稳定性风险,并由于内存争用、CPU 饱和和 GC 开销等影响集群性能。

我们现在很高兴为 OpenSearch 服务引入搜索背压和基于 CPU 的准入控制,这进一步增强了集群的弹性。 这些改进适用于所有 OpenSearch 1.3 或更高版本。

搜索背压

背压可防止系统被工作淹没。 它通过控制流量速率或卸载过多负载来实现这一点,以防止崩溃和数据丢失、提高性能并避免系统完全失败。

搜索背压是一种机制,用于在节点处于胁迫状态时识别和取消正在进行的资源密集型搜索请求。 它可以有效应对资源使用率异常高的搜索工作负载(例如复杂查询、缓慢查询、多次命中或大量聚合),否则可能会导致节点崩溃并影响集群的健康状况。

Search Backpressure 建立在任务资源跟踪框架之上,它提供了一个易于使用的 API 来监控每​​个任务的资源使用情况。 Search Backpressure 使用后台线程定期测量节点的资源使用情况,并根据 CPU 时间、堆分配和运行时间等因素为每个进行中的搜索任务分配取消分数。 更高的取消分数对应于资源更密集的搜索请求。 搜索请求按照其取消分数的降序被取消以快速恢复节点,但取消的数量是有速率限制的以避免浪费工作。

下图说明了搜索背压工作流程。

搜索请求在取消时返回 HTTP 429“请求过多”状态代码。 如果只有一些分片失败并且允许部分结果,则 OpenSearch 返回部分结果。 请参见以下代码:

{ "error": { "root_cause": [ { "type": "task_cancelled_exception", "reason": "cancelled task with reason: heap usage exceeded [403mb >= 77.6mb], elapsed time exceeded [1.7m >= 45s]" } ], "type": "search_phase_execution_exception", "reason": "SearchTask was cancelled", "phase": "fetch", "grouped": true, "failed_shards": [ { "shard": 0, "index": "nyc_taxis", "node": "9gB3PDp6Speu61KvOheDXA", "reason": { "type": "task_cancelled_exception", "reason": "cancelled task with reason: heap usage exceeded [403mb >= 77.6mb], elapsed time exceeded [1.7m >= 45s]" } } ], "caused_by": { "type": "task_cancelled_exception", "reason": "cancelled task with reason: heap usage exceeded [403mb >= 77.6mb], elapsed time exceeded [1.7m >= 45s]" } }, "status": 429
}

监控搜索反压

您可以使用节点统计 API 监控详细的搜索背压状态:

curl -X GET "https://{endpoint}/_nodes/stats/search_backpressure"

您还可以使用查看集群范围内的取消摘要 亚马逊CloudWatch. 以下指标现在可用 ES/OpenSearch服务 命名空间:

  • 搜索任务已取消 – 协调节点取消的次数
  • SearchShardTask 已取消 – 数据节点取消数

以下屏幕截图显示了在 CloudWatch 控制台上跟踪这些指标的示例。

基于 CPU 的准入控制

准入控制是一种守门机制,可根据节点的当前容量主动限制对节点的请求数量,以应对有机增长和流量高峰。

除了 JVM 内存压力和请求大小阈值之外,它现在还监视每个节点的滚动平均 CPU 使用率以拒绝传入 _search_bulk 要求。 它可以防止节点被过多的请求淹没,从而导致热点、性能问题、请求超时和其他级联故障。 过多的请求会在拒绝时返回 HTTP 429“请求过多”状态代码。

处理 HTTP 429 错误

如果您向节点发送过多流量,您将收到 HTTP 429 错误。 它表示集群资源不足、资源密集型搜索请求或工作负载意外激增。

Search Backpressure 提供了拒绝的原因,这可以帮助微调资源密集型搜索请求。 对于流量高峰,我们建议使用指数退避和抖动进行客户端重试。

您还可以按照这些故障排除指南来调试过多的拒绝:

结论

Search Backpressure 是一种摆脱过度负载的反应机制,而准入控制是一种主动机制,用于限制对节点的请求数量超出其容量。 两者协同工作以提高 OpenSearch 集群的整体弹性。

搜索背压适用于 OpenSearch的,我们一直在寻找 外部贡献. 你可以参考 RFC 以开始浏览网页。


关于作者

科坦维尔玛 是一名高级 SDE,致力于 Amazon OpenSearch Service。 他热衷于构建大型分布式系统、提高性能以及通过简单的抽象来简化复杂的想法。 工作之余,他喜欢阅读和提高家庭咖啡师的技能。

苏雷什 NS 是一名高级 SDE,致力于 Amazon OpenSearch Service。 他热衷于解决大规模分布式系统中的问题。

普里库玛•拉达尼 是在 Amazon OpenSearch Service 上工作的 SDE-2。 他喜欢为开源软件开发做出贡献,并且热衷于分布式系统。 他是一名业余羽毛球运动员,喜欢徒步旅行。

布赫塔瓦汗 是 Amazon OpenSearch Service 的首席工程师。 他对构建分布式和自治系统很感兴趣。 他是 OpenSearch 的维护者和积极贡献者。

时间戳记:

更多来自 AWS 大数据