问题描述
我们修改 JVM Heap 参数后,当重启集群后,集群呈现 Red 状态,部分索引也呈现 Red 状态。
使用 GET /_cluster/allocation/explain?pretty 接口,查看状态,得到如下信息:
reached the limit of incoming shard recoveries [2], cluster setting [cluster.rou ting.allocation.node_concurrent_incoming_recoveries=2] (can also be set via [clu ster.routing.allocation.node_concurrent_recoveries])
随着时间的推进,索引从 RED => YELLOW => GREEN 过渡。另外,我们使用 Elasticsearch 7.6 版本。
附加说明:
1)本笔记将介绍排查 Red Cluster 的通用方法,而不是针对特定成因(因为成因有很多,但是排查思路是类似的)。
背景知识
当我们运行单实例时……
当我们运行单实例时,所有 Primary Shards 在同个节点,没有 Replica Shards 存在,节点呈现 Yellow 状态。
此时集群功能正常,但是数据可能丢失。
当我们加入节点后……
当我们向集群加入新的节点后,集群立刻开始 Replica Shareds 分配。
当分配结束后,集群进入 Green 状态。最终,所有 Primary Shard 被分散在不同的节点上。
当集群 Red 状态时……
隐含信息
表示至少某个 Primary Shard 及它的 Replica Shard 没有分配到节点。
简单说,Primary Shard 与 Replica Shard 的分配都存在问题。
可能原因
1)集群节点故障,及负载过高导致进程退出。
解释:所有 Primary Shard 被分散在不同的节点上,当某个节点故障时,分配在其上的 Primary Shard 丢失,那么此时集群的 Primary Shard 就存在问题,集群功能异常,无法使用,呈现红色。
排查思路
Red Index 导致 Red Shard 状态,Red Shard 导致 Red Cluster 状态。
使用 GET /_cluster/allocation/explain 获取首个无法分配的 Shard 并解释原因:
{ "index": "test4", "shard": 0, "primary": true, "current_state": "unassigned", "can_allocate": "no", "allocate_explanation": "cannot allocate because allocation is not permitted to any of the nodes" }
使用 GET /_cat/indices?v 查看索引状态:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open test1 30h1EiMvS5uAFr2t5CEVoQ 5 0 820 0 14mb 14mb green open test2 sdIxs_WDT56afFGu5KPbFQ 1 0 0 0 233b 233b green open test3 GGRZp_TBRZuSaZpAGk2pmw 1 1 2 0 14.7kb 7.3kb red open test4 BJxfAErbTtu5HBjIXJV_7A 1 0 green open test5 _8C6MIXOSxCqVYicH3jsEA 1 0 7 0 24.3kb 24.3kb
解决方法
在前面的步骤中,通常已经得到原因,按照提示处理即可。
在 Amazon Elasticsearch Service Troubleshooting/Red Cluster Status 中,也没有具体方案:
1)最快的方法是删除索引(如果可以)。根据情况,之后可以扩展集群。
2)如果不能删除索引,可以恢复快照、从索引删除文档、修改配置、减少副本数、删除其他索引释放磁盘等等。
当集群 Yellow 状态时……
隐含信息
所有 Index 的 Primary Shard 已经分配到节点,但是至少有某个 Index 的 Replica Shard 没有分配到节点。
简单说,Primary Shard 分配已经完成,但是 Replica Shard 分配存在问题。
可能原因
1)集群只有单个节点
解释:当初识化单节点集群时,永远为 Yellow 状态。所有 Primary Shard 都在该节点,并且没有 Repica Shard 存在,因此也无法分配到其他节点。此时集群的功能正常,但是存在数据丢失的风险。
解决方法
如果是由单节点而导致的问题,可以添加节点,以组成集群。
在 Amazon Elasticsearch Service Troubleshooting/Yellow Cluster Status 中,没有给出详细的解决方法:
1)可以通过增加节点(如果是单节点集群)
参考文献
Elasticsearch Reference [7.7] » Set up Elasticsearch » Adding nodes to your cluster