如何纠正 Amazon OpenSearch Service 上的 OpenSearch 控制面板中的以下错误:“Courier fetch: n of m shards failed(Courier 提取: n 个 (共 m 个) 分片失败)”?

上次更新时间:2021 年 9 月 27 日

当我尝试在我的 Amazon OpenSearch Service 域上的 OpenSearch 控制面板中加载控制面板时,会返回一个 Courier 获取错误。如何解决此问题?

简短描述

问:Amazon OpenSearch Service 是 Amazon Elasticsearch Service 的后继者。

当您在 OpenSearch 控制面板中加载控制面板时,搜索请求会被发送到 OpenSearch Service 域。该搜索请求将路由至集群节点,该节点作为请求的协调节点。当协调节点未能完成搜索请求的 获取阶段时,发生“Courier fetch: n of m shards failed”(Courier 获取:m 个分区中的 n 个失败)错误。通常有两类问题会导致此错误:

  • 持久性问题:映射冲突或未分配的分区。如果您的索引模式中有多个索引,且使用相同名称但不同的映射类型,您可能会收到 Courier 获取错误。如果您的集群处于红色集群状态,则表示至少有一个分区未分配。由于 OpenSearch Service 无法从未分配的分区中获取文档,处于红色状态的集群会引发 Courier 获取错误。如果每次收到该错误时 Courier 获取错误消息中的值为“n”,则这可能是持续存在的问题。检查应用程序错误日志以了解问题排查建议。
    注意:持久性问题无法通过重试或配置更多集群资源来解决。
  • 暂时性问题:暂时性问题包括线程池拒绝、搜索超时和被触发的现场数据断路器。当您的集群上没有足够的计算资源时,会发生这些问题。当您间歇性地收到错误消息,每次都有一个不同的“n”值时,可能是由于暂时性问题。您还可以监控 CPUUtilizationJVMMemoryPressureThreadpoolSearchRejected 等 Amazon Cloudwatch 指标,以确定造成 Courier 获取错误的是否是暂时性问题。

解决方法

启用域的应用程序错误日志。该日志可以帮助您确定暂时性问题和持久性问题的根本原因和解决方案。有关更多信息,请参阅查看 Amazon OpenSearch Service 错误日志

持久性问题

以下示例显示的是持久性问题造成的 Courier 获取错误的一个日志条目。

[2019-07-01T12:54:02,791][DEBUG][o.e.a.s.TransportSearchAction] [ip-xx-xx-xx-xxx] [1909731] Failed to execute fetch phase
org.elasticsearch.transport.RemoteTransportException: [ip-xx-xx-xx-xx][xx.xx.xx.xx:9300][indices:data/read/search[phase/fetch/id]]
Caused by: java.lang.IllegalArgumentException: Fielddata is disabled on text fields by default. 
Set fielddata=true on [request_departure_date] in order to load fielddata in memory by uninverting the inverted index.
Note that this can however use significant memory. Alternatively use a keyword field instead.

在此示例中,问题由 request_departure_date 字段造成。日志条目显示,您可以通过在索引设置中设置 fielddata=true 或使用关键字字段解决此问题。

暂时性问题

大多数暂时性问题可通过预置更多计算资源或降低查询的资源利用率来解决。

预置更多计算资源

降低查询的资源使用率

  • 确认您在遵照分区和集群架构的最佳实践。设计拙劣的集群无法使用所有的可用资源。当一些节点处于闲置状态时,另一些节点可能会过载。OpenSearch Service 无法从过载的节点中获取文档。
  • 您还可以缩小查询范围。例如,如果您查询时间范围,请通过配置 Kibana 中的索引模式来缩小日期范围或筛选结果。
  • 避免对非常大的索引执行 select * 查询相反,使用筛选条件查询部分索引并搜索尽可能少的字段。有关详细信息,请参阅 Elasticsearch 网站上的调整以优化搜索速度查询和筛选上下文
  • 重建索引并减少分区的数量。您的集群中包含的分区越多,您越有可能收到 Courier 获取错误。由于每个分区均有自己的资源分配和开销,因此,大量分区会对集群施加过多压力。有关更多信息,请参阅我的 Amazon OpenSearch Service 域为什么卡在“正在处理”状态?

以下示例显示的是暂时性问题造成的 Courier 获取错误的一个日志条目。

Caused by: org.elasticsearch.common.util.concurrent.EsRejectedExecutionException: rejected execution of org.elasticsearch.common.util.concurrent.TimedRunnable@26fdeb6f on QueueResizingEsThreadPoolExecutor
[name = __PATH__ queue capacity = 1000, min queue capacity = 1000, max queue capacity = 1000, frame size = 2000, targeted response rate = 1s, task execution EWMA = 2.9ms, adjustment amount = 50,
org.elasticsearch.common.util.concurrent.QueueResizingEsThreadPoolExecutor@1968ac53[Running, pool size = 2, active threads = 2, queued tasks = 1015, completed tasks = 96587627]]

在本示例中,问题由搜索线程池队列拒绝造成。要解决此问题,通过选择较大的实例类型向上扩展您的域。有关更多信息,请参阅 Elasticsearch 网站上的线程池


这篇文章对您有帮助吗?


您是否需要账单或技术支持?