快照生命周期

快照生命周期管理 #

快照生命周期管理(Snapshot Lifecycle Management, SLM)提供自动化的快照创建与清理能力。 通过配置 SLM 策略,您可以按照预定计划自动创建快照,并根据保留条件自动删除过期快照。


策略配置参考 #

策略结构 #

{
  "description": "策略描述",
  "creation": { ... },
  "deletion": { ... },
  "snapshot_config": { ... },
  "notification": { ... }
}

creation — 快照创建配置 #

参数描述类型是否必需
schedule创建快照的时间计划。object
time_limit创建快照的最大等待时间。string

schedule — 时间计划 #

支持 cron 表达式或固定间隔两种格式:

Cron 格式

{
  "cron": {
    "expression": "0 8 * * *",
    "timezone": "Asia/Shanghai"
  }
}

固定间隔格式

{
  "interval": {
    "start_time": 1685348095913,
    "period": 1,
    "unit": "Hours"
  }
}

deletion — 快照删除配置 #

参数描述类型是否必需
schedule执行删除检查的时间计划。省略时使用创建计划的时间。object
condition触发删除的条件。object
time_limit删除快照的最大等待时间。string

condition — 删除条件 #

参数描述类型是否必需验证
max_age删除超过此年龄的快照。string条件必需 ¹
max_count当快照总数超过此值时删除最旧的快照。int条件必需 ¹必须 > min_count
min_count始终保留的最小快照数量。int必须 > 0,默认 1

¹ max_agemax_count 中至少需要指定一个。

snapshot_config — 快照配置 #

参数描述类型是否必需
repository快照仓库名称。string
date_format快照名称中的日期格式。string
date_format_timezone日期格式使用的时区。string
indices要包含在快照中的索引(支持通配符)。string
ignore_unavailable是否忽略不可用的索引。string
include_global_state是否包含集群全局状态。string
partial是否允许部分快照。string
metadata快照元数据(任意键值对)。object

notification — 通知配置(可选) #

参数描述类型是否必需
channel通知渠道配置。object
conditions触发通知的事件。object

通知触发条件 #

参数描述类型默认值
creation创建快照时通知。booleantrue
deletion删除快照时通知。booleanfalse
failure操作失败时通知。booleanfalse
time_limit_exceeded超过时间限制时通知。booleanfalse

创建策略 #

创建一个新的快照管理策略。

请求 #

POST /_slm/policies/{policyName}

请求示例 #

以下策略配置:

  • 每天上午 8 点自动创建快照,名称格式为 yyyy-MM-dd-HH:mm,存储在 my_backup 仓库
  • 每天凌晨 1 点检查并删除超过 7 天的快照,保留至少 7 个,最多 21 个
  • 创建和删除的超时限制均为 1 小时
POST /_slm/policies/daily-policy
{
  "description": "每日快照策略",
  "creation": {
    "schedule": {
      "cron": {
        "expression": "0 8 * * *",
        "timezone": "Asia/Shanghai"
      }
    },
    "time_limit": "1h"
  },
  "deletion": {
    "schedule": {
      "cron": {
        "expression": "0 1 * * *",
        "timezone": "Asia/Shanghai"
      }
    },
    "condition": {
      "max_age": "7d",
      "max_count": 21,
      "min_count": 7
    },
    "time_limit": "1h"
  },
  "snapshot_config": {
    "date_format": "yyyy-MM-dd-HH:mm",
    "date_format_timezone": "Asia/Shanghai",
    "indices": "*",
    "repository": "my_backup",
    "ignore_unavailable": "true",
    "include_global_state": "false",
    "partial": "true",
    "metadata": {
      "any_key": "any_value"
    }
  }
}

响应示例 #

{
  "_id": "daily-policy-sm-policy",
  "_version": 1,
  "_seq_no": 0,
  "_primary_term": 1,
  "sm_policy": {
    "name": "daily-policy",
    "description": "每日快照策略",
    "schema_version": 17,
    "creation": {
      "schedule": {
        "cron": {
          "expression": "0 8 * * *",
          "timezone": "Asia/Shanghai"
        }
      },
      "time_limit": "1h"
    },
    "deletion": {
      "schedule": {
        "cron": {
          "expression": "0 1 * * *",
          "timezone": "Asia/Shanghai"
        }
      },
      "condition": {
        "max_age": "7d",
        "min_count": 7,
        "max_count": 21
      },
      "time_limit": "1h"
    },
    "snapshot_config": {
      "indices": "*",
      "metadata": {
        "any_key": "any_value"
      },
      "ignore_unavailable": "true",
      "date_format_timezone": "Asia/Shanghai",
      "include_global_state": "false",
      "date_format": "yyyy-MM-dd-HH:mm",
      "repository": "my_backup",
      "partial": "true"
    },
    "schedule": {
      "interval": {
        "start_time": 1685348095913,
        "period": 1,
        "unit": "Minutes"
      }
    },
    "enabled": true,
    "last_updated_time": 1685348095938,
    "enabled_time": 1685348095909
  }
}

获取策略 #

获取单个策略 #

GET /_slm/policies/{policyName}

响应示例 #

