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

为什么这个错误发生 #

concurrent_snapshot_execution_exception 表示尝试同时执行多个冲突的快照或恢复操作。快照操作对某些资源(如索引、分片、仓库)是独占的,不能同时执行。

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

  1. 同一索引多次快照:同时对同一索引执行多个快照
  2. 快照和恢复冲突:同时进行快照和恢复操作
  3. 同名快照:尝试创建同名的快照
  4. 仓库操作冲突:同一仓库的多个并发快照操作
  5. 分片级快照冲突:同一分片的多个并发快照
  6. 全局状态冲突:快照包含全局状态时产生冲突
  7. 清理操作冲突:清理快照时其他操作正在进行
  8. SLM 策略冲突:多个快照生命周期策略同时执行

如何修复这个错误 #

1. 检查快照状态 #

# 查看正在进行的快照
GET /_snapshot/<repository>/_status

# 查看所有快照
GET /_snapshot/<repository>/_all?verbose

2. 等待当前快照完成 #

# 等待特定快照完成
GET /_snapshot/<repository>/<snapshot-name>?wait_for_completion=true

# 或使用超时参数
GET /_snapshot/<repository>/_status?verbose

3. 删除冲突的快照 #

# 删除正在进行的快照
DELETE /_snapshot/<repository>/<snapshot-name>

4. 使用互斥策略 #

# 在应用层实现快照互斥
# 创建快照前检查是否有正在进行的快照
GET /_snapshot/<repository>/_status

# 如果有进行中的快照,等待或报错

5. 分批执行快照 #

# 不要对所有索引同时快照
# 分批执行
PUT /_snapshot/<repository>/snap-logs-<date>?wait_for_completion=true
{
  "indices": "logs-*"
}

# 等待完成后再快照其他索引
PUT /_snapshot/<repository>/snap-metrics-<date>?wait_for_completion=true
{
  "indices": "metrics-*"
}

6. 使用快照生命周期管理(SLM) #

# SLM 会自动处理并发问题
PUT /_slm/policy/<policy_name>
{
  "schedule": "0 0 2 * * ?",
  "name": "<snapshot-{now/d}>",
  "repository": "<repository_name>",
  "config": {
    "indices": ["*"]
  }
}

7. 排除冲突索引 #

# 从快照中排除冲突的索引
PUT /_snapshot/<repository>/<snapshot-name>
{
  "indices": "<index1>,<index2>",
  "exclude": ["<conflicting_index>"]
}

8. 检查 SLM 策略 #

# 查看所有 SLM 策略
GET /_slm/policy/*?verbose

# 查看正在执行的 SLM 任务
GET /_slm/status

9. 调整快照时间表 #

# 避免多个快照时间重叠
# 使用不同的时间表

# 策略1:凌晨2点
PUT /_slm/policy/policy1
{
  "schedule": "0 0 2 * * ?",
  ...
}

# 策略2:凌晨4点
PUT /_slm/policy/policy2
{
  "schedule": "0 0 4 * * ?",
  ...
}

10. 使用 API 检测冲突 #

# 执行快照前检查
GET /_snapshot/<repository>/_current

# 如果返回正在进行快照的信息,避免创建新快照

11. 清理失败的快照 #

# 删除失败的快照以释放资源
DELETE /_snapshot/<repository>/<failed-snapshot>

预防措施 #

  • 使用 SLM 自动化快照管理
  • 设置合理的快照时间表
  • 不同类型的索引分批快照
  • 实现应用层快照互斥机制
  • 监控快照操作状态
  • 避免手动创建快照与 SLM 冲突
  • 使用有意义的快照命名避免重复
  • 定期清理失败的快照