Elasticsearch集群健康状态为"red"现象的排查分析
通过Elasticsearch的Head插件访问, 发现Elasticsearch集群的健康值为red, 则说明至少一个主分片分配失败, 这将导致一些数据以及索引的某些部分不再可用。head插件会以不同的颜色显示, 绿色表示最健康的状态,代表所有的主分片和副本分片都可用; 黄色表示所有的主分片可用,但是部分副本分片不可用; 红色表示部分主分片不可用. (此时执行查询部分数据仍然可以查到,遇到这种情况,还是赶快解决比较好)

接着查看Elasticsearch启动日志会发现集群服务超时连接的情况:
|
1
|
timeout notification from cluster service. timeout setting [1m], time since start [1m] |
什么是unassigned 分片?
一句话解释:未分配的分片。 启动ES的时候,通过Head插件不停刷新,就会发现集群分片会呈现紫色、灰色、最终绿色的状态。
为什么会出现 unassigned 分片?
如果不能分配分片,例如已经为集群中的节点数过分分配了副本分片的数量,则分片将保持UNASSIGNED状态。 其错误码为:ALLOCATION_FAILED。可以通过如下指令,查看集群中不同节点、不同索引的状态.
|
1
|
[root@elk-node03 ~]# curl -XGET 'http://10.0.8.47:9200/_cat/shards?h=index,shard,prirep,state,unassigned.reason' |
出现unassigned 分片后的症状?
head插件查看会:Elasticsearch启动N长时候后,某一个或几个分片仍持续为灰色。
unassigned 分片问题可能的原因?
|
1
2
3
4
5
6
7
8
9
10
11
12
|
INDEX_CREATED: 由于创建索引的API导致未分配。CLUSTER_RECOVERED: 由于完全集群恢复导致未分配。INDEX_REOPENED: 由于打开open或关闭close一个索引导致未分配。DANGLING_INDEX_IMPORTED: 由于导入dangling索引的结果导致未分配。NEW_INDEX_RESTORED: 由于恢复到新索引导致未分配。EXISTING_INDEX_RESTORED: 由于恢复到已关闭的索引导致未分配。REPLICA_ADDED: 由于显式添加副本分片导致未分配。ALLOCATION_FAILED: 由于分片分配失败导致未分配。NODE_LEFT: 由于承载该分片的节点离开集群导致未分配。REINITIALIZED: 由于当分片从开始移动到初始化时导致未分配(例如,使用影子shadow副本分片)。REROUTE_CANCELLED: 作为显式取消重新路由命令的结果取消分配。REALLOCATED_REPLICA: 确定更好的副本位置被标定使用,导致现有的副本分配被取消,出现未分配。 |
Elasticsearch集群状态红色如何排查?
症状:集群健康值红色;
日志:集群服务连接超时;
可能原因:集群中部分节点的主分片未分配。
接下来的解决方案主要围绕:使主分片unsigned 分片完成再分配展开。
如何解决 unassigned 分片问题?
方案一:极端情况——这个分片数据已经不可用,直接删除该分片 (即删除索引)
Elasticsearch中没有直接删除分片的接口,除非整个节点数据已不再使用,删除节点。
|
1
|
删除索引命令"curl -XDELETE http://10.0.8.44:9200/索引名" |
方案二:集群中节点数量 >= 集群中所有索引的最大副本数量 +1
N > = R + 1
其中:
N——集群中节点的数目;
R——集群中所有索引的最大副本数目。
注意事项:当节点加入和离开集群时,主节点会自动重新分配分片,以确保分片的多个副本不会分配给同一个节点。换句话说,主节点不会将主分片分配给与其副本相同的节点,也不会将同一分片的两个副本分配给同一个节点。 如果没有足够的节点相应地分配分片,则分片可能会处于未分配状态。
如果Elasticsearch集群就一个节点,即N=1;所以R=0,才能满足公式。这样问题就转嫁为:
1) 添加节点处理,即N增大;
2) 删除副本分片,即R置为0。
R置为0的方式,可以通过如下命令行实现:
|
1
2
|
[root@elk-node03 ~]# curl -XPUT "http://10.0.8.47:9200/_settings" -d' { "number_of_replicas" : 0 } '{"acknowledged":true} |
方案三:allocate重新分配分片
如果方案二仍然未解决,可以考虑重新分配分片。可能的原因:
1) 节点在重新启动时可能遇到问题。正常情况下,当一个节点恢复与群集的连接时,它会将有关其分片的信息转发给主节点,然后主节点将这分片从“未分配”转换为 "已分配/已启动"。
2) 当由于某种原因 (例如节点的存储已被损坏) 导致该进程失败时,分片可能保持未分配状态。
在这种情况下,必须决定如何继续: 尝试让原始节点恢复并重新加入集群(并且不要强制分配主分片); 或者强制使用Reroute API分配分片并重新索引缺少的数据原始数据源或备份。 如果你决定分配未分配的主分片,请确保将"allow_primary":"true"标志添加到请求中。
Elasticsearch5.X使用脚本如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#!/bin/bashNODE="YOUR NODE NAME"IFS=$'\n'for line in $(curl -s '10.0.8.47:9200/_cat/shards' | fgrep UNASSIGNED); do INDEX=$(echo $line | (awk '{print $1}')) SHARD=$(echo $line | (awk '{print $2}')) curl -XPOST '10.0.8.47:9200/_cluster/reroute' -d '{ "commands": [ { " allocate_replica ": { "index": "'$INDEX'", "shard": '$SHARD', "node": "'$NODE'", "allow_primary": true } } ] }'done |
Elasticsearch2.X及早期版本,只需将上面脚本中的allocate_replica改为 allocate,其他不变。
上面脚本解读:
步骤1:定位 UNASSIGNED 的节点和分片
|
1
|
curl -s '10.0.8.47:9200/_cat/shards' | fgrep UNASSIGNED |
步骤2:通过 allocate_replica 将 UNASSIGNED的分片重新分配。
allocate分配原理
分配unassigned的分片到一个节点。将未分配的分片分配给节点。接受索引和分片的索引名称和分片号,以及将分片分配给它的节点。它还接受allow_primary标志来明确指定允许显式分配主分片(可能导致数据丢失)。
浙公网安备 33010602011771号