我的 Amazon OpenSearch Service 集群卡在“处理中”状态。
简短描述
在进行配置更改时,您的 OpenSearch Service 集群进入“处理中”状态。如果发生以下任何一种情况,集群可能会卡在**“处理中”**状态:
- 出现错误,验证检查失败。
- 一组新的资源启动失败。
- 向新数据节点集迁移分片尚未完成。
- 旧资源集未能终止。
当您启动配置更改时,在 OpenSearch Service 创建新环境时,域状态会更改为“处理中”。在新环境中,OpenSearch Service 会启动一组新的适用节点,例如数据节点、专用主节点或 UltraWarm 节点。迁移完成后,旧节点将终止。
您可以在控制台的域状态下查看配置更改的进度。您也可以使用 DescribeDomainChangeProgress API 监控配置更改的进度。有关更多信息,请参阅配置更改的阶段。
解决方法
出现错误,验证检查失败
当您启动配置更改或执行 OpenSearch Service 域版本升级时,OpenSearch Service 会首先执行一系列验证检查。验证检查可确保您的域符合升级条件。当出现错误,验证检查失败时,域可能会卡在**“处理中”**状态。导致验证检查失败的原因有很多。要解决此问题,请参阅验证错误故障排除。按照与验证错误相关的故障排除步骤进行操作,然后重新进行配置更改。
一组新的资源启动失败
如果您在第一个配置更改完成之前又同步向集群提交了其他配置更改,那么集群可能会卡住。当您提交新的配置更改时,请等到这次更改完成后再提交下一项配置更改。
在验证阶段对您的域进行的验证检查在整个配置更改期间保持有效。如果您的配置通过了验证阶段,请避免修改您的域所依赖的资源。例如,不要停用用于加密的 AWS Key Management Service(AWS KMS)密钥。
如果您的域遇到 ClusterBlockException 错误,它也可能会被卡住。发生这种情况的原因可能是可用存储空间不足或 JVM 内存压力高。有关更多信息和故障排除,请参阅 ClusterBlockException。
**注意:**您可以在 Amazon CloudWatch 中查看 FreeStorageSpace、MasterCPUUtilization 和 MasterJVMMemoryPressure。
向新数据节点集迁移分片尚未完成
当 OpenSearch Service 创建新资源后,分片将开始从旧数据节点集迁移到新数据节点集。此阶段可能需要几分钟到几小时的时间,具体取决于集群的负载和大小。
要监控当前分片在旧节点和新节点之间的迁移情况,请运行以下 API 调用:
GET /<DOMAIN_ENDPOINT>/_cat/recovery?active_only=true
由于以下原因,分片迁移可能失败:
要查看分片的大小,请使用 Elasticsearch 网站上的 cat 分片 API。
要查看分配给每个节点的分片数量,请使用 Elasticsearch 网站上的 cat 分配 API。
要了解某些分片无法分配给新节点的原因,请使用 Elasticsearch 网站上的集群分配说明 API。
如果您有不再需要的旧索引,则可以使用 Elasticsearch 网站上的删除索引 API 来释放存储空间。
如果您的分片因超过最大重试次数而无法分配给该节点,则可以重试分配。使用以下 API 调用增加与该分片关联的“index.allocation.max_retries”索引设置:
PUT <INDEX_NAME>/_settings
{
"index.allocation.max_retries" : 10
}
**注意:**默认情况下,集群会连续尝试分配一个分片最多 5 次。
- 由于内部硬件故障,旧数据节点上的分片可能会在迁移期间卡住。
**注意:**根据您遇到的硬件问题,OpenSearch Service 会运行自我修复脚本以使节点恢复到正常状态。
- 由于分片被卡在一组较旧的节点上而导致被卡住分片的重新分配。要确保分片未卡在任何节点上,请检查索引设置。或者,查看您的集群是否出现 ClusterBlockException 错误。
要识别无法分配给新节点的分片以及相应的索引设置,请使用以下命令:
GET /<DOMAIN_ENDPOINT>/_cluster/allocation/explain?pretty
GET /<DOMAIN_ENDPOINT>/<INDEX_NAME>/_settings?pretty
使用 Elasticsearch 网站上的获取索引设置 API,查看是否出现了以下任一设置:
{
"index.routing.allocation.require._name": "NODE_NAME" (OR)
"index.blocks.write": true
}
如果您在索引设置中找到 "index.routing.allocation.require._name": "<NODE_NAME>",则使用以下 API 调用重置该设置:
PUT /<DOMAIN_ENDPOINT>/<INDEX_NAME>/_settings
{
"index.routing.allocation.require._name": null
}
有关更多信息,请参阅 Elasticsearch 网站上的索引级分片分配筛选。
如果您在索引设置中看到 "index.blocks.write": true,那么您的索引就会有一个禁止写入标记。此禁止写入标记问题可能是由 ClusterBlockException 错误引起的。有关更多信息,请参阅如何解决 OpenSearch Service 中的 403“index_create_block_exception”或“cluster_block_exception”错误?
最佳实践
为避免您的 OpenSearch Service 集群卡在**“处理中”**状态,请遵循以下最佳实践:
- 在提交配置更改之前,请确保您的集群支持蓝绿部署流程。
- 在提交配置更改之前,请先试运行您的更改。
- 确保您的集群没有过载。
- 避免同时提交多项配置更改。
- 考虑在流量较低的时段提交配置更改。
- 监控配置更改的进度。
**注意:**如果出现以下任何一种情况,请联系 AWS Support:
- 您的集群卡在**“处理中”**状态超过 24 小时。
- 您的域卡在“删除旧资源”阶段。