Elasticsearch 节点宕机后,集群通常会自动恢复分片。只有在自动重试失败或分配被禁用时,才需要手动干预。操作前务必评估数据风险。
先说结论:手动重试分配是解决因临时故障导致分片卡住的有效手段,但操作前必须确认主分片数据是否完好,避免强制分配空分片造成数据丢失。
- 先备份:重要索引建议先创建快照,防止强制分配导致数据不可逆丢失
- 先诊断:通过分配解释接口查看分片未分配的具体原因
- 再操作:根据原因选择重试路由或调整分配设置
- 后验证:观察集群健康状态和分片状态是否恢复正常
操作前风险提示
在执行重试命令前,请确认承载主分片的节点是否永久损坏。如果主分片数据已丢失且无副本,强制分配会导致数据永久丢失。建议优先尝试恢复故障节点,若无法恢复,再考虑以下操作。
分步处理流程
1. 查看未分配分片状态
使用以下命令定位处于 UNASSIGNED 状态的分片:
GET _cat/shards?v&h=index,shard,prirep,state,node,unassigned.reason2. 查询具体未分配原因
使用 allocation/explain 接口获取详细诊断信息。需指定索引名、分片号及是否为主分片:
GET _cluster/allocation/explain
{
"index": "your_index_name",
"shard": 0,
"primary": true
}返回结果中的 current_state 和 unassigned_info 字段会说明具体阻碍原因。
3. 检查并恢复分片分配设置
确认集群是否禁用了分片分配。查看当前设置:
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)