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

为什么这个错误发生 #

execution_cancelled_exception 是在执行中的操作被主动取消时抛出的错误。

Easysearch 中的某些长时间运行的操作(如数据恢复、快照创建、批量操作等)是可取消的。当这些操作被系统或用户主动中断时,就会抛出此异常。

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

  1. 用户手动取消:通过 API 手动取消正在执行的任务
  2. 节点关闭:节点正在关闭过程中,正在执行的操作被取消
  3. 超时取消:操作执行时间超过预设的超时时间而被自动取消
  4. 主节点变更:集群主节点变更导致某些需要主节点协调的操作被取消
  5. 分片迁移:分片迁移导致相关操作被取消
  6. 任务冲突:新的操作请求导致现有操作被取消(如同一索引的并发快照)
  7. 资源限制:系统资源不足导致操作被强制取消
  8. 状态变更:索引或集群状态变更导致正在进行的操作无效而被取消

如何修复这个错误 #

1. 确认取消是否为预期行为 #

  • 检查是否有人为干预(如手动删除任务、关闭节点等)
  • 查看操作日志确认取消的具体原因

2. 检查节点状态 #

# 检查节点是否正常运行
GET /_cat/nodes?v

# 检查集群健康状态
GET /_cluster/health

3. 查看任务状态 #

# 查看当前正在执行的任务
GET /_tasks?detailed=true&actions=**&parent_task_id=

# 查看特定任务
GET /_tasks/<task_id>

4. 增加超时时间 #

如果操作因为超时而被取消,可以增加超时时间:

# 例如,在快照 API 中设置超时
PUT /_snapshot/<repository>/<snapshot-name>?wait_for_completion=true&timeout=10m

5. 重试操作 #

如果取消是由于临时性问题(如网络波动、资源暂时紧张),可以重试操作:

# 例如,重新创建快照
PUT /_snapshot/<repository>/<snapshot-name>
{
  "indices": "<index>",
  "wait_for_completion": true
}

6. 检查集群资源 #

# 检查线程池状态
GET /_cat/thread_pool?v

# 检查 JVM 内存使用
GET /_nodes/stats/jvm

# 检查磁盘使用情况
GET /_cat/allocation?v

7. 处理并发冲突 #

如果多个操作同时进行导致冲突,可以:

  • 等待当前操作完成后再执行下一个
  • 使用任务管理 API 取消不需要的任务

8. 调整操作参数 #

某些操作可以通过调整参数来避免被取消:

  • 减小批量大小
  • 减少并发操作数量
  • 在非高峰时段执行大型操作

9. 查看详细日志 #

# 检查节点日志以了解取消的具体原因
tail -f /path/to/easysearch/logs/easysearch.log | grep -i "cancelled"

10. 任务管理 #

# 如果需要,可以取消特定任务
POST /_tasks/<task_id>/_cancel

# 或者按条件取消任务
POST /_tasks/_cancel?actions=*snapshot*&actions=*recovery*

预防措施 #

  • 为长时间运行的操作设置合理的超时时间
  • 在执行大型操作前,确保集群有充足的资源
  • 避免在高峰时段执行大规模操作
  • 使用任务 API 监控正在执行的任务状态
  • 对于关键操作,考虑实现客户端重试机制
  • 确保网络稳定,避免因网络问题导致操作被取消