创建快照

edit

本指南向您展示如何对正在运行的集群进行快照。您可以稍后 恢复快照 以恢复或转移其数据。

在本指南中,您将学习如何:

  • 使用快照生命周期管理(SLM)自动创建和保留快照
  • 手动创建快照
  • 监控快照的进度
  • 删除或取消快照
  • 备份集群配置文件

该指南还提供了创建专用集群状态快照和在不同时间间隔进行快照的技巧。

先决条件

edit
  • 要使用 Kibana 的 快照和恢复 功能,您必须具备以下权限:

    • 集群权限: monitor, manage_slm, cluster:admin/snapshot, 和 cluster:admin/repository
    • 索引权限: allmonitor 索引上
  • 您只能从具有选举出的 主节点 的运行集群中进行快照。
  • 快照仓库必须已注册并可供集群使用。
  • 集群的全局元数据必须是可读的。要包含索引在快照中,索引及其元数据也必须是可读的。确保没有 集群块索引块 阻止读取访问。

注意事项

edit
  • 每个快照在其存储库中必须具有唯一的名称。尝试创建与现有快照同名的快照将会失败。
  • 快照会自动去重。您可以频繁地创建快照,而对存储开销的影响很小。
  • 每个快照在逻辑上是独立的。您可以删除一个快照而不影响其他快照。
  • 创建快照可能会暂时暂停分片分配。 请参阅快照和分片分配
  • 创建快照不会阻塞索引或其他请求。但是,快照不会包含在快照过程开始后所做的更改。
  • 您可以同时创建多个快照。 snapshot.max_concurrent_operations 集群设置限制了并发快照操作的最大数量。
  • 如果您在快照中包含一个数据流,快照也会包含该流的备份索引和元数据。

    您还可以仅在快照中包含特定的后备索引。然而,快照不会包含数据流的元数据或其其他后备索引。

  • 快照可以包含一个数据流,但排除特定的后备索引。 当您恢复这样的数据流时,它将仅包含快照中的后备索引。如果流的原始写入索引不在快照中,则快照中最新的后备索引将成为流的写入索引。

使用SLM自动化快照

edit

快照生命周期管理(SLM)是定期备份集群的最简便方法。SLM策略会根据预设的时间表自动创建快照。该策略还可以根据您定义的保留规则删除快照。

Elasticsearch Service 部署自动包含 cloud-snapshot-policy SLM 策略。Elasticsearch Service 使用此策略来定期拍摄您的集群的快照。有关更多信息,请参阅 Elasticsearch Service 快照文档

SLM 安全

edit

以下集群权限在启用Elasticsearch安全功能时控制对SLM操作的访问:

