恢复快照
本指南介绍如何还原快照。快照是在集群外部存储数据副本的一种便捷方法。您可以在删除数据或发生硬件故障后还原快照以恢复索引和数据流。您还可以使用快照在集群之间传输数据。
在本指南中,您将学习如何
本指南还提供了关于还原到另一个集群以及排查常见还原错误的提示。
要使用 Kibana 的快照和恢复功能,您必须具备以下权限
要注册快照仓库或恢复快照,集群的全局元数据必须是可写的。请确保没有任何阻止写访问的集群块。恢复操作会忽略索引块。
您只能将快照还原到具有已选定主节点的运行中集群。快照的存储库必须已注册且对集群可用。
快照和集群版本必须兼容。请参阅快照兼容性。
在还原数据流之前,请确保集群包含启用了数据流的匹配索引模板。要进行检查,请使用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 加密密钥。
从快照还原数据时,请记住以下几点
- 如果您还原数据流,也会同时还原其后备索引。
- 只有在现有索引处于关闭状态且快照中的索引具有相同数量的主分片时,您才能还原该现有索引。
- 您无法还原现有的打开状态索引。这包括数据流的后备索引。
- 还原操作会自动打开还原的索引,包括后备索引。
- 您只能从数据流中还原特定的后备索引。但是,还原操作不会将还原的后备索引添加到任何现有的数据流中。
- 如果您需要将还原的索引添加到数据流中,可以使用带有
add_backing_index操作的修改数据流 API。请谨慎操作,因为手动添加后备索引可能会导致数据流出现意外行为。
要在 Kibana 中查看可用快照列表
- 转到导航菜单中的快照和恢复管理页面,或者使用全局搜索字段。
- 选择 Snapshots(快照)选项卡。
您还可以使用获取存储库 API 和获取快照 API 来查找可供还原的快照。首先,使用获取存储库 API 获取已注册快照存储库的列表。
GET _snapshot
然后使用获取快照 API 获取特定存储库中的快照列表。这还会返回每个快照的内容。
GET _snapshot/my_repository/*?verbose=false
您可以使用 Kibana 的“快照和还原”功能或还原快照 API 来还原快照。
默认情况下,还原请求会尝试还原快照中的所有常规索引和常规数据流。在大多数情况下,您只需从快照中还原特定的索引或数据流。但是,您无法还原现有的打开状态索引。
如果您要将数据还原到预先存在的集群,请使用以下方法之一以避免与现有索引和数据流发生冲突
避免冲突的最简单方法是在还原现有索引或数据流之前将其删除。为防止意外重新创建索引或数据流,建议您暂时停止所有索引操作,直到还原操作完成为止。
如果 action.destructive_requires_name 集群设置为 false,请勿使用 delete index 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"
}
如果您希望避免删除现有数据,可以改为重命名要还原的索引和数据流。通常,您可以使用此方法将现有数据与快照中的历史数据进行比较。例如,您可以使用此方法在意外更新或删除后审查文档。
在开始之前,请确保集群有足够的容量来容纳现有数据和还原的数据。
以下还原快照 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。
还原操作完成后,您可以比较原始数据和还原的数据。如果您不再需要原始索引或数据流,可以将其删除,并使用重新索引来重命名还原的索引或数据流。
# 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"
}
}
您可以还原功能状态以从快照中恢复某个功能的系统索引、系统数据流和其他配置数据。
如果您还原快照的集群状态,该操作默认会还原快照中的所有功能状态。同样,如果您不还原快照的集群状态,该操作默认不会还原任何功能状态。您也可以选择仅从快照中还原特定的功能状态,而不管集群状态如何。
功能后备索引取决于版本。要查看快照的功能状态中包含哪些索引,请列出适用的快照。例如,在 Elastic Cloud Hosted 上,您可以轮询其内置 cloud-snapshot-policy SLM 策略上的最新快照
GET /_snapshot/_all/_all?filter_path=snapshots.feature_states&index_names=false&sort=start_time&size=1&order=desc&slm_policy_filter=cloud-snapshot-policy
响应的 feature_states 属性包含快照中的功能列表以及每个功能的索引。以下是集群可能显示的输出示例
{
"snapshots": [
{
"feature_states": [
{
"feature_name": "security",
"indices": [".security-tokens-7",".security-7",".security-profile-8"]
},
{
"feature_name": "geoip",
"indices": [".geoip_databases"]
},
{
"feature_name": "async_search",
"indices": [".async-search"]
},
{
"feature_name": "searchable_snapshots",
"indices": [".snapshot-blob-cache"]
},
{
"feature_name": "transform",
"indices": [".transform-internal-007"]
},
{
"feature_name": "inference_plugin",
"indices": [".secrets-inference",".inference"]
},
{
"feature_name": "kibana",
"indices": [
".kibana_usage_counters_9.x.x_001",
".kibana_9.x.x_001",
".apm-custom-link",
".kibana_search_solution_9.x.x_001",
".kibana_task_manager_9.x.x_001",
".apm-agent-configuration",
".kibana_locks-000001",
".kibana_security_session_1",
".kibana_alerting_cases_9.x.x_001",
".kibana_analytics_9.x.x_001",
".kibana_security_solution_9.x.x_001",
".kibana_ingest_9.x.x_001"
]
}
]
}
]
}
要从快照中还原特定的功能状态,请在还原快照 API 的 feature_states 参数中指定响应中的 feature_name。
请注意,功能状态名称可能与 Kibana UI 界面相对应,但还原单个功能状态可能无法完全重置该 UI。例如,Fleet UI 依赖于 fleet 功能状态以及 kibana 和 security。在还原时,务必在 feature_states 参数中包含所有必要的功能状态,以达到所需的重置行为。
还原 security 功能状态会覆盖用于身份验证的系统索引。如果您使用 Elastic Cloud Hosted 或 Elastic Cloud Enterprise,请确保在还原 security 功能状态之前能够访问 Elasticsearch API 控制台。如果您在自己的硬件上或在 Elastic Cloud on Kubernetes 上运行 Elasticsearch,请创建一个具有提升权限的临时用户,以便在文件域中编辑受限制的索引,以确保您仍然能够访问集群。
当您还原功能状态时,Elasticsearch 会关闭并覆盖该功能现有的索引和数据流。例如,要快照还原 geoip 功能状态,您可以使用
POST _snapshot/my_repository/my_snapshot_2099.05.06/_restore
{
"feature_states": [ "geoip" ],
"include_global_state": false,
"indices": "-*"
}
- 从还原操作中排除集群状态。
- 从还原操作中排除快照中的其他索引和数据流。
在某些情况下,您需要从快照还原整个集群,包括集群状态和所有功能状态。这种情况应该很少见,例如在发生灾难性故障时。
还原整个集群(包括集群状态和所有功能状态)要求最初创建要还原的快照时,已同时包含集群状态和功能状态。
还原整个集群涉及删除重要的系统索引,包括用于身份验证的系统索引。请考虑是否可以改为还原特定的索引或数据流。
如果您要还原到不同的集群,请在开始之前参阅还原到不同的集群。
如果您备份了集群的配置文件,可以将它们还原到每个节点。此步骤是可选的,并且需要进行集群完全重启。
关闭节点后,将备份的配置文件复制到节点的
$ES_PATH_CONF目录中。在重新启动节点之前,请确保elasticsearch.yml包含适当的节点角色、节点名称和其他节点特定设置。如果您选择执行此步骤,则必须在集群中的每个节点上重复此过程。
暂时停止索引并关闭以下功能
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 } }Watcher
POST _watcher/_stopUniversal Profiling
检查是否启用了 Universal Profiling 索引模板管理
GET /_cluster/settings?filter_path=**.xpack.profiling.templates.enabled&include_defaults=true如果值为
true,请禁用 Universal Profiling 索引模板管理PUT _cluster/settings{ "persistent": { "xpack.profiling.templates.enabled": false } }
如果您使用 Elasticsearch 安全功能,请按照基于文件的访问恢复操作,临时创建一个具有提升权限的用户来编辑受限制的索引。使用此文件域用户对请求进行身份验证,直到还原操作完成。
使用集群更新设置 API 将
action.destructive_requires_name设置为false。这使您可以使用通配符删除数据流和索引。PUT _cluster/settings{ "persistent": { "action.destructive_requires_name": false } }删除集群上的所有现有数据流。
DELETE _data_stream/*?expand_wildcards=all删除集群上的所有现有索引。
DELETE *?expand_wildcards=all还原整个快照,包括集群状态。默认情况下,还原集群状态也会还原快照中的任何功能状态。
POST _snapshot/my_repository/my_snapshot_2099.05.06/_restore{ "indices": "*", "include_global_state": true }还原操作完成后,恢复索引并重新启动您停止的任何功能
注意还原快照时,创建快照时正在使用的许可证也将被还原。如果您的许可证自快照创建以来已过期,则需要使用更新许可证 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 } }Watcher
POST _watcher/_startUniversal Profiling
如果初始值为
true,请再次启用 Universal Profiling 索引模板管理,否则跳过此步骤PUT _cluster/settings{ "persistent": { "xpack.profiling.templates.enabled": true } }
如果需要,重置
action.destructive_requires_name集群设置。PUT _cluster/settings{ "persistent": { "action.destructive_requires_name": null } }
还原操作使用分片恢复过程从快照恢复索引的主分片。在还原操作恢复主分片的同时,集群将处于 yellow(黄色)健康状态。
恢复所有主分片后,复制过程会在符合条件的数据节点之间创建和分发副本。复制完成后,集群健康状态通常会变为 green(绿色)。
一旦在 Kibana 中启动还原,您就会被导航到 Restore Status(还原状态)页面。您可以使用此页面跟踪快照中每个分片的当前状态。
您还可以使用 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
未分配的分片的 state 为 UNASSIGNED。对于主分片,prirep 值为 p,对于副本,则为 r。unassigned.reason 描述了分片保持未分配状态的原因。
要深入了解未分配分片的分配状态,请使用集群分配解释 API。
GET _cluster/allocation/explain
{
"index": "my-index",
"shard": 0,
"primary": false,
"current_node": "my-node"
}
您可以删除索引或数据流来取消其正在进行的还原。这也会删除集群中该索引或数据流的任何现有数据。删除索引或数据流不会影响快照或其数据。
# Delete an index
DELETE my-index
# Delete a data stream
DELETE _data_stream/logs-my_app-default
Elastic Cloud Hosted 和 Elastic Cloud Enterprise 可以帮助您从其他部署中还原快照。有关更多信息,请参阅跨集群还原快照。
快照不与特定的集群或集群名称绑定。您可以在一个集群中创建快照,并在另一个兼容的集群中将其还原。您从快照还原的任何数据流或索引也必须与当前集群的版本兼容。集群的拓扑结构不需要匹配。
要还原快照,其存储库必须已注册且对新集群可用。如果原始集群仍然对存储库具有写访问权限,请将存储库注册为只读。这可以防止多个集群同时向存储库写入数据并损坏存储库的内容。它还可以防止 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 } }
如果原始集群中的索引或后备索引使用分片分配过滤分配给特定节点,则新集群中也将强制执行相同的规则。如果新集群不包含可供还原的索引分配到的具有适当属性的节点,除非在还原操作期间更改这些索引分配设置,否则索引将无法成功还原。
还原操作还会检查还原的持久设置是否与当前集群兼容,以避免意外还原不兼容的设置。如果您需要还原具有不兼容持久设置的快照,请尝试在不包含全局集群状态的情况下进行还原。
以下是如何解决还原请求返回的常见错误的方法。
您无法还原已存在的打开状态索引。要解决此错误,请尝试还原索引或数据流中的方法之一。
只有在现有索引处于关闭状态且快照中的索引具有相同数量的主分片时,您才能还原该现有索引。此错误表明快照中的索引具有不同数量的主分片。
要解决此错误,请尝试还原索引或数据流中的方法之一。