{
  "_id": "daily-policy-sm-policy",
  "_version": 1,
  "_seq_no": 0,
  "_primary_term": 1,
  "sm_policy": {
    "name": "daily-policy",
    "description": "每日快照策略",
    "schema_version": 17,
    "creation": { "..." : "..." },
    "deletion": { "..." : "..." },
    "snapshot_config": { "..." : "..." },
    "schedule": { "..." : "..." },
    "enabled": true,
    "last_updated_time": 1685348095938,
    "enabled_time": 1685348095909
  }
}

获取所有策略 #

GET /_slm/policies
查询参数描述类型默认值
size每页返回数量。int20
from分页起始偏移量。int0
sortField排序字段。string
sortOrder排序方向。stringasc
queryString搜索过滤条件。string*

响应示例 #

{
  "policies": [
    {
      "_id": "daily-policy-sm-policy",
      "_seq_no": 0,
      "_primary_term": 1,
      "sm_policy": { "..." : "..." }
    }
  ],
  "total_policies": 1
}

更新策略 #

更新已有策略。必须指定 if_seq_noif_primary_term 进行乐观并发控制。

请求 #

PUT /_slm/policies/{policyName}?if_seq_no=0&if_primary_term=1

请求体格式与创建策略相同。

请求示例 #

PUT /_slm/policies/daily-policy?if_seq_no=0&if_primary_term=1
{
  "description": "每日快照策略(更新)",
  "creation": {
    "schedule": {
      "cron": {
        "expression": "0 9 * * *",
        "timezone": "Asia/Shanghai"
      }
    },
    "time_limit": "1h"
  },
  "deletion": {
    "schedule": {
      "cron": {
        "expression": "0 1 * * *",
        "timezone": "Asia/Shanghai"
      }
    },
    "condition": {
      "max_age": "7d",
      "max_count": 21,
      "min_count": 7
    },
    "time_limit": "1h"
  },
  "snapshot_config": {
    "date_format": "yyyy-MM-dd-HH:mm",
    "date_format_timezone": "Asia/Shanghai",
    "indices": "*",
    "repository": "my_backup",
    "ignore_unavailable": "true",
    "include_global_state": "false",
    "partial": "true"
  }
}

查看策略状态 #

使用 _explain API 查看策略的当前执行状态,包括下次创建/删除快照的时间,以及最近一次执行的结果。

支持通配符匹配多个策略。

请求 #

GET /_slm/policies/{policyName}/_explain

请求示例 #

GET /_slm/policies/daily*/_explain

响应示例 #

{
  "policies": [
    {
      "name": "daily-policy",
      "creation": {
        "current_state": "CREATION_START",
        "trigger": {
          "time": 1685404800000
        }
      },
      "deletion": {
        "current_state": "DELETION_START",
        "trigger": {
          "time": 1685379600000
        }
      },
      "policy_seq_no": 0,
      "policy_primary_term": 1,
      "enabled": true
    }
  ]
}

状态说明 #

创建工作流状态

状态描述
CREATION_START等待触发条件。
CREATION_CONDITION_MET条件已满足,准备创建。
CREATING正在创建快照。
CREATION_FINISHED创建完成。

删除工作流状态

状态描述
DELETION_START等待触发条件。
DELETION_CONDITION_MET条件已满足,准备删除。
DELETING正在删除快照。
DELETION_FINISHED删除完成。

执行状态

状态描述
IN_PROGRESS执行中。
RETRYING正在重试。
SUCCESS执行成功。
FAILED执行失败。
TIME_LIMIT_EXCEEDED超过时间限制。

删除策略 #

删除指定的 SLM 策略。

请求 #

DELETE /_slm/policies/{policyName}

请求示例 #

DELETE /_slm/policies/daily-policy

响应示例 #

{
  "_index": ".easysearch-ilm-config",
  "_type": "_doc",
  "_id": "daily-policy-sm-policy",
  "_version": 2,
  "result": "deleted",
  "forced_refresh": true,
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 8,
  "_primary_term": 1
}

启动策略 #

启动(启用)一个已停止的策略。

请求 #

POST /_slm/policies/{policyName}/_start

响应示例 #

{
  "acknowledged": true
}

停止策略 #

停止(禁用)一个正在运行的策略。策略停止后不会自动创建或删除快照。

请求 #

POST /_slm/policies/{policyName}/_stop

响应示例 #

{
  "acknowledged": true
}

完整示例 #

场景:每小时快照 + 7 天保留 #

POST /_slm/policies/hourly-backup
{
  "description": "每小时快照,保留 7 天",
  "creation": {
    "schedule": {
      "cron": {
        "expression": "0 * * * *",
        "timezone": "Asia/Shanghai"
      }
    },
    "time_limit": "1h"
  },
  "deletion": {
    "schedule": {
      "cron": {
        "expression": "0 2 * * *",
        "timezone": "Asia/Shanghai"
      }
    },
    "condition": {
      "max_age": "7d",
      "max_count": 200,
      "min_count": 24
    },
    "time_limit": "1h"
  },
  "snapshot_config": {
    "date_format": "yyyy-MM-dd-HH:mm",
    "date_format_timezone": "Asia/Shanghai",
    "indices": "logs-*,metrics-*",
    "repository": "my_backup",
    "ignore_unavailable": "true",
    "include_global_state": "false",
    "partial": "true"
  }
}

检查策略状态 #

GET /_slm/policies/hourly-backup/_explain

停止策略(维护期间) #

POST /_slm/policies/hourly-backup/_stop

恢复策略 #

POST /_slm/policies/hourly-backup/_start