可搜索的快照

edit

可搜索快照允许您使用快照以非常经济高效的方式搜索不常访问和只读的数据。冻结数据层使用可搜索快照来降低您的存储和运营成本。

可搜索快照消除了从热层滚动后对副本分片的需求,可能会将搜索数据所需的本地存储减少一半。可搜索快照依赖于您已经用于备份的相同快照机制,并且对您的快照存储库存储成本影响最小。

使用可搜索快照

edit

搜索可搜索的快照索引与搜索任何其他索引相同。

默认情况下,可搜索快照索引没有副本。底层快照提供了弹性,并且预计查询量足够低,单个分片副本将足够。然而,如果您需要支持更高的查询量,可以通过调整index.number_of_replicas索引设置来添加副本。

如果一个节点失败并且需要恢复可搜索快照分片到其他地方,在Elasticsearch将这些分片分配到其他节点的短暂时间内,集群健康状态将不会是绿色。在这些分片被重新分配到健康节点之前,命中这些分片的搜索可能会失败或返回部分结果。

您通常通过ILM管理可搜索的快照。可搜索的快照操作会在索引达到冻结阶段时自动将其转换为可搜索的快照索引。您还可以通过使用挂载快照 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 来分析您的存储库是否适合与可搜索快照一起使用。

可搜索快照的工作原理

edit

当从快照挂载索引时,Elasticsearch 会在集群中的数据节点上分配其分片。然后,数据节点会根据指定的 挂载选项 自动从存储库中检索相关分片数据到本地存储。如果可能,搜索会使用本地存储中的数据。如果数据在本地不可用,Elasticsearch 会从快照存储库中下载所需的数据。

如果持有这些分片之一的节点发生故障,Elasticsearch会自动在另一个节点上分配受影响的分片,并且该节点会从存储库中恢复相关的分片数据。不需要副本,也不需要复杂的监控或编排来恢复丢失的分片。尽管可搜索快照索引默认没有副本,但您可以通过调整index.number_of_replicas来为这些索引添加副本。可搜索快照分片的副本通过从快照存储库复制数据来恢复,就像可搜索快照分片的主分片一样。相比之下,常规索引的副本通过从主分片复制数据来恢复。

挂载选项

edit

要搜索快照,您必须首先将其作为索引本地挂载。通常,ILM会自动执行此操作,但您也可以自己调用挂载快照 API。从快照挂载索引有两种选项,每种选项具有不同的性能特征和本地存储占用:

Fully mounted index

在Elasticsearch集群中完全缓存快照索引的分片。ILM在阶段使用此选项。

完全挂载的索引的搜索性能通常与常规索引相当,因为几乎不需要访问快照仓库。在恢复过程中,搜索性能可能会比常规索引慢,因为搜索可能需要一些尚未检索到本地缓存的数据。如果发生这种情况,Elasticsearch 会积极地并行于正在进行的恢复过程中检索完成搜索所需的数据。磁盘上的数据在重启后得以保留,因此节点在重启后不需要重新下载已经存储在节点上的数据。

由ILM管理的索引在完全挂载时会带有前缀restored-

Partially mounted index

使用仅包含最近搜索的快照索引数据的本地缓存。此缓存具有固定大小,并在分配在同一数据节点上的部分挂载索引的分片之间共享。ILM在frozen阶段使用此选项。

如果搜索需要的数据不在缓存中,Elasticsearch 会从快照仓库中获取缺失的数据。需要这些获取操作的搜索速度较慢,但获取的数据会存储在缓存中,以便将来类似的搜索可以更快地完成。Elasticsearch 会从缓存中清除不常使用的数据以释放空间。当节点重启时,缓存会被清空。

尽管比完全挂载的索引或常规索引慢,部分挂载的索引仍然能够快速返回搜索结果,即使对于大型数据集也是如此,因为存储库中的数据布局经过高度优化以支持搜索。许多搜索在返回结果之前只需要检索总分片数据的一小部分。

由ILM管理的索引在部分挂载时会带有前缀 partial-

要部分挂载索引,您必须拥有一个或多个具有共享缓存可用的节点。默认情况下,专用冻结数据层节点(具有data_frozen角色且没有其他数据角色的节点)使用总磁盘空间的90%和总磁盘空间减去100GB的余量中的较大值来配置共享缓存。

