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

为什么这个错误发生 #

task_cancelled_exception 表示正在执行的任务被任务管理 API 或系统主动取消。

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

  1. 手动取消:通过任务管理 API 手动取消任务
  2. 节点关闭:节点正在关闭,正在执行的任务被取消
  3. 超时取消:任务执行时间超过超时限制
  4. 资源限制:系统资源不足导致任务被取消
  5. 集群状态变更:集群状态变更导致任务失效
  6. 索引删除:任务操作的索引被删除
  7. 任务冲突:新任务导致旧任务被取消
  8. 主节点变更:主节点变更导致任务被取消

如何修复这个错误 #

1. 检查任务状态 #

# 查看正在执行的任务
GET /_tasks?detailed=true

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

2. 查看取消原因 #

# 检查任务状态
GET /_tasks?actions=*<action>*&detailed=true

# 查看任务错误信息
GET /_tasks/<task_id>

3. 重试任务 #

# 大多数任务可以重试
# 例如,重新启动搜索
POST /_refresh

# 重新执行查询
GET /<index>/_search
{
  "query": {
    "match_all": {}
  }
}

4. 使用异步操作 #

# 使用 wait_for_completion=false
POST /<index>/_update_by_query?wait_for_completion=false
{
  "query": {
    "match_all": {}
  },
  "script": {
    "source": "ctx._source.field = 'value'"
  }
}

# 然后检查任务状态
GET /_tasks/<task_id>

5. 增加超时时间 #

# 设置更长的超时时间
POST /<index>/_search?timeout=30s
{
  "query": {
    "match_all": {}
  }
}

6. 分批处理大任务 #

# 将大任务拆分为小批次
POST /_reindex
{
  "source": {
    "index": "<source_index>",
    "size": 1000
  },
  "dest": {
    "index": "<dest_index>"
  },
  "conflicts": "proceed"
}

7. 检查节点状态 #

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

# 查看节点日志
tail -f /path/to/easysearch/logs/easysearch.log

8. 检查集群状态 #

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

# 查看集群变更
GET /_cluster/state

9. 避免在索引操作期间执行任务 #

# 避免在索引删除、关闭等操作期间执行相关任务
# 先检查索引状态
GET /<index>/_explain

10. 使用任务持久化 #

# 对于长时间任务,确保正确配置
PUT /_cluster/settings
{
  "persistent": {
    "cluster.persistent_tasks.allocation.enable": "all"
  }
}

预防措施 #

  • 使用异步操作避免长时间阻塞
  • 设置合理的超时时间
  • 监控任务执行状态
  • 分批处理大型操作
  • 在非高峰时段执行大任务
  • 实现客户端重试逻辑
  • 确保节点稳定运行
  • 避免在系统变更时执行任务