--- title: "并发快照执行异常 (concurrent_snapshot_execution_exception) 错误排查与解决" date: 2026-03-16 lastmod: 2026-03-16 description: "concurrent_snapshot_execution_exception 表示尝试同时执行多个冲突的快照或恢复操作,快照操作对某些资源是独占的。" tags: ["快照", "并发", "SLM", "恢复"] summary: "为什么这个错误发生 # 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>?" --- ## 为什么这个错误发生 `concurrent_snapshot_execution_exception` 表示尝试同时执行多个冲突的快照或恢复操作。快照操作对某些资源(如索引、分片、仓库)是独占的,不能同时执行。 这个错误可能由以下原因引起: 1. **同一索引多次快照**:同时对同一索引执行多个快照 2. **快照和恢复冲突**:同时进行快照和恢复操作 3. **同名快照**:尝试创建同名的快照 4. **仓库操作冲突**:同一仓库的多个并发快照操作 5. **分片级快照冲突**:同一分片的多个并发快照 6. **全局状态冲突**:快照包含全局状态时产生冲突 7. **清理操作冲突**:清理快照时其他操作正在进行 8. **SLM 策略冲突**:多个快照生命周期策略同时执行 ## 如何修复这个错误 ### 1. 检查快照状态 ```bash # 查看正在进行的快照 GET /_snapshot//_status # 查看所有快照 GET /_snapshot//_all?verbose ``` ### 2. 等待当前快照完成 ```bash # 等待特定快照完成 GET /_snapshot//?wait_for_completion=true # 或使用超时参数 GET /_snapshot//_status?verbose ``` ### 3. 删除冲突的快照 ```bash # 删除正在进行的快照 DELETE /_snapshot// ``` ### 4. 使用互斥策略 ```bash # 在应用层实现快照互斥 # 创建快照前检查是否有正在进行的快照 GET /_snapshot//_status # 如果有进行中的快照,等待或报错 ``` ### 5. 分批执行快照 ```bash # 不要对所有索引同时快照 # 分批执行 PUT /_snapshot//snap-logs-?wait_for_completion=true { "indices": "logs-*" } # 等待完成后再快照其他索引 PUT /_snapshot//snap-metrics-?wait_for_completion=true { "indices": "metrics-*" } ``` ### 6. 使用快照生命周期管理(SLM) ```bash # SLM 会自动处理并发问题 PUT /_slm/policy/ { "schedule": "0 0 2 * * ?", "name": "", "repository": "", "config": { "indices": ["*"] } } ``` ### 7. 排除冲突索引 ```bash # 从快照中排除冲突的索引 PUT /_snapshot// { "indices": ",", "exclude": [""] } ``` ### 8. 检查 SLM 策略 ```bash # 查看所有 SLM 策略 GET /_slm/policy/*?verbose # 查看正在执行的 SLM 任务 GET /_slm/status ``` ### 9. 调整快照时间表 ```bash # 避免多个快照时间重叠 # 使用不同的时间表 # 策略1:凌晨2点 PUT /_slm/policy/policy1 { "schedule": "0 0 2 * * ?", ... } # 策略2:凌晨4点 PUT /_slm/policy/policy2 { "schedule": "0 0 4 * * ?", ... } ``` ### 10. 使用 API 检测冲突 ```bash # 执行快照前检查 GET /_snapshot//_current # 如果返回正在进行快照的信息,避免创建新快照 ``` ### 11. 清理失败的快照 ```bash # 删除失败的快照以释放资源 DELETE /_snapshot// ``` ### 预防措施 - 使用 SLM 自动化快照管理 - 设置合理的快照时间表 - 不同类型的索引分批快照 - 实现应用层快照互斥机制 - 监控快照操作状态 - 避免手动创建快照与 SLM 冲突 - 使用有意义的快照命名避免重复 - 定期清理失败的快照