强烈建议在生产环境中使用专用的冻结层。如果您没有专用的冻结层,则必须配置xpack.searchable.snapshot.shared_cache.size设置,以在一个或多个节点上为缓存预留空间。部分挂载的索引仅分配给具有共享缓存的节点。

手动快照挂载

手动挂载由索引生命周期管理(ILM)策略捕获的快照可能会干扰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

通过可搜索快照降低成本

edit

在大多数情况下,可搜索快照通过消除副本分片的需求以及分片数据在节点之间复制的需求,降低了运行集群的成本。然而,如果从快照仓库中检索数据在您的环境中特别昂贵,可搜索快照可能会比常规索引更昂贵。在使用可搜索快照之前,请确保您的操作环境的成本结构与可搜索快照兼容。

副本成本

edit

为了实现弹性,常规索引需要在多个节点上存储每个分片的多个冗余副本。如果一个节点发生故障,Elasticsearch 会使用冗余来重建任何丢失的分片副本。可搜索快照索引不需要副本。如果包含可搜索快照索引的节点发生故障,Elasticsearch 可以从快照存储库重建丢失的分片缓存。

没有副本的情况下,很少访问的可搜索快照索引需要的资源要少得多。一个包含无副本的完全挂载的可搜索快照索引的冷数据层,所需的节点和磁盘空间是包含相同数据的常规索引层的一半。而仅包含部分挂载的可搜索快照索引的冻结层,所需的资源更少。

数据传输成本

edit

当一个常规索引的分片在节点之间移动时,其内容会从集群中的另一个节点复制。在许多环境中,节点之间移动数据的成本是显著的,特别是在云环境中,节点位于不同的区域时。相比之下,当挂载一个可搜索的快照索引或移动其分片时,数据总是从快照存储库中复制。这通常要便宜得多。

大多数云服务提供商对跨区域传输数据和从其平台传出数据收取高额费用。您应该仅将快照挂载到与快照仓库位于同一区域的集群中。如果您希望跨多个区域搜索数据,请配置多个集群并使用跨集群搜索跨集群复制,而不是可搜索的快照。

备份和恢复可搜索快照

edit

您可以使用常规快照来备份包含可搜索快照索引的集群。当您恢复包含可搜索快照索引的快照时,这些索引将再次恢复为可搜索快照索引。

在恢复包含可搜索快照索引的快照之前,您必须首先 注册包含原始索引快照的仓库。恢复后,可搜索快照索引会从其原始仓库挂载原始索引快照。如果需要,您可以使用不同的仓库来存储常规快照和可搜索快照。

可搜索快照索引的快照仅包含少量元数据,用于标识其原始索引快照。它不包含原始索引的任何数据。如果原始索引快照不可用,备份的恢复将无法恢复任何可搜索快照索引。

因为可搜索快照索引不是常规索引,所以无法使用仅源代码仓库来对可搜索快照索引进行快照。

可搜索快照的可靠性

可搜索快照索引中的数据唯一副本是存储在仓库中的底层快照。如果您删除了这个快照,数据将会永久丢失。尽管Elasticsearch可能已经将部分数据缓存到本地存储以加快搜索速度,但如果您删除了底层快照,这些缓存的数据是不完整的,无法用于恢复。例如:

  • 在Elasticsearch中挂载了包含的任何可搜索快照时,您不得注销存储库。
  • 如果任何索引作为可搜索快照索引挂载,则不得删除快照。快照包含数据的唯一完整副本。如果删除它,则无法从其他地方恢复数据。
  • 如果您从存储库中挂载快照的索引,而该存储库具有不同集群的写访问权限,则必须确保其他集群不会删除这些快照。快照包含数据的唯一完整副本。如果删除它,则无法从其他地方恢复数据。
  • 可搜索快照索引中的数据缓存在本地存储中,因此如果您删除了底层可搜索快照,Elasticsearch将继续正常运行,直到第一次缓存未命中。这可能会晚得多,例如当分片重新定位到不同节点时,或当持有分片的节点重新启动时。
  • 如果仓库失败或损坏快照的内容,并且您无法将其恢复到之前健康的状态,那么数据将永久丢失。

    所有主要公共云提供商提供的Blob存储通常都提供了非常好的防故障或防损坏保护。如果您管理自己的存储库存储,那么您需要负责其可靠性。