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