点击上方蓝字”运维笔谈”,对话回复 “阿里云k8s” 可以获取《阿里云Kubernetes项目实战手册》PDF
周末我们运行的Elasticsearch 5.5(的确是够老的了)的版本有出现磁盘写满的情况,处理好空间问题之后,发现有几个索引的分片一直处于未分配的状态,无法初始化,更糟糕的是主分片和副本分片数号是一致的,导致整个集群的状态处于RED。
一、确认索引分片未分配的原因
如何来确认呢?当ES集群Red时候,我们可以通过下面的API来查看分片未分配的原因。
GET _cluster/allocation/explain
此API可以查询到具体哪个索引的哪个分片未分配成功。reason 字段则列出了哪种原因导致的分片未分配。我确认了是 ALLOCATION_FAILED :由于分片分配失败导致未分配。
二、解决方法
知道了原因是分片分配失败,那么有没有什么办法可以尝试重新分配分片呢?在Elasticsearch中
POST /_cluster/reroute?retry_failed=true
这个API调用用于手动干预集群的分片分配过程。具体来说,此API可以尝试重新执行之前失败的分片重路由(rerouting)操作。
三、什么是索引的分片重路由
分片重路由是指将一个索引的一个或多个分片从一个节点移动到另一个节点的过程。比如在节点加入、离开集群,或者为了平衡集群负载等情况下。分片重路由可以自动进行,也可以通过用户使用 `_cluster/reroute` API 来手动指定。
`retry_failed=true` 参数
当添加 `retry_failed=true` 参数时,意味着请求Elasticsearch去尝试重新处理那些因为某些原因(比如网络问题、磁盘空间不足等)而未能成功完成的分片移动任务。如果没有这个参数,那么默认情况下只会应用新的重路由命令而不考虑过去的失败记录。
四、使用场景
1. 故障恢复:当遇到临时性的问题导致分片无法正常迁移后,一旦问题解决,可以通过这种方式来尝试再次迁移这些分片。
2. 手动调整:有时候我们希望对集群的状态做出更精细的手动控制,如重新尝试之前未成功的操作。
注意事项
在执行此类操作前,我们需要确保已经解决了最初导致分片移动失败的根本原因,否则很可能只是重复同样的错误。
此类操作可能会对集群性能产生影响,特别是在大型集群上进行大规模的分片重定位时。因此,在生产环境中应谨慎行事,并尽量选择业务低峰期进行。





