点击上方蓝字”运维笔谈”,对话回复 “阿里云k8s” 可以获取《阿里云Kubernetes项目实战手册》PDF
当Elasticsearch至少有一个主分片未分配成功的时候,ES集群状态就是Red(红色)。这个时候不能慌,我们先查看下索引主分片未能成功分配是什么原因导致的。
具体的我们可以按照以下步骤进行排查和处理,抛砖引玉:
一、查看未分配原因
首先,需要确定导致分片未分配的具体原因。可以使用以下HTTP API命令来查询:
GET _cluster/allocation/explain
当我们执行之后,出现的结果其中 index和shard 列出了具体哪个索引的哪个分片未分配成功,reason 字段则列出了哪种原因导致的分片未分配。例如Reason 字段出现 ALLOCATION_FAILED 就是由于分片分配失败导致未分配。
二、根据原因采取相应措施
根据查询到的未分配原因,可以采取以下措施来解决问题:
1.集群配置问题
检查ES集群配置,确保副本和分片路由等配置正确。 检查是否启用了对同一分片在同一个主机上出现多个分配实例的检测cluster.routing.allocation.same_shard.host,并根据需要调整。
2.磁盘空间问题:
检查节点的磁盘空间是否充足,尤其要注意cluster.routing.allocation.disk.watermark.high和 cluster.routing.allocation.disk.watermark.low这两个参数。 如果磁盘空间不足,增加硬盘容量或清理不必要的索引。
3.节点故障或离开集群:
检查是否有节点因为故障或维护而离开集群。 如果节点已经恢复并重新加入集群,确保分片能够正确分配到该节点。
4.尝试重新分配失败的分片:
使用POST /_cluster/reroute?retry_failed=true命令尝试重新分片。 可以增加索引的尝试次数,例如: PUT /indexname/_settings {"index":{"allocation":{"max_retries":20}}}
5.重新关闭并打开索引:
使用POST /index/_close 和 POST /index/_open 命令来重新关闭并打开索引,有时可以解决分片未分配的问题。
6.将副本分片提升为主分片:
如果确定主分片已经损坏,并且可以接受数据丢失,可以尝试将副本分片提升为主分片。 使用POST /_cluster/reroute 命令,并指定allocate_stale_primary参数。
7.将此分片置为空分片:
如果主分片和副本分片都已经损坏,可以将此分片置为空分片,以保留索引的其他分片数据。 使用POST /_cluster/reroute 命令,并指定allocate_empty_primary参数。

文章转载自运维笔谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




