Elasticsearch:索引状态是红色还是黄色?为什么?

Posted Elastic 中国社区官方博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch:索引状态是红色还是黄色?为什么?相关的知识,希望对你有一定的参考价值。

在我之前文章 “Elasticsearch:如何调试集群状态 - 定位错误信息” 中,我有详细介绍如何调试集群状态。在今天的文章中,我将详细介绍如何故障排除和修复索引状态。

Elasticsearch 是一个伟大而强大的系统,特别是创建一个可扩展性极强的分布式数据存储,并自动跟踪、管理和路由索引中的所有数据。

但有时事情会出错,索引会遇到或大或小的麻烦。 这通常最终会导致它们具有红色或黄色的状态。 集群将紧随其后,因为它的状态是所有索引中最差的,例如 如果一个索引为红色,则集群为红色。

如果你的集群和一些索引是红色或黄色的,你会怎么做? 那么,你需要找出原因。 你是怎样做的? 

红色黄色是什么意思?

首先,说一下颜色的含义,因为它们看起来很复杂,但最终很简单:

  • 黄色 —— 一个或多个索引缺少(“未分配 - unassigned”)副本分片。 索引仍在工作,可以完全索引、搜索和提供数据,只是没有我们想要的那么快和可靠。
  • 丢失的碎片可能真的丢失、损坏或有其他问题; 或者集群可能正处于移动或重建这些丢失的分片的过程中。
  • 我们的工作是手动或自动重新创建这些丢失的副本以达到绿色。
  • 红色 —— 一个或多个索引缺少主分片并且无法正常工作,即它无法索引、搜索或提供数据。
  • 请注意,这是基于每个分片的,因此即使有 50 个分片,也只需要一个分片失效即可将索引和集群变为红色。
  • 我们的工作是手动查找或修复这些缺失的主索引,如果可以的话,否则索引就会丢失,必须从快照或原始源数据中重新创建。

查找红色黄色索引

1) 第一步是确定你知道的主要问题,例如死节点、磁盘空间问题等可能产生问题的问题。 这有助于告知我们寻找什么以及我们以后如何修复它。

有时你只需要耐心等待,因为系统通常会通过移动数据来修复自身,例如将副本提升为主要副本,然后重新创建新副本,但这需要时间,从几分钟到更长,具体取决于分片数量和大小, 集群负载、磁盘速度等。

但你不能指望这一点,除非很明显系统正在自我修复。 有时事情真的坏了,这就是为什么了解历史是件好事,因为重启节点肯定会使一些索引变黄,但几分钟后又变绿。

2) 第二步是确定哪些索引有问题,有多少索引有问题。 _cat API 可以通过状态告诉我们:

GET /_cat/indices?v&health=red
GET /_cat/indices?v&health=yellow

从中我们可以了解我们有多少问题,这可能与上面讨论的任何最近事件有关。 我们还需要这个列表,以便我们可以更深入地挖掘每个索引。

3) 第三步是查看哪些分片有问题以及原因。 这与索引列表有关,但索引列表只会告诉你哪些索引有问题,现在我们需要每个分片的问题列表。

我们为此使用 _cat 接口,理想情况下使用排序和一些额外的列,例如这将列出按状态排序的索引,包括未分配的基本原因 - 查找 UNASSIGNED 状态:

GET /_cat/shards?v&h=n,index,shard,prirep,state,sto,sc,unassigned.reason,unassigned.details&s=sto,index

这可能足以了解正在发生的事情,其中有未分配的详细信息列,我们可以从中解决问题。 但有时我们需要更多细节,特别是当我们有节点路由或其他更复杂的问题时。

我们可以询问集群为什么分片没有分配 …

为此,我们可以要求集群解释给定分片的当前分配情况和逻辑。 这有点混乱,因为我们需要上面列表中的两个分片编号(从 0 开始),并且要知道我们是否要查看主分片或副本,同样来自上面的列表。

API 调用是这样的,这里需要设置索引名,分片号,primary true/false:

GET _cluster/allocation/explain

  "index": ".ds-heartbeat-8.6.1-2023.03.27-000001",
  "shard": 0,
  "primary": true

这将使您更详细地了解情况,接下来要做什么取决于您在那里找到的原因。

一些常见问题包括:

  • 磁盘空间不足 —— 没有空间可以分配。请详细阅读文章 “Elasticsearch:Low disk watermark”。
  • 分片计数限制 —— 每个节点的分片太多,这在创建新索引或删除某些节点并且系统无法为它们找到位置时很常见。
  • JVM 或堆限制 —— 一些版本可以在 RAM 不足时限制分配
  • 路由或分配规则 —— 常见的 HA(Highly Available)云或大型复杂系统
  • 损坏或严重问题 —— 可能会出现更多问题,每个问题都需要特别注意或解决方案,或者在许多情况下,只需删除旧分片并添加新副本或主分片。

修复红色和黄色索引

第四步是修复问题。 修复分为几类:

  • 等待并让 Elasticsearch 修复它 —— 对于节点重启等临时情况
  • 手动分配分片 —— 有时需要解决问题
  • 检查路由/分配规则 —— 许多 HA 或复杂系统使用路由或分配规则来控制放置,随着情况的变化,这可能会创建无法分配的分片。 解释应该清楚这一点。
  • 通过将数字设置为 0 来删除所有副本 —— 也许你无法修复副本或手动移动或分配它。 在这种情况下,只要你有一个主节点(索引是黄色的,而不是红色的),你总是可以将副本计数设置为 0,等一下,然后设置回 1 或任何你想要的,使用:“index” :“number_of_replicas”:0

