为什么这个错误发生 #
concurrent_snapshot_execution_exception 表示尝试同时执行多个冲突的快照或恢复操作。快照操作对某些资源(如索引、分片、仓库)是独占的,不能同时执行。
这个错误可能由以下原因引起:
- 同一索引多次快照:同时对同一索引执行多个快照
- 快照和恢复冲突:同时进行快照和恢复操作
- 同名快照:尝试创建同名的快照
- 仓库操作冲突:同一仓库的多个并发快照操作
- 分片级快照冲突:同一分片的多个并发快照
- 全局状态冲突:快照包含全局状态时产生冲突
- 清理操作冲突:清理快照时其他操作正在进行
- 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 冲突
- 使用有意义的快照命名避免重复
- 定期清理失败的快照





