恢复快照

edit

本指南向您展示如何恢复快照。快照是一种方便的方式,可以将数据的副本存储在集群之外。您可以恢复快照,以在删除或硬件故障后恢复索引和数据流。您还可以使用快照在集群之间传输数据。

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

  • 获取可用快照列表
  • 从快照恢复索引或数据流
  • 恢复功能状态
  • 恢复整个集群
  • 监控恢复操作
  • 取消正在进行的恢复

本指南还提供了关于恢复到另一个集群排查常见恢复错误的提示。

先决条件

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

    • 集群权限: monitor, manage_slm, cluster:admin/snapshot, 和 cluster:admin/repository
    • 索引权限: allmonitor 索引上
  • 您只能将快照恢复到一个具有选举出的 主节点 的运行集群。快照的存储库必须 已注册 并可用于集群。
  • 快照和集群版本必须兼容。请参阅 快照兼容性
  • 要恢复快照,集群的全局元数据必须是可写的。确保 没有任何 集群块 阻止写入。 恢复操作忽略 索引块
  • 在恢复数据流之前,请确保集群包含一个启用了数据流的匹配索引模板。要检查,可以使用Kibana的索引管理功能或获取索引模板API

    GET _index_template/*?filter_path=index_templates.name,index_templates.index_template.index_patterns,index_templates.index_template.data_stream

    如果没有这样的模板,您可以创建一个恢复包含一个的集群状态。没有匹配的索引模板,数据流无法滚动 或创建支持索引。

  • 如果您的快照包含来自 App Search 或 Workplace Search 的数据,请确保 在恢复快照之前已恢复 Enterprise Search 加密密钥

注意事项

edit

从快照恢复数据时,请记住以下几点:

  • 如果你恢复一个数据流,你也会恢复它的后备索引。
  • 你只能恢复一个现有的索引,如果它是关闭的,并且快照中的索引具有相同数量的主分片。
  • 你不能恢复一个现有的打开的索引。这包括数据流的后备索引。
  • 恢复操作会自动打开恢复的索引,包括后备索引。
  • 你可以只恢复数据流中的一个特定后备索引。然而,恢复操作不会将恢复的后备索引添加到任何现有的数据流中。

获取可用快照列表

edit

要查看Kibana中可用的快照列表,请转到主菜单并点击 堆栈管理 > 快照和恢复

您还可以使用获取仓库 API获取快照 API来查找可用于 恢复的快照。首先,使用获取仓库 API 来获取已注册的 快照仓库列表。

GET _snapshot

然后使用 get snapshot API 获取特定仓库中的快照列表。这还会返回每个快照的内容。

GET _snapshot/my_repository/*?verbose=false

恢复索引或数据流

edit

您可以使用 Kibana 的 快照和还原 功能或 restore snapshot API 来恢复快照。

默认情况下,还原请求会尝试还原快照中的所有常规索引和常规数据流。在大多数情况下,您只需要从快照中还原特定的索引或数据流。但是,您无法还原已存在的打开索引。

如果您正在将数据恢复到现有集群,请使用以下方法之一,以避免与现有索引和数据流发生冲突:

删除和恢复

edit

避免冲突的最简单方法是删除现有索引或数据流,然后再恢复它。为了防止意外重新创建索引或数据流,我们建议您在恢复操作完成之前暂时停止所有索引操作。

如果 action.destructive_requires_name 集群 设置为 false,请勿使用 删除索引 API 来 针对 *.* 通配符模式。如果你使用 Elasticsearch 的安全功能, 这将删除用于身份验证所需的系统索引。相反,请针对 *,-.* 通配符模式以排除这些系统索引和其他以点 (.) 开头的索引名称。

# Delete an index
DELETE my-index

# Delete a data stream
DELETE _data_stream/logs-my_app-default

在恢复请求中,明确指定要恢复的任何索引和数据流。

POST _snapshot/my_repository/my_snapshot_2099.05.06/_restore
{
  "indices": "my-index,logs-my_app-default"
}

恢复时重命名

edit

如果您想避免删除现有数据,可以改为重命名您恢复的索引和数据流。您通常使用此方法来比较现有数据与快照中的历史数据。例如,您可以使用此方法在意外更新或删除后审查文档。

在开始之前,请确保集群有足够的容量来容纳现有数据和恢复的数据。

以下恢复快照API请求会在恢复的索引或数据流名称前加上restored-

POST _snapshot/my_repository/my_snapshot_2099.05.06/_restore
{
  "indices": "my-index,logs-my_app-default",
  "rename_pattern": "(.+)",
  "rename_replacement": "restored-$1"
}

如果重命名选项导致两个或多个索引或数据流具有相同的名称,则恢复操作将失败。

如果你重命名一个数据流,它的后备索引也会被重命名。例如, 如果你将数据流 logs-my_app-default 重命名为 restored-logs-my_app-default,后备索引 .ds-logs-my_app-default-2099.03.09-000005 将被重命名为 .ds-restored-logs-my_app-default-2099.03.09-000005

当恢复操作完成后,您可以比较原始数据和恢复的数据。如果您不再需要原始索引或数据流,您可以删除它并使用reindex来重命名恢复的索引。

# Delete the original index
DELETE my-index

# Reindex the restored index to rename it
POST _reindex
{
  "source": {
    "index": "restored-my-index"
  },
  "dest": {
    "index": "my-index"
  }
}

# Delete the original data stream
DELETE _data_stream/logs-my_app-default

# Reindex the restored data stream to rename it
POST _reindex
{
  "source": {
    "index": "restored-logs-my_app-default"
  },
  "dest": {
    "index": "logs-my_app-default",
    "op_type": "create"
  }
}

恢复功能状态

edit

您可以恢复一个功能状态,以从快照中恢复系统索引、系统数据流和其他功能配置数据。

如果您恢复快照的集群状态,该操作默认会恢复快照中的所有功能状态。同样,如果您不恢复快照的集群状态,该操作默认不会恢复任何功能状态。您还可以选择仅从快照中恢复特定的功能状态,无论集群状态如何。

要查看快照的功能状态,请使用获取快照 API。

GET _snapshot/my_repository/my_snapshot_2099.05.06

响应的 feature_states 属性包含快照中的功能列表以及每个功能的索引。

要从快照中恢复特定功能状态,请在恢复快照 API 的 feature_states 参数中指定响应中的 feature_name

当您恢复一个功能状态时,Elasticsearch 会关闭并覆盖该功能的现有索引。

恢复安全功能状态会覆盖用于身份验证的系统索引。如果您使用Elasticsearch服务,请确保在恢复安全功能状态之前可以访问Elasticsearch服务控制台。如果您在自己的硬件上运行Elasticsearch,请在文件领域中创建一个超级用户,以确保您仍然可以访问您的集群。

POST _snapshot/my_repository/my_snapshot_2099.05.06/_restore
{
  "feature_states": [ "geoip" ],
  "include_global_state": false,    
  "indices": "-*"                   
}

从还原操作中排除集群状态。

在还原操作中排除快照中的其他索引和数据流。

恢复整个集群

edit

在某些情况下,您需要从快照中恢复整个集群,包括集群状态和所有功能状态。这种情况应该很少见,例如在发生灾难性故障时。

恢复整个集群涉及删除重要的系统索引,包括用于身份验证的索引。请考虑是否可以恢复特定的索引或数据流。

如果您正在恢复到不同的集群,请在开始之前参阅恢复到不同的集群

  1. 如果你备份了集群的配置文件,你可以将它们恢复到每个节点。这一步是可选的,并且需要进行全集群重启

    在关闭节点后,将备份的配置文件复制到节点的 $ES_PATH_CONF 目录中。在重新启动节点之前,确保 elasticsearch.yml 包含适当的节点角色、节点名称和其他节点特定设置。

    如果您选择执行此步骤,您必须在集群中的每个节点上重复此过程。

  2. 暂时停止索引并关闭以下功能:

    • GeoIP 数据库下载器和 ILM 历史记录存储

      PUT _cluster/settings
      {
        "persistent": {
          "ingest.geoip.downloader.enabled": false,
          "indices.lifecycle.history_index_enabled": false
        }
      }
    • ILM

      POST _ilm/stop
    • 机器学习

      POST _ml/set_upgrade_mode?enabled=true
    • 监控

      PUT _cluster/settings
      {
        "persistent": {
          "xpack.monitoring.collection.enabled": false
        }
      }
    • 观察者

      POST _watcher/_stop
    • 通用分析

      检查是否启用了通用分析索引模板管理:

      GET /_cluster/settings?filter_path=**.xpack.profiling.templates.enabled&include_defaults=true

      如果值为 true,则禁用通用分析索引模板管理:

      PUT _cluster/settings
      {
        "persistent": {
          "xpack.profiling.templates.enabled": false
        }
      }
  3. 如果您使用 Elasticsearch 安全功能,请登录到节点主机,导航到 Elasticsearch 安装目录,并使用 elasticsearch-users 工具将具有 superuser 角色的用户添加到文件领域中。

    例如,以下命令创建一个名为restore_user的用户。

    ./bin/elasticsearch-users useradd restore_user -p my_password -r superuser

    使用此文件领域用户进行身份验证请求,直到恢复操作完成。

  4. 使用集群更新设置 API来设置 action.destructive_requires_namefalse。这允许你使用通配符删除数据流和索引。

    PUT _cluster/settings
    {
      "persistent": {
        "action.destructive_requires_name": false
      }
    }
  5. 删除集群上所有现有的数据流。

    DELETE _data_stream/*?expand_wildcards=all
  6. 删除集群上的所有现有索引。

    DELETE *?expand_wildcards=all
  7. 恢复整个快照,包括集群状态。默认情况下,恢复集群状态也会恢复快照中的任何功能状态。

    POST _snapshot/my_repository/my_snapshot_2099.05.06/_restore
    {
      "indices": "*",
      "include_global_state": true
    }
  8. 当还原操作完成时,恢复索引并重新启动任何已停止的功能:

    当快照恢复时,快照生成时使用的许可证也将被恢复。如果自快照生成以来您的许可证已过期,您将需要使用更新许可证API来安装当前的许可证。

    • GeoIP 数据库下载器和 ILM 历史记录存储

      PUT _cluster/settings
      {
        "persistent": {
          "ingest.geoip.downloader.enabled": true,
          "indices.lifecycle.history_index_enabled": true
        }
      }
    • ILM

      POST _ilm/start
    • 机器学习

      POST _ml/set_upgrade_mode?enabled=false
    • 监控

      PUT _cluster/settings
      {
        "persistent": {
          "xpack.monitoring.collection.enabled": true
        }
      }
    • 观察者

      POST _watcher/_start
    • 通用分析

      如果值最初为true,则再次启用Universal Profiling索引模板管理,否则跳过此步骤:

      PUT _cluster/settings
      {
        "persistent": {
          "xpack.profiling.templates.enabled": true
        }
      }
  9. 如果需要,重置 action.destructive_requires_name 集群设置。

    PUT _cluster/settings
    {
      "persistent": {
        "action.destructive_requires_name": null
      }
    }

监控还原

edit

还原操作使用分片恢复过程从快照中恢复索引的主分片。在还原操作恢复主分片时,集群将具有黄色健康状态

在所有主分片恢复完成后,复制过程会在符合条件的数据节点之间创建并分发副本。当复制完成后,集群的健康状态通常会变为绿色

一旦您在 Kibana 中开始恢复,您将被导航到 恢复状态 页面。您可以使用此页面来跟踪快照中每个分片的当前状态。

您还可以使用Elasticsearch API监控快照恢复。要监控集群健康状态,请使用集群健康API

GET _cluster/health

要获取有关正在进行分片恢复的详细信息,请使用 索引恢复 API

GET my-index/_recovery

要查看任何未分配的分片,请使用cat shards API

GET _cat/shards?v=true&h=index,shard,prirep,state,node,unassigned.reason&s=state

未分配的分片具有stateUNASSIGNEDprirep值对于主分片是p,对于副本是runassigned.reason描述了分片保持未分配的原因。

要获取未分配分片的分配状态的更深入解释,请使用集群分配解释API

GET _cluster/allocation/explain
{
  "index": "my-index",
  "shard": 0,
  "primary": false,
  "current_node": "my-node"
}

取消恢复

edit

您可以删除索引或数据流以取消其正在进行的恢复。这还会删除集群中索引或数据流的任何现有数据。删除索引或数据流不会影响快照或其数据。

# Delete an index
DELETE my-index

# Delete a data stream
DELETE _data_stream/logs-my_app-default

恢复到不同的集群

edit

Elasticsearch Service 可以帮助您从其他部署中恢复快照。请参阅 使用快照

快照不与特定集群或集群名称绑定。您可以在一个集群中创建快照,并在另一个兼容的集群中恢复它。您从快照中恢复的任何数据流或索引也必须与当前集群的版本兼容。集群的拓扑结构不需要匹配。

要恢复快照,其存储库必须 已注册 并可用于新集群。 如果原始集群仍然具有对存储库的写访问权限,请将存储库注册为只读。这可以防止多个集群同时写入存储库并损坏存储库的内容。它还可以防止Elasticsearch缓存存储库的内容,这意味着其他集群所做的更改将立即变得可见。

在开始恢复操作之前,请确保新集群有足够的容量来容纳您想要恢复的任何数据流或索引。如果新集群的容量较小,您可以:

  • 添加节点或升级硬件以增加容量。
  • 恢复较少的索引和数据流。
  • 减少已恢复索引的副本数量

    例如,以下恢复快照API请求使用index_settings选项将index.number_of_replicas设置为1

    POST _snapshot/my_repository/my_snapshot_2099.05.06/_restore
    {
      "indices": "my-index,logs-my_app-default",
      "index_settings": {
        "index.number_of_replicas": 1
      }
    }

如果在原始集群中使用分片分配过滤将索引或后备索引分配给特定节点,则在新集群中将强制执行相同的规则。如果新集群不包含具有适当属性的节点,恢复的索引可以在这些节点上分配,则除非在恢复操作期间更改这些索引分配设置,否则索引将无法成功恢复。

还原操作还会检查还原的持久设置是否与当前集群兼容,以避免意外还原不兼容的设置。如果您需要还原包含不兼容持久设置的快照,请尝试在不包含全局集群状态的情况下进行还原。

排查恢复错误

edit

以下是如何解决还原请求返回的常见错误。

无法恢复索引 [] 因为集群中已经存在同名且打开的索引

edit

您无法恢复已经存在的开放索引。要解决此错误,请尝试恢复索引或数据流中的方法之一。

无法从具有 [y] 个分片的索引快照中恢复具有 [x] 个分片的索引 []

edit

如果索引已关闭且快照中的索引具有相同数量的主分片,您只能恢复现有索引。此错误表明快照中的索引具有不同数量的主分片。

要解决此错误,请尝试恢复索引或数据流中的方法之一。