目录

1.Elasticsearch健康状态

2. 如何解决健康状态为黄色?

3. 如何解决健康状态为红色?

1.Elasticsearch健康状态

Elasticsearch 集群健康状态分为三种:

green:最健康得状态,说明所有的分片包括备份都可用; 这种情况Elasticsearch集群所有的主分片和副本分片都已分配, Elasticsearch集群是 100% 可用的。

yellow:基本的分片可用,但是备份不可用(或者是没有备份);  这种情况Elasticsearch集群所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。不过,你的高可用性在某种程度上被弱化。如果 更多的 分片消失,你就会丢数据了。把 yellow 想象成一个需要及时调查的警告。

red:部分的分片可用,表明分片有一部分损坏。此时执行查询部分数据仍然可以查到,遇到这种情况,还是赶快解决比较好; 这种情况Elasticsearch集群至少一个主分片(以及它的全部副本)都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。

Elasticsearch 集群不健康时的排查思路:

1) 首先确保 es 主节点最先启动,随后启动数据节点;

2) 允许 selinux(非必要),关闭 iptables;

3)  确保数据节点的elasticsearch配置文件正确;

4)  系统最大打开文件描述符数是否够用;

5)  elasticsearch设置的内存是否够用 ("ES_HEAP_SIZE"内存设置 和 "indices.fielddata.cache.size"上限设置);

6)  elasticsearch的索引数量暴增 , 删除一部分索引(尤其是不需要的索引);

注意: 如下是单机单节点部署Elasticsearch, 集群状态可能为yellow, 因为单点部署Elasticsearch, 默认的分片副本数目配置为1,而相同的分片不能在一个节点上,所以就存在副本分片指定不明确的问题,所以显示为yellow。

可以通过在Elasticsearch集群上添加一个节点来解决问题,如果不想这么做,可以删除那些指定不明确的副本分片(当然这不是一个好办法)删除操作如下。

删除副本分片的办法:curl -XPUT "http://localhost:9200/_settings" -d' {  "number_of_replicas" : 0 } '

节点数和备份数遵循原则:

节点数和备份数应遵循: N >= R + 1, N为节点数,R为number_of_replicas设置的值

2. 如何解决健康状态为黄色?

       问题描述:单机版Elasticsearch,版本6.7.0,使用head查看发现集群健康值显示黄色?

黄色表示基本的分片可用,但是备份不可用(或者是没有备份),查看es,发现主节点某个分片出现问题,变成Unassigned,例如下图dfy_index在node-1中的分片2会显示在unassigned那一排,集群状态为红色或者黄色

es健康 es健康状态异常_数据

unssigned表示未分配副本分片的问题,在执行settings中删除副本分片的命令后, 这个问题就解决了。

原因:索引的“number_of_replicas (备份数)”为1,而节点只有1个,所以备份出来的数据没有节点可分配。

解决办法:增加节点或者删除副本把number_of_replicas设置为0,这里因为是单机,选择删除副本。

方法1:删除副本统一设置

curl -XPUT -H "Content-Type: application/json" "http://localhost:9200/_settings" -d' {"index" : { "number_of_replicas" : 0 } }'

es健康 es健康状态异常_数据_02

方法2: 修改elasticsearch.yml配置文件

文件末增加(冒号之后有空格)

index.number_of_replicas: 0

如果设置单个索引设置

curl -XPUT 'localhost:9200/<INDEX_NAME>/_settings' -d '{"number_of_replicas": 0}'

现在使用head插件查看es,集群健康值显示为绿色:

es健康 es健康状态异常_Elastic_03

 

3. 如何解决健康状态为红色?

集群健康值显示为red,则说明至少一个主分片分配失败, 这将导致一些数据以及索引的某些部分不再可用。遇到这种情况,还是赶快解决比较好。

es健康 es健康状态异常_Elastic_04

原因:集群中部分节点的主分片未分配。r通常时由于某个索引的住分片为分片unassigned,只要找出这个索引的分片,手工分配即可。

如何解决 unassigned 分片问题?

方法一:删除索引——如果这个分片数据已经不可用,直接删除该分片 (即删除索引)

Elasticsearch中没有直接删除分片的接口,除非整个节点数据已不再使用,删除节点。

删除索引命令:curl -XDELETE  http://10.0.8.44:9200/索引名

方法二:是否违背节点备份原则 N >= R + 1

公式:集群中节点数量 >= 集群中所有索引的最大副本数量 +1

1) 添加节点处理,即N增大; 

2) 删除副本分片,即R置为0;

curl -XPUT 'localhost:9200/<INDEX_NAME>/_settings' -d '{"number_of_replicas": 0}'

方法三:allocate重新分配分片

如果方案二仍然未解决,可以考虑重新分配分片。可能的原因:

1) 节点在重新启动时可能遇到问题。正常情况下,当一个节点恢复与群集的连接时,它会将有关其分片的信息转发给主节点,然后主节点将这分片从“未分配”转换为 "已分配/已启动"。

2) 当由于某种原因 (例如节点的存储已被损坏) 导致该进程失败时,分片可能保持未分配状态。

在这种情况下,必须决定如何继续: 尝试让原始节点恢复并重新加入集群(并且不要强制分配主分片);  或者强制使用Reroute API分配分片并重新索引缺少的数据原始数据源或备份。 如果你决定分配未分配的主分片,请确保将"allow_primary":"true"标志添加到请求中。

curl -XPOST '{ESIP}:9200/_cluster/reroute' -d '{
    "commands" : [ {
          "allocate" : {
              "index" : "eslog1",
              "shard" : 4,
              "node" : "es1",
              "allow_primary" : true
          }
        }
    ]
}'

现在使用head插件查看es,集群健康值显示为绿色(如果还不是,请考虑其它原因)。