跳至内容

如何解决 OpenSearch Service 中的搜索或写入拒绝问题?

3 分钟阅读
0

我想对 Amazon OpenSearch Service 集群搜索或写入请求被拒绝的问题进行故障排除。

简述

当您在 Amazon OpenSearch Service 集群中写入或搜索数据时,可能会收到以下“HTTP 429”错误或“es_rejected_execution_exception”消息:

"error":"elastic: Error 429 (Too Many Requests): rejected execution of org.elasticsearch.transport.TransportService$7@b25fff4 on EsThreadPoolExecutor[bulk, queue capacity = 200, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@768d4a66[Running, pool size = 2, active threads = 2, queued tasks = 200, completed tasks = 820898]] [type=es_rejected_execution_exception]"

出现此问题的原因如下:

  • 您超过了数据节点 Amazon Elastic Compute Cloud (Amazon EC2) 实例类型的搜索或写入配额。
  • 您集群的 CPU 利用率很高,JVM 内存压力也很大。
  • 您的 OpenSearch Service 集群中的分片分布不均匀。
  • 您的活动线程和队列线程已满。

解决方法

计算数据节点实例类型的搜索和写入配额

当您的节点超过其并发操作限制时,它会将请求排入队列。在相关公式中输入您的 vCPU 数量以计算此限制。

要计算搜索请求的最大活动线程数,请使用以下公式:

int ((available_processors * 3) / 2) + 1

要计算写入请求的最大活动线程数,请使用以下公式:

int (available_processors)

注意: 将 available_processors 替换为节点中可用的 vCPU 数量。

例如,您为 7.4 版集群中的五个节点选择 R5.2xlarge 节点类型。每个节点有 8 个 vCPU。

对于每个 R5.2xlarge 节点,您最多可以执行 13 次并发搜索操作:

(8 vCPUs * 3) / 2 + 1 = 13 concurrent search operations

由于此集群有 5 个节点,您最多可以执行 65 次搜索操作:

5 nodes * 13 concurrent search operations = 65 total search operations

对于每个 R5.2xlarge 节点,您最多可以执行 8 次并发写入操作:

8 vCPUs = 8 concurrent write operations

由于此集群有 5 个节点,您最多可以执行 40 次写入操作:

5 nodes * 8 concurrent write operations = 40 total write operations

要解决此问题,请减少并发或总搜索和写入操作数量,使其保持在计算的配额范围内。有关每种节点类型的 vCPU 数量的详细信息,请参阅 OpenSearch Service 定价。

查看 OpenSearch Service 的 CloudWatch 指标

要对 429 异常进行故障排除,请检查您集群的以下 Amazon CloudWatch 指标:

  • IndexingRate: 每分钟索引操作的次数。与容量限制相比,突然的峰值或持续的高值表明存在压力。
  • SearchRate: 每分钟的搜索请求总数。接近节点容量限制的高速率表明存在压力。
  • CoordinatingWriteRejected: 由于存在索引压力,协调节点出现拒绝的情况。任何非零值都表明存在问题。此指标在 7.1 及更高版本中可用。
  • PrimaryWriteRejected: 由于存在索引压力,主分片出现拒绝的情况。任何非零值都表明存在问题。此指标在 7.1 及更高版本中可用。
  • ReplicaWriteRejected: 由于存在索引压力,副本分片出现拒绝的情况。任何非零值都表明存在问题。此指标在 7.1 及更高版本中可用。
  • ThreadpoolWriteQueue: 写入线程池中的任务排队。7.1 及更高版本的最大队列大小为 10,000,早期版本的最大队列大小为 200。
  • ThreadpoolWriteRejected: 写入线程池中的任务被拒绝。对于 7.1 及更高版本,将此指标与 CoordinatingWriteRejected、PrimaryWriteRejected 和 ReplicaWriteRejected 一起使用来监控拒绝情况。
  • ThreadpoolSearchQueue: 搜索线程池中的任务排队。最大搜索队列大小为 1,000。
  • ThreadpoolSearchRejected: 搜索线程池中的任务被拒绝。如果此数字持续增长,请扩展您的集群。

另外,检查 JVMMemoryPressure CloudWatch 集群指标是否达到 75%。如果 JVMMemoryPressure 持续保持在 75% 或更高,您可能会遇到集群性能问题。要对此问题进行故障排除,请参阅如何对 Amazon OpenSearch Service 集群上的 JVM 高内存压力问题进行故障排除?

