可搜索快照
编辑可搜索快照
编辑可搜索快照让您能够以极具成本效益的方式使用快照来搜索不经常访问和只读的数据。 冷和冻结数据层使用可搜索快照来降低您的存储和运营成本。
在从热层滚动后,可搜索快照消除了对副本分片的需求,从而可能将搜索数据所需的本地存储空间减半。 可搜索快照依赖于您已经用于备份的相同快照机制,并且对快照存储库存储成本的影响很小。
使用可搜索快照
编辑搜索可搜索快照索引与搜索任何其他索引相同。
默认情况下,可搜索快照索引没有副本。底层快照提供弹性,并且预计查询量足够低,以至于单个分片副本就足够了。但是,如果您需要支持更高的查询量,可以通过调整 index.number_of_replicas
索引设置来添加副本。
如果节点发生故障并且可搜索快照分片需要在其他位置恢复,则在 Elasticsearch 将分片分配到其他节点时会有一段短暂的时间,此时集群运行状况不会为 green
。命中这些分片的搜索可能会失败或返回部分结果,直到分片重新分配到正常节点。
您通常通过 ILM 管理可搜索快照。当常规索引达到 cold
或 frozen
阶段时,可搜索快照操作会自动将该索引转换为可搜索快照索引。 您还可以使用 挂载快照 API 手动挂载现有快照中的索引,从而使它们可搜索。
要从包含多个索引的快照中挂载索引,我们建议创建仅包含您要搜索的索引的快照克隆,并挂载该克隆。 如果快照有任何已挂载的索引,则不应删除该快照,因此创建克隆使您可以独立于任何可搜索快照来管理备份快照的生命周期。 如果您使用 ILM 来管理您的可搜索快照,它将根据需要自动处理快照的克隆。
您可以使用与常规索引相同的机制来控制可搜索快照索引的分片分配。 例如,您可以使用索引级别的分片分配过滤将可搜索快照分片限制为节点的一个子集。
可搜索快照索引的恢复速度受到存储库设置 max_restore_bytes_per_sec
和节点设置 indices.recovery.max_bytes_per_sec
的限制,就像正常的恢复操作一样。默认情况下,max_restore_bytes_per_sec
是无限制的,但 indices.recovery.max_bytes_per_sec
的默认值取决于节点的配置。 请参阅恢复设置。
我们建议您在拍摄将要作为可搜索快照索引挂载的快照之前,强制合并索引到每个分片单个段。 每次从快照存储库读取都需要时间和成本,并且段越少,恢复快照或响应搜索所需的读取就越少。
可搜索快照非常适合管理大量的历史数据存档。 历史信息的搜索频率通常低于最近的数据,因此可能不需要副本以获得其性能优势。
对于更复杂或耗时的搜索,您可以使用带有可搜索快照的异步搜索。
您还可以使用这些存储库类型的替代实现,例如 MinIO,只要它们完全兼容。 使用存储库分析 API 来分析您的存储库是否适合与可搜索快照一起使用。
可搜索快照的工作原理
编辑当从快照挂载索引时,Elasticsearch 会将其分片分配到集群内的数据节点。 然后,数据节点会根据指定的挂载选项,自动将相关的分片数据从存储库检索到本地存储。 如果可能,搜索使用本地存储中的数据。 如果本地没有数据,Elasticsearch 会从快照存储库下载所需的数据。
如果持有这些分片之一的节点发生故障,Elasticsearch 会自动在另一个节点上分配受影响的分片,并且该节点会从存储库恢复相关的分片数据。 不需要副本,也不需要复杂的监控或编排来恢复丢失的分片。 尽管可搜索快照索引默认没有副本,但您可以通过调整 index.number_of_replicas
来向这些索引添加副本。 可搜索快照分片的副本通过从快照存储库复制数据来恢复,就像可搜索快照分片的主分片一样。 相比之下,常规索引的副本是通过从主分片复制数据来恢复的。
挂载选项
编辑要搜索快照,您必须首先将其在本地挂载为索引。 通常 ILM 会自动执行此操作,但您也可以自己调用挂载快照 API。 有两种从快照挂载索引的选项,每种选项都具有不同的性能特征和本地存储占用空间
- 完全挂载的索引
-
完全缓存在 Elasticsearch 集群中快照索引的分片。 ILM 在
hot
和cold
阶段使用此选项。完全挂载的索引的搜索性能通常与常规索引相当,因为几乎不需要访问快照存储库。 虽然恢复正在进行中,但搜索性能可能比常规索引慢,因为搜索可能需要一些尚未检索到本地缓存中的数据。 如果发生这种情况,Elasticsearch 将在正在进行的恢复的同时,并行地急切检索完成搜索所需的数据。 磁盘上的数据会在重启后保留,这样节点在重启后无需重新下载已存储在节点上的数据。
由 ILM 管理的索引在完全挂载时以
restored-
为前缀。
- 部分挂载的索引
-
使用一个本地缓存,该缓存仅包含快照索引数据的最近搜索部分。 此缓存具有固定大小,并在同一数据节点上分配的部分挂载索引的分片之间共享。 ILM 在
frozen
阶段使用此选项。如果搜索需要缓存中没有的数据,Elasticsearch 会从快照存储库中获取缺失的数据。 需要这些获取的搜索速度较慢,但是获取的数据存储在缓存中,以便将来可以更快地为类似的搜索提供服务。 Elasticsearch 将从缓存中逐出不常用的数据以释放空间。 当节点重启时,缓存将被清除。
虽然比完全挂载的索引或常规索引慢,但部分挂载的索引仍然可以快速返回搜索结果,即使对于大型数据集也是如此,因为存储库中数据的布局已针对搜索进行了高度优化。 许多搜索只需要检索总分片数据的一小部分即可返回结果。
由 ILM 管理的索引在部分挂载时以
partial-
为前缀。
要部分挂载索引,您必须有一个或多个具有可用共享缓存的节点。 默认情况下,专用冻结数据层节点(具有 data_frozen
角色且没有其他数据角色的节点)会配置一个共享缓存,该缓存使用总磁盘空间的 90% 和总磁盘空间减去 100GB 的预留空间中的较大者。
强烈建议将专用冻结层用于生产环境。 如果您没有专用的冻结层,则必须配置 xpack.searchable.snapshot.shared_cache.size
设置,以便在一个或多个节点上为缓存预留空间。 部分挂载的索引仅分配给具有共享缓存的节点。
手动挂载索引生命周期管理 (ILM) 策略捕获的快照可能会干扰 ILM 的自动管理。 这可能会导致数据丢失或快照处理复杂化等问题。
为了获得最佳结果,请允许 ILM 自动管理快照。
-
xpack.searchable.snapshot.shared_cache.size
- (静态) 为部分挂载索引的共享缓存保留的磁盘空间。 接受总磁盘空间的百分比或绝对字节值。 专用的冻结数据层节点默认为总磁盘空间的
90%
。 否则,默认为0b
。 -
xpack.searchable.snapshot.shared_cache.size.max_headroom
- (静态,字节值) 对于专用的冻结层节点,要维护的最大预留空间。 如果没有显式设置
xpack.searchable.snapshot.shared_cache.size
,则此设置默认为100GB
。 否则,默认为-1
(未设置)。 只有在将xpack.searchable.snapshot.shared_cache.size
设置为百分比时,才能配置此设置。
为了说明这些设置如何协同工作,让我们看看在专用冻结节点上使用这些设置的默认值时的两个示例
- 4000 GB 的磁盘将导致大小为 3900 GB 的共享缓存。 4000 GB 的 90% 是 3600 GB,留下 400 GB 的预留空间。 默认的
max_headroom
100 GB 生效,因此结果为 3900 GB。 - 400 GB 的磁盘将导致大小为 360 GB 的共享缓存。
您可以在 elasticsearch.yml
中配置这些设置。
xpack.searchable.snapshot.shared_cache.size: 4TB
您只能在具有 data_frozen
角色的节点上配置这些设置。此外,具有共享缓存的节点只能有一个 数据路径。
Elasticsearch 还使用一个名为 .snapshot-blob-cache
的专用系统索引来加速可搜索快照分片的恢复。此索引用作部分或完全挂载数据的附加缓存层,并包含启动可搜索快照分片所需的最小数据。Elasticsearch 会自动删除此索引中不再使用的文档。可以使用以下设置调整此定期清理操作:
-
searchable_snapshots.blob_cache.periodic_cleanup.interval
- (动态)计划对
.snapshot-blob-cache
索引进行定期清理的间隔。默认为每小时(1h
)。 -
searchable_snapshots.blob_cache.periodic_cleanup.retention_period
- (动态)在
.snapshot-blob-cache
索引中保留过时文档的保留期。默认为每小时(1h
)。 -
searchable_snapshots.blob_cache.periodic_cleanup.batch_size
- (动态)在
.snapshot-blob-cache
索引的定期清理期间,一次搜索和批量删除的文档数量。默认为100
。 -
searchable_snapshots.blob_cache.periodic_cleanup.pit_keep_alive
- (动态)在
.snapshot-blob-cache
索引的定期清理期间执行的 时间点保持活动 请求所使用的值。默认为10m
。
使用可搜索快照降低成本
编辑在大多数情况下,可搜索快照通过消除对副本分片的需求以及在节点之间复制分片数据的需求来降低运行集群的成本。但是,如果从您的环境中的快照存储库检索数据的成本特别高,则可搜索快照的成本可能高于常规索引。在使用可搜索快照之前,请确保您的操作环境的成本结构与可搜索快照兼容。
副本成本
编辑为了保证弹性,常规索引需要在多个节点上为每个分片保留多个冗余副本。如果节点发生故障,Elasticsearch 将使用冗余来重建任何丢失的分片副本。可搜索快照索引不需要副本。如果包含可搜索快照索引的节点发生故障,Elasticsearch 可以从快照存储库重建丢失的分片缓存。
在没有副本的情况下,很少访问的可搜索快照索引需要的资源要少得多。一个包含无副本完全挂载的可搜索快照索引的冷数据层,与包含相同数据的常规索引层相比,只需要一半的节点和磁盘空间。仅包含部分挂载的可搜索快照索引的冻结层所需的资源甚至更少。
数据传输成本
编辑当常规索引的分片在节点之间移动时,其内容将从集群中的另一个节点复制。在许多环境中,节点之间移动数据的成本很高,尤其是在云环境中跨不同区域的节点运行时。相反,当挂载可搜索快照索引或移动其分片之一时,数据始终从快照存储库复制。这通常要便宜得多。
值得注意的是,如果可搜索快照索引没有副本,那么当托管它的节点关闭时,分配将立即尝试将索引重新定位到新节点,以最大程度地提高可用性。对于完全挂载的索引,这将导致新节点从云存储库下载整个索引快照。在滚动集群重启下,每个可搜索快照索引可能会发生多次这种情况。在计划的节点重启期间临时禁用分配将避免这种情况,如集群重启过程中所述。
备份和恢复可搜索快照
编辑您可以使用常规快照来备份包含可搜索快照索引的集群。当您恢复包含可搜索快照索引的快照时,这些索引会再次恢复为可搜索快照索引。
在恢复包含可搜索快照索引的快照之前,您必须首先注册包含原始索引快照的存储库。恢复后,可搜索快照索引会从其原始存储库挂载原始索引快照。如果需要,您可以为常规快照和可搜索快照使用单独的存储库。
可搜索快照索引的快照仅包含少量元数据,用于标识其原始索引快照。它不包含来自原始索引的任何数据。如果任何可搜索快照索引的原始索引快照不可用,则备份的恢复将失败。
由于可搜索快照索引不是常规索引,因此无法使用 仅源存储库来创建可搜索快照索引的快照。
可搜索快照索引中数据的唯一副本是存储在存储库中的基础快照。如果您删除此快照,数据将永久丢失。尽管 Elasticsearch 可能已将部分数据缓存到本地存储以加快搜索速度,但此缓存数据不完整,如果您删除基础快照,则无法用于恢复。例如
- 在 Elasticsearch 中挂载了它包含的任何可搜索快照时,您不得注销存储库。
- 如果任何索引作为可搜索快照索引挂载,则您不得删除快照。快照包含数据的唯一完整副本。如果您删除它,则无法从其他地方恢复数据。
- 如果您从具有不同集群写访问权限的存储库中挂载索引,则必须确保其他集群不会删除这些快照。快照包含数据的唯一完整副本。如果您删除它,则无法从其他地方恢复数据。
- 可搜索快照索引中的数据缓存在本地存储中,因此,如果您删除基础可搜索快照,Elasticsearch 将继续正常运行,直到第一次缓存未命中。这可能会晚得多,例如,当分片重新定位到其他节点时,或者当托管该分片的节点重新启动时。
-
如果存储库发生故障或损坏快照的内容,并且您无法将其恢复到之前的健康状态,则数据将永久丢失。
所有主要的公共云提供商提供的 blob 存储通常提供非常好的保护,以防止故障或损坏。如果您管理自己的存储库存储,则您负责其可靠性。