我们将在出现状态和解决方案时添加更多详细信息,但这是一个复杂的问题,并且与所有系统一样,修复会根据问题的确切细节和历史记录而有所不同。 

ElasticSearch 集群与索引Red&Yellow状态分析思路

参考技术A ES的索引有红,黄,绿三种状态,其中绿色代表正常状态,红色和黄色则说明多少有一些问题。我们在正常的ES运维过程中常常需要处理这些情况。

先说明索引的三种颜色代表的意义吧:

绿色:索引的所有分片都正常分配。

黄色:至少有一个副本没有得到正确的分配。

红色:至少有一个主分片没有得到正确的分配。

集群和节点同样有三种颜色,这个颜色取决于相关索引的最差状况。比如说,整个集群中有3个节点,10个索引,每个索引分成3个分片,并有一份副本。如果其中有一个节点离线,上面有多个索引的主分片。那么集群的状态就是红色(red)

事实上,索引状态变成红色或者黄色并不一定是出了问题。这些情况可以通过 cat API查询获知,参考文档: https://www.elastic.co/guide/en/elasticsearch/reference/7.1/cat-shards.html

下面这些情况有可能是正常的情况,可能导致索引的状态临时性的变成红色和黄色。

INDEX_CREATED : 集群正在创建索引。

CLUSTER_RECOVERED : 集群处于重启阶段。

INDEX_OPENED : 正在重新打开一个已经关闭的索引。

NEW_INDEX_RESTORED :还原数据到一个新索引。

EXISTING_INDEX_RESTORED : 还原数据到一个已经关闭的索引。

REPLICA_ADDED : 索引的设置被修改,副本数增加。

REROUTE_CANCELLED : 由于reroute命令被取消导致有一些分片没有被分配。

REINITIALIZED :由于一个分片的状态重新退回到初始化导致。

REALLOCATED_REPLICA :副本位置变化导致未分配。

只有下面几个状态是明确地由于分片错误导致的:

ALLOCATION_FAILED : 由于配置原因或者资源问题导致未分配情况。

DANGLING_INDEX_IMPORTED : 副本在节点离线情况下被修改,在这个副本回到集群中时会产生此问题。

在运维的过程中,如果发现集群的状态变成黄色或者红色,我们不妨等一等,很多问题会在短时间消失。然而,并不是所有错误都能自动修复,如果发现集群状态一直不正常的情况下,我们需要分析具体情况,找出导致问题的根本原因,再将其修复。

ES提供了 health API供我们查询集群的状态和发现问题的原因:

参考文档: https://www.elastic.co/guide/en/elasticsearch/reference/7.1/cluster-health.html

我们可以看到一些用法:

GET _cluster/health :检测集群的健康状态,可以使用这个API检测集群的节点数量

GET _cluster/health?level=indices : 查看全部索引的状态,找出有问题的索引

GET _cluster/health/index_name : 检测某个索引的状态,分析问题

GET _cluster/health?level=shards : 查看分片分配的情况,寻找未分配的分片

GET _cluster/allocation/explain : 查看第一个未分配分配的故障原因

在找到原因后,需要对一些不能自动恢复的问题进行修复。

比如,由于routing的设置,某些索引需要在标记为hot的节点上进行分配,但是集群内并没有标记为hot的节点,这时,索引就会由于主分片无法分配而处于红色状态。解决这种问题,可以向集群中添加或者将集群中某些节点标记为hot来解决,也可以改变routing的策略使得索引主分片可以被正确分配。

又比如,如果当前集群只有一个节点,但是索引的副本配置并非是0,这时副本分片会由于没有多余的节点而无法分配。需要往集群中添加新节点或者将副本配置设为0。

节点的磁盘空间不足可能导致相关分片无法分配,解决方法是增加新节点或者修改分片方案。

上述有一个状态 DANGLING_INDEX_IMPORTED ,是由于节点离线后,其上的索引被修改导致,这种情况是无法自动恢复的。解决方法是删除该有问题的节点。

集群中如果有节点离线,在相关分片重新分配之前,状态也会变为红色或者黄色。重新分配也也会加到集群剩余节点的压力。需要尽快修复问题,将节点重新上线。

集群状态变成红色或者黄色是运维时经常会出现的状况,并不是所有的情况都是因为故障导致,一些正常的操作也会导致红色或者黄色的状况,并且会在一段时间之内自动恢复。由于故障导致的状态变化往往不会自动恢复,需要通过一些手段进行调查,寻找解决方案并修复问题。

以上是关于Elasticsearch:索引状态是红色还是黄色?为什么?的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch 集群状态变成黄色或者红色,怎么办?

Elasticsearch 集群状态变成黄色或者红色,怎么办?

elasticsearch 创建索引unassignedelasticsearch 创建索引后出现unassigned

Elasticsearch 集群状态变成黄色或者红色,怎么办?

Elasticsearch 有未分配的分片 详细思路

ElasticSearch 索引查询使用指南(开发笔记170203)