Elasticsearch 节点宕机后数据分片未分配如何手动重试分配

文章导读
Elasticsearch 节点宕机后,集群通常会自动恢复分片。只有在自动重试失败或分配被禁用时,才需要手动干预。操作前务必评估数据风险。
📋 目录
  1. A 操作前风险提示
  2. B 分步处理流程
  3. C 怎么验证是否生效
  4. D 常见分配错误码及解决方案
  5. E 参考来源
A A

Elasticsearch 节点宕机后,集群通常会自动恢复分片。只有在自动重试失败或分配被禁用时,才需要手动干预。操作前务必评估数据风险。

先说结论:手动重试分配是解决因临时故障导致分片卡住的有效手段,但操作前必须确认主分片数据是否完好,避免强制分配空分片造成数据丢失。

  • 先备份:重要索引建议先创建快照,防止强制分配导致数据不可逆丢失
  • 先诊断:通过分配解释接口查看分片未分配的具体原因
  • 再操作:根据原因选择重试路由或调整分配设置
  • 后验证:观察集群健康状态和分片状态是否恢复正常

操作前风险提示

在执行重试命令前,请确认承载主分片的节点是否永久损坏。如果主分片数据已丢失且无副本,强制分配会导致数据永久丢失。建议优先尝试恢复故障节点,若无法恢复,再考虑以下操作。

分步处理流程

1. 查看未分配分片状态

使用以下命令定位处于 UNASSIGNED 状态的分片:

GET _cat/shards?v&h=index,shard,prirep,state,node,unassigned.reason

2. 查询具体未分配原因

Elasticsearch 节点宕机后数据分片未分配如何手动重试分配

使用 allocation/explain 接口获取详细诊断信息。需指定索引名、分片号及是否为主分片:

GET _cluster/allocation/explain
{
  "index": "your_index_name",
  "shard": 0,
  "primary": true
}

返回结果中的 current_state 和 unassigned_info 字段会说明具体阻碍原因。

3. 检查并恢复分片分配设置

确认集群是否禁用了分片分配。查看当前设置:

Elasticsearch 节点宕机后数据分片未分配如何手动重试分配
GET _cluster/settings

如果 cluster.routing.allocation.enable 不是 all,需执行以下命令恢复:

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.enable": "all"
  }
}

4. 手动触发重试分配

确认节点已恢复或配置无误后,触发重试:

POST _cluster/reroute?retry_failed=true

怎么验证是否生效

执行以下命令观察集群状态:

GET _cluster/health

确认 status 是否从 red/yellow 转为 green。同时再次检查分片列表,确认未分配分片数量归零:

GET _cat/shards?v&h=index,shard,prirep,state,node

常见分配错误码及解决方案

  • CLUSTER_RECOVERED:集群刚启动,正在恢复中,通常等待即可。
  • INDEX_CREATED:新索引创建时分配失败,检查模板或节点磁盘空间。
  • NODE_LEFT:节点离开集群,确认节点是否重启或网络中断。
  • ALLOCATION_FAILED:分配过程中发生异常,查看节点日志排查具体错误。
  • NO_VALID_SHARD_COPY:无有效分片副本,可能主分片和副本均丢失,需从快照恢复。
  • DISK_THRESHOLD_DECIDER:磁盘水位过高,清理空间或调整水位阈值。

参考来源

  • Elastic 官方文档 - Cluster Reroute API (https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-reroute.html)
  • Elastic 官方文档 - Shard Allocation (https://www.elastic.co/guide/en/elasticsearch/reference/current/shard-allocation.html)