上次更新日期:2021 年 3 月 18 日
我的 Amazon Elasticsearch Service (Amazon ES) 集群处于红色或黄色状态。为什么会发生这种情况?
简短描述Amazon ES 控制台中的监控选项卡用于显示集群中运行状况最差的索引的状态。显示红色状态的集群状态并不意味着您的集群出现了故障。而是表示至少有一个主分区及其副本未分配给节点。如果您的集群状态显示黄色状态,则表示已将所有索引的主分区分配给集群中的节点。但是,至少一个索引的副本分区不会分配给任何节点。
注意:在您首次解决红色集群状态之前,请勿重新配置 Amazon ES 域。如果您尝试在 Amazon ES 域处于红色集群状态时重新配置该域,则您的域可能会卡在“正在处理”状态。有关集群卡在“正在处理”状态的更多信息,请参阅我的 Amazon Elasticsearch Service (Amazon ES) 域为什么卡在“正在处理”状态?
您的 Elasticsearch 集群也可能因以下原因而进入红色状态:
多数据节点故障 为索引使用损坏的或红色的分区 高 JVM 内存压力或 CPU 利用率 磁盘空间不足或磁盘偏斜注意:在某些情况下,您可以通过删除然后从自动快照中恢复索引来解决红色集群状态。
您的 Elasticsearch 集群也可能因以下原因而进入黄色运行状态:
创建新索引 没有足够的节点分配给分区或磁盘偏斜 高 JVM 内存压力 单节点故障 已超过分区分配重试的最大次数注意:如果您的黄色集群状态无法自行解决,则可以通过更新索引设置或手动重新路由未分配的分区来解决状态。如果您的黄色集群状态无法自行解决,请确定并排查根本原因。要防止出现黄色集群状态,请应用集群运行状态最佳实践。
解决方法 确定未分配分区的原因要识别未分配的分区,请执行以下步骤:
1.列出未分配的分区:
$ curl -XGET 'ES_Endpoint/_cat/shards?h=index,shard,prirep,state,unassigned.reason' | grep UNASSIGNED
2.检索为什么未分配分区的详细信息:
$ curl -XGET 'ES_Endpoint/_cluster/allocation/explain?pretty' -H 'Content-Type:application/json' -d'{"index": "<index name>", "shard": <shardId>, "primary":<true or false>}'
3.可选)对于红色集群状态,删除所关注的索引,然后确定并解决根本原因:
curl -XDELETE 'ES_Endpoint/<index names>'
然后,确定可用的快照并从快照还原索引:
curl -XGET 'elasticsearch-domain-endpoint/_snapshot?pretty'
对于黄色集群状态,请解决根本原因,以便分配分区。
排查红色或黄色集群状态没有足够的节点分配给分区
副本分区不会被分配给与其主分区相同的节点。具有副本分区的单节点集群始终以黄色集群状态进行初始化。以这种方式初始化单节点集群,因为 Amazon ES 没有其他可用节点可以分配副本。
此外,Elasticsearch 版本 7.x 及更高版本的默认限制为“1000”个 cluster.max_shards_per_node 设置。最佳实践是将 cluster.max_shards_per_node 设置保持为默认值“1000”。如果您设置了分区分配筛选条件以控制 Elasticsearch 如何分配分区,可能会因为没有足够的已筛选节点而未能分配分区。为了防止出现此节点短缺情况,请增加节点计数。确保每个主分区的副本数少于数据节点的数量。您还可以减少副本分区的数量。有关详细信息,请参阅调整 Amazon ES 域名的大小和 Demystifying Elasticsearch shard allocation。
磁盘空间不足或磁盘偏斜
如果磁盘空间不足,Elasticsearch 集群可能会进入红色或黄色运行状况。在 Amazon ES 分发分区之前,必须有足够的磁盘空间来容纳分区。
要查看集群中各个节点的可用存储空间大小,请使用以下语法:
$ curl ES_Endpoint/_cat/allocation?v
有关存储空间问题的详细信息,请参阅如何解决我的 Amazon Elasticsearch Service 域中存储空间不足的问题?
磁盘偏斜严重也可能导致某些数据节点存储空间不足的问题。如果您决定重新分配任何分区,则可能会在分区分配期间取消分区分配进程。要解决此问题,请参阅如何重新平衡我的 Amazon Elasticsearch Service 集群中的不均匀分区分配?
基于磁盘的分区分配设置还可能导致出现未分配的分区。例如,如果 cluster.routing.allocation.disk.watermark.low 指标设置为 50GB,那么指定的磁盘空间必须可用于分区分配。
要检查当前基于磁盘的分区分配设置,请使用以下语法:
$ curl -XGET ES_Endpoint/_cluster/settings?include_defaults=true&flat_settings=true
要解决磁盘空间问题,请考虑以下方法:
删除任何不需要的索引。 纵向扩展 EBS 卷。 添加更多数据节点。高 JVM 内存压力
每个分区分配都使用 CPU、堆空间以及磁盘和网络资源。持续高水平的 JVM 内存压力可能会导致分区分配失败。例如,如果 JVM 内存压力超过 95%,则将触发内存父断路器。然后,分配线程将被取消,使分区处于未分配状态。
要解决此问题,请首先降低 JVM 内存压力级别。在 JVM 内存压力降低后,请考虑以下附加提示,以使集群恢复到绿色运行状态:
将默认分区重试值从“5”或更高值增加。 禁用并启用副本分区。 手动重试未分配的分区。有关降低 JVM 内存压力的更多信息,请参阅如何排查 Amazon Elasticsearch Service 集群的高 JVM 内存压力问题?
节点故障
当集群遇到节点故障时,分配给节点的分区将变为未分配状态。当给定索引没有可用的副本分区时,即使单个节点故障也可能导致红色的运行状态。拥有两个副本分区和多可用区部署可以保护您的集群,以免在硬件故障期间出现数据丢失情况。
如果您的所有索引都有副本分区,则单节点故障可能会导致集群暂时进入黄色运行状况。如果您的集群暂时进入黄色运行状况,则只要节点再次运行正常,Amazon ES 将自动恢复。或者,当分区分配给新节点时,Amazon ES 将恢复。
您可以通过检查 Amazon CloudWatch 指标来确认是否存在任何节点故障。有关识别节点故障的更多信息,请参阅失败的集群节点。
注意:这也是为每个索引分配一个副本分区或者使用专用主节点并启用区域感知的最佳实践。有关更多信息,请参阅 Elasticsearch 网站上的处理故障。
已超过最大重试次数
在 Amazon ES 中,您的集群不得超过分区分配的最大时间限制 (5000 ms) 或重试次数 (5)。如果您的集群已达到最大阈值,则必须手动触发分区分配。要手动触发分区分配,请禁用然后重新启用索引的副本分区。
集群上的配置变更也可能触发分区分配。但是,当集群处于红色运行状态时,请避免对集群执行任何配置更改。有关分区分配的更多信息,请参阅 Elasticsearch 网站上的每个分区都需要有个家。
注意:如果集群的工作负载繁重,则手动触发分区分配不是最佳实践。如果从索引中删除所有副本,索引必须且仅能依赖于主分区。当节点发生故障时,您的集群会进入红色运行状态,因为主分区为未分配状态。
要禁用副本分区,请将 number_of_replicas 值更新为“0”:
$ curl -XPUT 'ES_Endpoint/<indexname>/_settings' -H 'Content-Type: application/json' -d'
{
"index" : {
"number_of_replicas" : 0
}
}'
另外,请检查以确保 number_of_replicas 设置被设置为“false”。当集群恢复到绿色运行状况时,您可以将 index.number_of_replicas 值设置回到所需的值,以触发副本分区的分配。如果分区分配成功,您的集群将进入绿色运行状况。
集群运行状况最佳实践要解决黄色或红色集群状态,请考虑以下最佳实践:
为 AutomatedSnapshotFailure 设置推荐的 Amazon CloudWatch 警报。通过此警报,您可以确保自己有一个可用的快照,以在集群进入红色状态时恢复索引。 如果您的集群处于持续繁重的工作负载之下,请扩展集群。有关扩展 Elasticsearch 集群的更多信息,请参阅如何纵向扩展 Amazon Elasticsearch Service 域? 监控磁盘使用情况、JVM 内存压力和 CPU 使用情况,并确保它们未超过设定的阈值。有关更多信息,请参阅推荐的 CloudWatch 警报和集群指标。 确保所有主分区都具有副本分区,以防止任何节点故障。有关 Amazon ES 最佳实践的更多信息,请参阅 Amazon Elasticsearch Service 最佳实践。