manage_slm
允许用户执行所有SLM操作,包括创建和更新策略以及启动和停止SLM。
read_slm
允许用户执行所有只读的SLM操作,例如获取策略和检查SLM状态。
cluster:admin/snapshot/*
允许用户对任何索引进行快照的创建和删除,无论他们是否拥有该索引的访问权限。

您可以通过 Kibana 管理创建和管理角色,以分配这些权限。

要授予创建和管理SLM策略及快照所需的权限,您可以设置一个具有manage_slmcluster:admin/snapshot/*集群权限以及对SLM历史索引的完全访问权限的角色。

例如,以下请求创建一个slm-admin角色:

POST _security/role/slm-admin
{
  "cluster": [ "manage_slm", "cluster:admin/snapshot/*" ],
  "indices": [
    {
      "names": [ ".slm-history-*" ],
      "privileges": [ "all" ]
    }
  ]
}

要授予对SLM策略和快照历史的只读访问权限, 您可以设置一个具有read_slm集群权限和读取快照生命周期管理历史索引访问权限的角色。

例如,以下请求创建一个slm-read-only角色:

POST _security/role/slm-read-only
{
  "cluster": [ "read_slm" ],
  "indices": [
    {
      "names": [ ".slm-history-*" ],
      "privileges": [ "read" ]
    }
  ]
}

创建一个SLM策略

edit

要在Kibana中管理SLM,请转到主菜单并点击堆栈管理 > 快照和恢复 > 策略。要创建策略,请点击创建策略

您还可以使用 SLM API来管理SLM。要创建策略,请使用 创建SLM策略API

以下请求创建一个策略,该策略每天在UTC时间凌晨1:30备份集群状态、所有数据流和所有索引。

PUT _slm/policy/nightly-snapshots
{
  "schedule": "0 30 1 * * ?",       
  "name": "<nightly-snap-{now/d}>", 
  "repository": "my_repository",    
  "config": {
    "indices": "*",                 
    "include_global_state": true    
  },
  "retention": {                    
    "expire_after": "30d",
    "min_count": 5,
    "max_count": 50
  }
}

何时拍摄快照,使用Cron语法编写。

快照名称。支持日期数学。为了防止命名冲突,策略还会在每个快照名称后附加一个UUID。

已注册的快照仓库用于存储策略的快照。

数据流和索引,包含在策略的快照中。

如果 true,策略的快照将包含集群状态。这还包括所有功能状态,默认情况下。要仅包含特定功能状态,请参阅备份特定功能状态

可选的保留规则。此配置将快照保留30天,无论年龄如何,至少保留5个,最多保留50个快照。请参阅SLM保留快照保留限制

手动运行SLM策略

edit

您可以手动运行SLM策略以立即创建快照。这对于测试新策略或在升级前创建快照非常有用。手动运行策略不会影响其快照计划。

要在 Kibana 中运行策略,请转到 策略 页面,然后点击 操作 列下的运行图标。您也可以使用 执行 SLM 策略 API

POST _slm/policy/nightly-snapshots/_execute

快照过程在后台运行。要监控其进度,请参阅 监控快照

SLM 保留

edit

SLM快照保留是一个在策略的快照计划之外单独运行的集群级任务。要控制SLM保留任务的运行时间,请配置slm.retention_schedule集群设置。

PUT _cluster/settings
{
  "persistent" : {
    "slm.retention_schedule" : "0 30 1 * * ?"
  }
}

要立即运行保留任务,请使用 执行 SLM 保留策略 API

POST _slm/_execute_retention

SLM 策略的保留规则仅适用于使用该策略创建的快照。其他快照不计入该策略的保留限制。

快照保留限制

edit

我们建议您在SLM策略中包含保留规则,以删除不再需要的快照。

快照仓库可以安全地扩展到数千个快照。然而,为了管理其元数据,大型仓库需要主节点上更多的内存。保留规则确保仓库的元数据不会增长到可能破坏主节点稳定性的规模。

手动创建快照

edit

要创建没有SLM策略的快照,请使用创建快照API。快照名称支持日期数学

# PUT _snapshot/my_repository/<my_snapshot_{now/d}>
PUT _snapshot/my_repository/%3Cmy_snapshot_%7Bnow%2Fd%7D%3E

根据快照的大小,完成快照可能需要一些时间。默认情况下,创建快照 API 仅启动快照过程,该过程在后台运行。要阻止客户端直到快照完成,请将 wait_for_completion 查询参数设置为 true

PUT _snapshot/my_repository/my_snapshot?wait_for_completion=true

您还可以使用克隆快照API克隆现有快照。

监控快照

edit

要监控当前正在运行的快照,请使用带有_current请求路径参数的获取快照API

GET _snapshot/my_repository/_current

要获取参与任何当前正在运行的快照的每个分片的完整细分,请使用获取快照状态 API

GET _snapshot/_status

检查SLM历史记录

edit

要获取有关集群的SLM执行历史的更多信息,包括每个SLM策略的统计信息,请使用获取SLM统计信息API。该API还会返回有关集群的快照保留任务历史的信息。

GET _slm/stats

要获取有关特定SLM策略执行历史的信息,请使用获取SLM策略API。响应包括:

  • 下一次计划的政策执行。
  • 如果适用,政策上次成功启动快照过程的时间。成功启动并不保证快照已完成。
  • 如果适用,政策上次执行失败的时间以及相关的错误。
GET _slm/policy/nightly-snapshots

删除或取消快照

edit

要在 Kibana 中删除快照,请转到 快照 页面,然后点击 操作 列下的垃圾桶图标。您也可以使用 删除快照 API

DELETE _snapshot/my_repository/my_snapshot_2099.05.06

如果您删除一个正在进行中的快照,Elasticsearch 会取消它。快照过程会停止并删除为该快照创建的任何文件。删除快照不会删除其他快照使用的文件。

备份配置文件

edit

如果您在自己的硬件上运行 Elasticsearch,我们建议除了备份之外,还定期使用您选择的文件备份软件备份每个节点 $ES_PATH_CONF 目录 中的文件。快照不会备份这些文件。另请注意,这些文件在每个节点上会有所不同,因此应单独备份每个节点的文件。

The elasticsearch.keystore、TLS keys、以及SAMLOIDCKerberos 领域的私钥文件包含敏感信息。建议对这些文件的备份进行加密。

备份特定功能状态

edit

默认情况下,包含集群状态的快照也会包含所有 功能状态。同样,默认情况下,不包含集群状态的快照也会排除所有功能状态。

您还可以配置快照以仅包含特定的功能状态,无论集群状态如何。

要获取可用功能的列表,请使用获取功能API

GET _features

API返回:

{
  "features": [
    {
      "name": "tasks",
      "description": "Manages task results"
    },
    {
      "name": "kibana",
      "description": "Manages Kibana configuration and reports"
    },
    {
      "name": "security",
      "description": "Manages configuration for Security features, such as users and roles"
    },
    ...
  ]
}

要在快照中包含特定功能状态,请在 feature_states 数组中指定功能 name

例如,以下SLM策略仅在其快照中包含Kibana和Elasticsearch安全功能的状态。

PUT _slm/policy/nightly-snapshots
{
  "schedule": "0 30 2 * * ?",
  "name": "<nightly-snap-{now/d}>",
  "repository": "my_repository",
  "config": {
    "indices": "*",
    "include_global_state": true,
    "feature_states": [
      "kibana",
      "security"
    ]
  },
  "retention": {
    "expire_after": "30d",
    "min_count": 5,
    "max_count": 50
  }
}

任何属于功能状态的索引或数据流都会显示在快照的内容中。例如,如果您备份了security功能状态,security-*系统索引将显示在获取快照API的响应中,位于indicesfeature_states下。

专用集群状态快照

edit

某些功能状态包含敏感数据。例如,security 功能状态包括可能包含用户名和加密密码哈希的系统索引。由于密码是使用 加密哈希 存储的,因此泄露快照不会自动使第三方能够以您的用户之一进行身份验证或使用 API 密钥。然而,这会泄露机密信息,如果第三方能够修改快照,他们可能会安装后门。

为了更好地保护这些数据,请考虑为集群状态的快照创建一个专用存储库和SLM策略。这使您能够严格限制和审计对该存储库的访问。

例如,以下SLM策略仅备份集群状态。 该策略将这些快照存储在专用存储库中。

PUT _slm/policy/nightly-cluster-state-snapshots
{
  "schedule": "0 30 2 * * ?",
  "name": "<nightly-cluster-state-snap-{now/d}>",
  "repository": "my_secure_repository",
  "config": {
    "include_global_state": true,                 
    "indices": "-*"                               
  },
  "retention": {
    "expire_after": "30d",
    "min_count": 5,
    "max_count": 50
  }
}

包含集群状态。默认情况下,这也包括所有功能状态。

排除常规数据流和索引。

如果您对集群状态进行专门的快照,您需要将集群状态从其他快照中排除。例如:

PUT _slm/policy/nightly-snapshots
{
  "schedule": "0 30 2 * * ?",
  "name": "<nightly-snap-{now/d}>",
  "repository": "my_repository",
  "config": {
    "include_global_state": false,    
    "indices": "*"                    
  },
  "retention": {
    "expire_after": "30d",
    "min_count": 5,
    "max_count": 50
  }
}

排除集群状态。默认情况下,这也排除了所有功能状态。

包括所有常规数据流和索引。

在不同时间间隔创建快照

edit

如果你只使用单一的SLM策略,可能难以频繁地创建快照并保留时间间隔较长的快照。

例如,一个每30分钟拍摄一次快照且最多保留100个快照的策略,将仅保留大约两天的快照。虽然这种设置非常适合备份最近的更改,但它不允许您从上周或上个月恢复数据。

要解决这个问题,您可以创建多个具有相同快照存储库的SLM策略,这些策略在不同的计划上运行。由于策略的保留规则仅适用于其快照,因此一个策略不会删除由另一个策略创建的快照。

例如,以下SLM策略每小时创建一次快照,最多保留24个快照。该策略将其快照保留一天。

PUT _slm/policy/hourly-snapshots
{
  "name": "<hourly-snapshot-{now/d}>",
  "schedule": "0 0 * * * ?",
  "repository": "my_repository",
  "config": {
    "indices": "*",
    "include_global_state": true
  },
  "retention": {
    "expire_after": "1d",
    "min_count": 1,
    "max_count": 24
  }
}

以下策略在同一快照仓库中进行夜间快照。 该策略保留其快照一个月。

PUT _slm/policy/daily-snapshots
{
  "name": "<daily-snapshot-{now/d}>",
  "schedule": "0 45 23 * * ?",          
  "repository": "my_repository",
  "config": {
    "indices": "*",
    "include_global_state": true
  },
  "retention": {
    "expire_after": "30d",
    "min_count": 1,
    "max_count": 31
  }
}

每天UTC时间晚上11:45运行。

以下策略在同一存储库中创建每月快照。该策略将其快照保留一年。

PUT _slm/policy/monthly-snapshots
{
  "name": "<monthly-snapshot-{now/d}>",
  "schedule": "0 56 23 1 * ?",            
  "repository": "my_repository",
  "config": {
    "indices": "*",
    "include_global_state": true
  },
  "retention": {
    "expire_after": "366d",
    "min_count": 1,
    "max_count": 12
  }
}

每月的第一天在UTC时间晚上11:56运行。