检查 CPUUtilization CloudWatch 指标是否达到 80%。如果 CPUUtilization 一直保持在 80% 或更高,则您可能会遇到请求拒绝和集群性能问题。要对此问题进行故障排除,请参阅如何对我的 OpenSearch Service 集群上的高 CPU 使用率问题进行故障排除?

检查分片分布是否不均匀

分片分布不均匀会导致某些节点比其他节点处理更多的流量。这种不平衡会导致超载节点出现拒绝的情况。有关详细信息,请参阅如果我的 OpenSearch Service 集群中的分片分配不均匀,如何重新平衡?

要检查您的分片分配情况,请运行以下命令:

GET /_cat/allocation?v

查看输出以识别分片数较高的节点。如果您的集群对分片分配不均匀,请重新平衡集群或调整索引设置,从而更均匀地在节点之间分配分片。

检查您的活动线程和队列线程是否已满

如果缺少 CPU 或请求并发过高,则队列可能会填满,从而导致“HTTP 429”错误。

要检查活动线程和队列线程是否存在任何搜索拒绝,请运行以下命令:

GET /_cat/thread_pool/search?v&h=id,name,active,queue,rejected,completed

注意: 将 search 替换为 write,以检查活动线程和队列线程是否存在写入拒绝。

减少搜索拒绝

在以下情况下,OpenSearch Service 会拒绝您的搜索请求:

  • 所有活动线程都很忙,请求队列已达到最大容量限制。
  • 请求数超过批量队列容量限制。
  • 搜索线程池队列已达到最大大小 1,000。

每个节点的批量队列可以容纳 50 到 200 个请求。确切的容量取决于您的 OpenSearch Service 或 Elasticsearch 版本。

要监控搜索拒绝情况并减少其次数,请完成以下步骤:

  1. 配置 OpenSearch Service 日志以捕获搜索慢日志。要为慢日志生成设置阈值,请运行以下命令:
    curl -XPUT http://your-domain-endpoint/index/_settings -d '{"index.search.slowlog.threshold.query.level":"10s"}'
    注意: 将 your-domain-endpoint 替换为域的端点,将 level 替换为正确的日志级别。为避免产生额外的开销,请将慢日志阈值设置得足够高。例如,如果您的大多数查询需要 11 秒,则将慢日志阈值设置为 20 秒。
  2. 查看搜索慢日志以识别运行缓慢的查询。
  3. 如果仍然存在拒绝的情况,则升级到更大的实例类型或添加更多数据节点。

有关如何为查询实施搜索性能策略的信息,请参阅 Elasticsearch 网站上的 Troubleshooting Elasticsearch searches, for beginners(初学者 Elasticsearch 搜索故障排除)。另请参阅 Advanced tuning: Finding and fixing slow Elasticsearch queries(高级调整:查找和修复 Elasticsearch 慢查询)。

减少写入拒绝情况

在以下情况下,OpenSearch Service 会拒绝您的写入请求:

  • 所有活动线程都很忙,写入请求队列已达到最大容量限制。
  • 节点的堆内存使用率超过 95%,否则断路器会跳闸。
  • 请求数超过批量队列容量限制。
  • 出现主分片问题或主分片无法处理写入。

要减少写入拒绝情况,请执行以下一项或多项操作:

  • 如果仍然存在拒绝的情况,则升级到更大的实例类型或添加更多数据节点。
  • 提高文档的索引性能,使写入队列无法达到容量限制。
  • 根据您的工作负载和性能要求调整批量大小。有关详细信息,请参阅 OpenSearch 网站上的 Tuning your cluster for indexing speed(调整集群以提高索引速度)。
  • 在应用程序逻辑中添加指数重试逻辑,这样 OpenSearch Service 就会自动重试失败的请求。
  • 如果您要从 Logstash 提取数据,请调整 Worker 计数和批量大小。最佳实践是将批量大小设置在 3 到 5 MB 之间。

注意: 如果您的集群持续遇到高并发请求,则指数重试逻辑无法解决搜索或写入拒绝问题。当流量突然或偶尔出现高峰时,请使用此最佳实践。

相关信息

OpenSearch Service best practices(OpenSearch Service 最佳实践)

Sizing Amazon OpenSearch Service domains(调整 Amazon OpenSearch Service 域的大小)

AWS 官方已更新 4 个月前