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

为什么这个错误发生 #

snapshot_in_progress_exception 表示尝试在一个正在进行快照的索引或仓库上执行不允许并发执行的操作。

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

  1. 快照正在执行:快照操作正在进行中
  2. 并发快照冲突:尝试同时执行多个快照操作
  3. 删除正在快照的索引:尝试删除正在快照的索引
  4. 关闭正在快照的索引:尝试关闭正在快照的索引
  5. 修改快照中的索引:尝试修改正在快照的索引配置

如何修复这个错误 #

1. 检查快照状态 #

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

# 查看所有快照状态
GET /_cat/snapshots?v

2. 等待快照完成 #

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

# 或使用 API 等待
GET /_snapshot/<repository>/_status

3. 查看快照进度 #

# 查看快照详细进度
GET /_snapshot/<repository>/<snapshot-name>/_status

# 或使用 cat API
GET /_cat/pending_tasks?v

4. 取消快照(谨慎使用) #

# 如果需要,可以删除正在进行的快照
DELETE /_snapshot/<repository>/<snapshot-name>

5. 使用不同的仓库 #

# 在不同的仓库上执行快照操作
PUT /_snapshot/<another_repository>/<snapshot-name>
{
  "indices": "<index>"
}

6. 检查并排他快照 #

# 某些操作需要独占访问
# 确保没有其他快照正在进行
GET /_snapshot/<repository>/_status

7. 使用快照策略 #

# 使用 SLM 避免快照冲突
PUT /_slm/policy/<policy_name>
{
  "schedule": "0 0 2 * * ?",
  "name": "<snapshot-{now/d}}",
  "repository": "<repository_name>"
}

8. 分批执行快照 #

# 避免同时对所有索引快照
PUT /_snapshot/<repository>/<snapshot-name>
{
  "indices": "index1,index2"
}

# 等待完成后再快照其他索引

9. 检查快照冲突 #

# 查看是否有其他快照操作
GET /_tasks?actions=*snapshot*&detailed=true

10. 等待索引可用 #

# 如果索引正在快照,等待完成后操作
# 可以检查索引状态
GET /<index>/_explain

预防措施 #

  • 使用 SLM 自动化快照管理
  • 在非高峰时段执行快照
  • 计划快照时间避免冲突
  • 监控快照状态
  • 使用快照策略避免并发
  • 分批快照大型索引