📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

为什么这个错误发生 #

index_shard_not_started_exception 表示分片尚未启动,无法执行请求的操作。分片需要经过初始化过程后才能正常处理请求。

这个错误可能由以下原因引起:

  1. 分片正在初始化:分片刚刚被创建或分配,正在初始化过程中
  2. 分片正在恢复:分片正在从其他节点恢复数据
  3. 分片正在迁移:分片正在从一个节点迁移到另一个节点
  4. 分片被关闭:分片被关闭后尚未重新打开
  5. 引擎未创建:分片的引擎(Engine)尚未创建
  6. 恢复未完成:分片从事务日志恢复数据的过程未完成
  7. 资源不足:节点资源不足导致分片无法启动
  8. 启动失败:分片启动过程中发生错误

如何修复这个错误 #

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 内存使用
  • 在非高峰时段执行大规模操作