为什么这个错误发生 #
index_shard_not_started_exception 表示分片尚未启动,无法执行请求的操作。分片需要经过初始化过程后才能正常处理请求。
这个错误可能由以下原因引起:
- 分片正在初始化:分片刚刚被创建或分配,正在初始化过程中
- 分片正在恢复:分片正在从其他节点恢复数据
- 分片正在迁移:分片正在从一个节点迁移到另一个节点
- 分片被关闭:分片被关闭后尚未重新打开
- 引擎未创建:分片的引擎(Engine)尚未创建
- 恢复未完成:分片从事务日志恢复数据的过程未完成
- 资源不足:节点资源不足导致分片无法启动
- 启动失败:分片启动过程中发生错误
如何修复这个错误 #
1. 检查分片状态 #
# 查看分片状态
GET /_cat/shards?v&h=index,shard,prirep,state,unassigned.reason,init
# 查看特定分片
GET /_cluster/allocation/explain
{
"index": "<index>",
"shard": 0
}
2. 等待分片初始化完成 #
# 等待分片启动完成
GET /_cluster/health?wait_for_no_initializing_shards=true&timeout=50s
# 或等待索引变为绿色状态
GET /<index>/_cluster/health?wait_for_status=green&timeout=50s
3. 查看恢复进度 #
# 查看正在恢复的分片
GET /_cat/recovery?v&active_only=true
# 查看恢复详细状态
GET /_cat/pending_tasks?v
4. 打开已关闭的分片 #
# 如果分片被关闭,重新打开
POST /<index>/_open
5. 触发分片分配 #
# 尝试重新分配分片
POST /_cluster/reroute?retry_failed=true
6. 检查节点资源 #
# 检查 JVM 内存使用
GET /_nodes/stats/jvm?human&pretty
# 检查磁盘空间
GET /_cat/allocation?v
# 检查线程池状态
GET /_cat/thread_pool?v
7. 增加超时时间 #
# 对于客户端操作,增加超时时间
# 等待分片启动后再执行操作
8. 重启分片 #
# 移动分片到其他节点触发重启
POST /_cluster/reroute
{
"commands": [{
"move": {
"index": "<index>",
"shard": 0,
"from_node": "node1",
"to_node": "node2"
}
}]
}
9. 检查分片初始化失败原因 #
# 查看节点日志
grep -i "shard.*start\|shard.*init" /path/to/easysearch/logs/easysearch.log | tail -100
# 查找错误信息
grep -i "failed.*start\|error.*init" /path/to/easysearch/logs/easysearch.log | tail -50
10. 手动分配分片 #
如果分片无法自动分配:
# 手动分配分片到特定节点
POST /_cluster/reroute
{
"commands": [{
"allocate_stale_primary": {
"index": "<index>",
"shard": 0,
"node": "<node_name>",
"accept_data_loss": false
}
}]
}
11. 使用副本进行操作 #
# 如果主分片未启动,尝试使用副本分片进行读取操作
GET /<index>/_search?preference=_local
预防措施 #
- 确保有足够的节点和资源
- 监控分片初始化状态
- 避免在分片迁移时执行大量操作
- 配置合理的分片分配规则
- 确保磁盘空间充足
- 监控 JVM 内存使用
- 在非高峰时段执行大规模操作





