干货 | Elasticsearch 集群健康值红色终极解决方案【转】

题记

Elasticsearch当清理缓存( echo 3 > /proc/sys/vm/drop_caches )的时候,出现 
以下集群健康值:red,红色预警状态,同时部分分片都成为灰色。 
这里写图片描述 
查看Elasticsearch启动日志会发现以下: 
集群服务超时链接的状况。node

bserver: timeout notification from cluster service. timeout setting [1m], time since start [1m]
  • 1

该问题排查耗时很长,问题已经解决。 
特将问题排查及解决方案详尽的整理出来。缓存

一、集群状态解读

head插件会以不一样的颜色显示。 
1)、绿色——最健康的状态,表明全部的主分片和副本分片均可用; 
2)、黄色——全部的主分片可用,可是部分副本分片不可用; 
3)、红色——部分主分片不可用。(此时执行查询部分数据仍然能够查到,遇到这种状况,仍是赶快解决比较好。) 
参考官网:http://t.cn/RltLEpN(部分中文集群健康状态博文资料翻译的不够精确,以官网为准)ruby

若是集群状态为红色, Head插件显示:集群健康值red 。则说明:至少一个主分片分配失败。bash

这将致使一些数据以及索引的某些部分再也不可用。app

尽管如此, ElasticSearch仍是容许咱们执行查询,至因而通知用户查询结果可能不完整仍是挂起查询,则由应用构建者来决定。curl

二、什么是unassigned 分片?

一句话解释:未分配的分片。 
启动ES的时候,经过Head插件不停刷新,你会发现集群分片会呈现紫色、灰色、最终绿色的状态。ui

三、为何会出现 unassigned 分片?

若是不能分配分片,例如,您已经为集群中的节点数过度分配了副本分片的数量,则分片将保持UNASSIGNED状态。 
其错误码为:ALLOCATION_FAILED。url

你能够经过以下指令,查看集群中不一样节点、不一样索引的状态。spa

GET _cat/shards?h=index,shard,prirep,state,unassigned.reason
  • 1

四、出现unassigned 分片后的症状?

head插件查看会:Elasticsearch启动N长时候后,某一个或几个分片仍持续为灰色。插件

五、unassigned 分片问题可能的缘由?

1)INDEX_CREATED:因为建立索引的API致使未分配。 2)CLUSTER_RECOVERED :因为彻底集群恢复致使未分配。 3)INDEX_REOPENED :因为打开open或关闭close一个索引致使未分配。 4)DANGLING_INDEX_IMPORTED :因为导入dangling索引的结果致使未分配。 5)NEW_INDEX_RESTORED :因为恢复到新索引致使未分配。 6)EXISTING_INDEX_RESTORED :因为恢复到已关闭的索引致使未分配。 7)REPLICA_ADDED:因为显式添加副本分片致使未分配。 8)ALLOCATION_FAILED :因为分片分配失败致使未分配。 9)NODE_LEFT :因为承载该分片的节点离开集群致使未分配。 10)REINITIALIZED :因为当分片从开始移动到初始化时致使未分配(例如,使用影子shadow副本分片)。 11)REROUTE_CANCELLED :做为显式取消从新路由命令的结果取消分配。 12)REALLOCATED_REPLICA :肯定更好的副本位置被标定使用,致使现有的副本分配被取消,出现未分配。

六、集群状态红色如何排查?

症状:集群健康值红色; 
日志:集群服务链接超时; 
可能缘由:集群中部分节点的主分片未分配。 
接下来的解决方案主要围绕:使主分片unsigned 分片完成再分配展开。

七、如何Fixed unassigned 分片问题?

方案一:极端状况——这个分片数据已经不可用,直接删除该分片。 
ES中没有直接删除分片的接口,除非整个节点数据已再也不使用,删除节点。 
curl -XDELETE ‘localhost:9200/index_name/’

方案二:集群中节点数量>=集群中全部索引的最大副本数量 +1。 
N> = R + 1 
其中: 
N——集群中节点的数目; 
R——集群中全部索引的最大副本数目。 
知识点:当节点加入和离开集群时,主节点会自动从新分配分片,以确保分片的多个副本不会分配给同一个节点。换句话说,主节点不会将主分片分配给与其副本相同的节点,也不会将同一分片的两个副本分配给同一个节点。 
若是没有足够的节点相应地分配分片,则分片可能会处于未分配状态。 
因为个人集群就一个节点,即N=1;因此R=0,才能知足公式。

问题就转嫁为: 
1)添加节点处理,即N增大; 
2)删除副本分片,即R置为0。 
R置为0的方式,能够经过以下命令行实现:

root@tyg:/# curl -XPUT "http://localhost:9200/_settings" -d' { "number_of_replicas" : 0 } ' {"acknowledged":true}
  • 1
  • 2

方案三:allocate从新分配分片。 
若是方案二仍然未解决,能够考虑从新分配分片。

可能的缘由:

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

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

在这种状况下,您必须决定如何继续:尝试让原始节点恢复并从新加入集群(而且不要强制分配主分片);

或者强制使用Reroute API分配分片并从新索引缺乏的数据原始数据源或备份。 
若是您决定分配未分配的主分片,请确保将“allow_primary”:“true”标志添加到请求中。

ES5.X使用脚本以下:

NODE="YOUR NODE NAME" IFS=$'\n' for line in $(curl -s 'localhost:9200/_cat/shards' | fgrep UNASSIGNED); do INDEX=$(echo $line | (awk '{print $1}')) SHARD=$(echo $line | (awk '{print $2}')) curl -XPOST 'localhost:9200/_cluster/reroute' -d '{ "commands": [ { " allocate_replica ": { "index": "'$INDEX'", "shard": '$SHARD', "node": "'$NODE'", "allow_primary": true } } ] }' done

 

—————————————————————————————

相关文章
相关标签/搜索