Amazon Elasticsearch Service
开发人员指南 (API 版本 2015-01-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon Elasticsearch Service 问题排查

本节介绍如何确定和解决常见 Amazon Elasticsearch Service 问题。遇到问题时请先参阅本节中的信息,然后再联系 AWS 支持

无法访问 Kibana

Kibana 终端节点不支持已签名的请求。如果您的域的访问控制策略仅向特定 IAM 用户或角色授予访问权限,并且您尚未配置用于 Kibana 的 Amazon Cognito 身份验证,您在尝试访问 Kibana 时可能会收到以下错误:

"User: anonymous is not authorized to perform: es:ESHttpGet"

如果您的 Amazon ES 域使用 VPC 访问,您可能不会收到此错误。而是可能出现请求超时的情况。要了解有关更正此问题和您可以使用的各种配置选项的更多信息,请参阅 控制对 Kibana 的访问关于 VPC 域的访问策略Amazon Elasticsearch Service 访问控制

无法访问 VPC 域

请参阅 关于 VPC 域的访问策略测试 VPC 域

红色集群状态

红色集群状态意味着至少有一个主分片及其副本未分配给某个节点。在红色集群状态持续时,即使索引正常,Amazon ES 也会停止自动拍摄快照。

红色集群状态的最常见原因是集群节点发生故障,以及连续处理繁重负载造成 Elasticsearch 进程崩溃。

注意

Amazon ES 将多达 14 个日常自动快照存储 30 天,如果红色集群状态持续 16 天以上,可能出现永久数据损失。如果 Amazon ES 域进入红色集群状态,AWS Support 可能与您联系,询问您希望自己来解决该问题,还是希望支持团队给予协助。您可以设置一个 CloudWatch 警报,在出现红色集群状态时通知您。

最终,红色分片会导致红色集群,而红色索引会导致红色分片。要确定引起红色集群状态的索引,Elasticsearch 有一些可提供帮助的 API。

  • GET /_cluster/allocation/explain 选择它找到的第一个未分配的分片,并说明为何无法将它分配给节点:

    { "index": "test4", "shard": 0, "primary": true, "current_state": "unassigned", "can_allocate": "no", "allocate_explanation": "cannot allocate because allocation is not permitted to any of the nodes" }
  • GET /_cat/indices?v 显示每个索引的运行状况、文档数量以及磁盘使用情况:

    health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open test1 30h1EiMvS5uAFr2t5CEVoQ 5 0 820 0 14mb 14mb green open test2 sdIxs_WDT56afFGu5KPbFQ 1 0 0 0 233b 233b green open test3 GGRZp_TBRZuSaZpAGk2pmw 1 1 2 0 14.7kb 7.3kb red open test4 BJxfAErbTtu5HBjIXJV_7A 1 0 green open test5 _8C6MIXOSxCqVYicH3jsEA 1 0 7 0 24.3kb 24.3kb

删除红色索引是修复红色集群状态的最快方式。接下来您可以扩展您的 Amazon ES 域以便使用更大的实例类型、更多实例或更多基于 EBS 的存储(取决于红色集群状态的原因),并尝试重新创建引发问题的索引。

如果删除存在问题的索引不可行,您可以还原快照、从索引中删除文档、更改索引设置、减少副本数量或删除其他索引以释放磁盘空间。在重新配置您的 Amazon ES 域之前,一个重要步骤是解决红色集群状态。重新配置具有红色集群状态的域会将问题复杂化,并导致该域卡在正在处理配置状态,直到问题解决。

从连续处理繁重负载恢复

要确定红色集群状态是否源于在数据节点上连续处理繁重负载,请监控以下集群指标。

相关指标 描述 恢复
JVMMemoryPressure

指定用于集群中所有数据节点的 Java 堆的百分比。查看此指标的统计数据最大值,并试图尽可能地减少内存压力下降,因为 Java 垃圾收集器无法回收充足的内存。这种模式可能由于复杂的查询或大型数据字段而产生。

并发标记清除 (CMS) 垃圾收集器在“旧一代”对象空间达到 75% 时触发。此收集器将与其他线程一起运行以将暂停保持为最低限度。如果 CMS 在这些正常收集期间无法回收足够的内存,Elasticsearch 将触发不同的垃圾收集算法来停止所有线程。节点在这些全局暂停 (stop-the-world) 集合期间没有响应,这可能会影响集群稳定性。

如果内存使用率持续增长,Elasticsearch 最终会由于内存不足错误而崩溃。一个很好的经验法则是将使用率保持为低于 80%。

_nodes/stats/jvm API 提供了一个有用的 JVM 统计数据、内存池使用情况和垃圾收集信息摘要:

GET elasticsearch_domain/_nodes/stats/jvm?pretty

为 JVM 设置内存断路器。有关更多信息,请参阅 JVM 内存不足错误

如果问题仍然存在,请删除不必要索引、减少对域的请求的数量或降低其复杂性、添加实例或使用更大的实例类型。

CPU 使用率 指定用于集群中各数据节点的 CPU 资源的百分比。查看此指标的 Maximum 统计数据,并查找连续模式的高使用率。 添加数据节点或增加现有数据节点的实例类型的大小。有关更多信息,请参阅配置 Amazon ES 域
节点 指定集群中的节点数。查看此指标的最小值统计数据。这个值会在该服务为集群部署新的实例队列时波动。 添加数据节点。有关更多信息,请参阅 配置 Amazon ES 域

黄色集群状态

黄色集群状态意味着所有索引的主分片分配给集群中的节点,但是至少有一个索引的副本分片不是如此。单节点集群始终初始化为黄色集群状态,因为不存在 Amazon ES 可分配副本的其他节点。要获得绿色集群状态,请增加节点数。有关更多信息,请参阅 调整 Amazon ES 域大小配置 Amazon ES 域

ClusterBlockException

您可能会由于以下原因收到 ClusterBlockException 错误。

缺少可用存储空间

如果所有节点都没有足够的存储空间来容纳重新分配的分片,添加文档和创建索引之类的基本写入操作可能开始失败。计算存储要求提供了 Amazon ES 对磁盘空间的使用方式的摘要。

要避免问题,请在 Amazon ES 控制台中监控 FreeStorageSpace 指标并创建 CloudWatch 警报,使该警报在 FreeStorageSpace 降至特定阈值以下时触发。GET /_cat/allocation?v 还提供了分片分配和磁盘使用情况的有用摘要。要解决与缺少存储空间相关的问题,请扩展您的 Amazon ES 域,以使用更大的实例类型、更多实例或更多基于 EBS 的存储。有关说明,请参阅配置 Amazon ES 域

由于内存不足而阻止磁盘

JVMMemoryPressure 指标超过 92% 达 30 分钟时,Amazon ES 将触发保护机制并阻止所有写入操作以防止集群进入红色状态。当打开保护时,写入操作将失败并返回 ClusterBlockException 错误,无法创建新索引,并且会引发 IndexCreateBlockException 错误。

JVMMemoryPressure 指标回到 88% 或以下达 5 分钟时,将禁用保护,并取消阻止到集群的写入操作。

JVM 内存不足错误

JVM OutOfMemoryError 通常意味着触发了以下一种 JVM 断路器。

断路器 描述 集群设置属性
父级断路器 允许所有断路器占用的 JVM 堆内存百分比总和。默认值为 70%. indices.breaker.total.limit
现场数据断路器 将单个数据字段加载到内存时所允许的 JVM 堆内存百分比。默认值为 60%.如果您通过大型字段上传数据,我们建议您提高此限制。 indices.breaker.fielddata.limit
请求断路器 允许用于响应服务请求的数据结构所占的 JVM 堆内存百分比。默认值为 40%.如果您的服务请求涉及计算聚合,我们建议您提高此限制。 indices.breaker.request.limit

集群节点失败

Amazon EC2 实例可能会遇到意外终止并重新启动。通常情况下,Amazon ES 将重启节点。但是,Elasticsearch 集群中的一个或多个节点可能会停留在发生故障状态。

要检查这种情况,请在 Amazon ES 控制台中打开域控制面板。选择 Cluster health (集群运行状况) 选项卡,然后选择 Nodes (节点) 指标。查看所报告的节点数是否少于您为集群配置的数量。如果指标显示一个或多个节点出现故障已超过 1 天,请联系 AWS 支持

您还可以设置一个 CloudWatch 警报以在此问题发生时通知您。

注意

节点指标在更改集群配置和服务例行维护期间不准确。此行为是预期的。该指标会报告正确数量的集群节点。要了解更多信息,请参阅“关于配置更改”。

为保护您的集群意外终止和重新启动节点,请在 Amazon ES 域为每个索引至少创建一个副本。

无法关闭索引

Amazon ES 不支持 _close API。如果您要从快照还原某个索引,则可以删除现有索引(在为快照重新建立索引之前或之后)。另一个方法是使用 rename_patternrename_replacement 字段在还原索引时对其进行重命名:

POST /_snapshot/my-repository/my-snapshot/_restore { "indices": "my-index-1,myindex-2", "include_global_state": true, "rename_pattern": "my-index-(\\d)", "rename_replacement": "restored-my-index-$1" }

如果您打算重建、缩减或拆分某个索引,您可能希望在执行操作前停止对该索引的写入操作。

无法通过 SSH 登录节点

您无法使用 SSH 访问 Elasticsearch 集群中的任何节点,并且无法直接修改 elasticsearch.yml。相反,请使用控制台、AWS CLI 或开发工具包来配置您的域。您还可以使用 Elasticsearch REST API 指定几个集群级设置。要了解更多信息,请参阅Amazon Elasticsearch Service 配置 API 参考支持的 Elasticsearch 操作

如果您需要更深入地了解集群的性能,则可以将错误日志和慢速日志发布到 CloudWatch

“对对象的存储类无效”快照错误

Amazon ES 快照不支持 Glacier 存储类。如果 S3 存储桶包含将对象转换为 Glacier 存储类的生命周期规则,则在尝试列出快照时可能会遇到此错误。

如果需要从存储桶中还原快照,请从 Glacier 还原对象,将对象复制到新存储桶,然后将新存储桶注册为快照存储库。

主机标头无效

Amazon ES 要求客户端在请求标头中指定 Host。有效的 Host 值是没有 https:// 的域终端节点,例如:

Host: search-my-sample-domain-ih2lhn2ew2scurji.us-west-2.es.amazonaws.com

如果您收到 Invalid Host Header 错误,请检查您的客户端是否将 Amazon ES 域终端节点(不是其 IP 地址(举例))包含在 Host 标头中。

升级后无法降级

就地升级是不可撤消的,但如果您联系 AWS Support,他们可以帮助您在新域上还原自动的升级前快照。例如,如果您将域从 Elasticsearch 5.6 升级到 6.4,AWS Support 可以帮助您在新的 Elasticsearch 5.6 域上还原升级前快照。如果您制作了原始域的手动快照,您可以自行执行该步骤

需要所有区域的域摘要

以下脚本使用 Amazon EC2 describe-regions AWS CLI 命令创建 Amazon ES 在其中可用的所有区域的列表。然后,它为每个区域调用 list-domain-names

for region in `aws ec2 describe-regions --output text | cut -f3` do echo "\nListing domains in region '$region':" aws es list-domain-names --region $region --query 'DomainNames' done

您将对于每个区域接收以下输出:

Listing domains in region:'us-west-2'... [ { "DomainName": "sample-domain" } ]

Amazon ES 在其中不可用的区域返回“无法连接到终端节点 URL”。

使用 Kibana 时出现浏览器错误

当您在 Amazon ES 域中使用 Kibana 查看数据时,浏览器将在 HTTP 响应对象中包括服务错误消息。您可以使用 Web 浏览器中常用的开发人员工具 (如 Chrome 中的开发者工具) 来查看基础服务错误和帮助您进行调试工作。

在 Chrome 中查看服务错误

  1. 从菜单中,依次选择 ViewDeveloperDeveloper Tools

  2. 选择 Network 选项卡。

  3. 状态列中,选择状态为 500 的任何 HTTP 会话。

在 Firefox 中查看服务错误

  1. 从菜单中,依次选择工具Web 开发人员网络

  2. 选择任何状态为 500 的 HTTP 会话。

  3. 选择响应选项卡以查看服务响应。

在选择 VPC 访问后出现未授权的操作

当您使用 Amazon ES 控制台创建新域时,可以选择 VPC 访问权限或公有访问权限。如果您选择了 VPC 访问,Amazon ES 将查询 VPC 信息(如果您没有正确的权限,该操作将失败):

You are not authorized to perform this operation. (Service: AmazonEC2; Status Code: 403; Error Code: UnauthorizedOperation

要启用此查询,您必须有权访问 ec2:DescribeVpcsec2:DescribeSubnetsec2:DescribeSecurityGroups 操作。此要求仅适用于控制台。如果您使用 AWS CLI 来创建和配置一个使用 VPC 终端节点的域,则不需要访问这些操作。

在创建 VPC 域后卡在加载状态

在创建使用 VPC 访问权限的新域后,该域的配置状态可能会卡在正在加载。如果出现此问题,则很可能是因为您对自己的区域禁用 了 AWS Security Token Service (AWS STS)。

要将 VPC 终端节点添加到您的 VPC,Amazon ES 需要代入 AWSServiceRoleForAmazonElasticsearchService 角色。因此,必须启用 AWS STS 才能在给定区域中创建使用 VPC 访问权限的新域。要了解有关启用和禁用 AWS STS 的更多信息,请参阅 IAM 用户指南

在使用开发工具包时出现证书错误

由于 AWS 开发工具包使用的是来自计算机的 CA 证书,因此更改 AWS 服务器上的证书可能会导致您在尝试使用开发工具包时无法连接。虽然错误消息是不同的,但通常包含以下文本:

Failed to query Elasticsearch ... SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

您可以通过使计算机的 CA 证书和操作系统保持最新来防止出现这些故障。如果您在公司环境中遇到这个问题而且未管理您自己的计算机,则可能需要请求管理员来协助处理更新过程。

以下列表显示了最低的操作系统和 Java 版本:

  • 已安装 2005 年 1 月版或更高版本更新的 Microsoft Windows 版本在其信任列表中至少包含一个必需 CA。

  • 带 Java for Mac OS X 10.4 版本 5 的 Mac OS X 10.4 (2007 年 2 月版)、Mac OS X 10.5 (2007 年 10 月版) 及更高版本在其信任列表中至少包含一个必需 CA。

  • Red Hat Enterprise Linux 5 (2007 年 3 月版)、6 和 7 以及 CentOS 5、6 和 7 在其默认信任 CA 列表中至少包含一个必需 CA。

  • Java 1.4.2_12 (2006 年 5 月版)、5 Update 2 (2005 年 3 月版) 以及所有更高版本,包括 Java 6 (2006 年 12 月版)、7 和 8 在其默认信任 CA 列表中至少包含一个必需 CA。

这三个证书颁发机构为:

  • Amazon Root CA 1

  • Starfield Services Root Certificate Authority – G2

  • Starfield Class 2 Certification Authority

可以从 Amazon Trust Services 获得来自前两个颁发机构的根证书,而使您的计算机保持最新是更直接的解决方案。要了解有关 ACM 提供的证书的更多信息,请参阅 AWS Certificate Manager 常见问题

注意

目前,us-east-1 区域内的 Amazon ES 域使用的是来自其他颁发机构的证书。我们计划近期将该区域更新为使用这些新的证书颁发机构。