paint-brush
了解 Elasticsearch 重新索引:何时重新索引、最佳实践和替代方案经过@rocksetcloud
144 讀數

了解 Elasticsearch 重新索引:何时重新索引、最佳实践和替代方案

经过 Rockset9m2024/05/08
Read on Terminal Reader

太長; 讀書

无论您是经验丰富的 Elasticsearch 用户还是刚刚开始您的旅程,了解重新索引对于维护高效的 Elasticsearch 集群都非常重要。
featured image - 了解 Elasticsearch 重新索引:何时重新索引、最佳实践和替代方案
Rockset HackerNoon profile picture
0-item


Elasticsearch是一种流行的高效可扩展数据存储和检索技术。但是,要保持其性能和数据完整性,需要进行一项名为“重新索引”的关键实践。索引是向 Elasticsearch 添加数据的初始过程,而重新索引对于保持数据准确性和优化搜索性能至关重要。


无论您是经验丰富的 Elasticsearch 用户还是刚刚开始使用,了解重新索引对于维护高效的 Elasticsearch 集群都非常重要。在本文中,我们将深入探讨 Elasticsearch 重新索引的基本知识,回答何时需要重新索引、如何触发重新索引以及如何充分利用 Elasticsearch 集群的最佳实践。

了解 Elasticsearch 重新索引

在 Elasticsearch 中,重新索引有助于维护数据完整性并提高性能。简而言之,它是将数据从一个索引复制到另一个索引的过程。虽然这听起来很简单,但如果操作不正确,可能会导致数据检索速度慢甚至结果不正确等问题


想象一下您的 Elasticsearch 索引就像一个井然有序的图书馆。随着时间的推移,书籍可能需要更新、重新排列甚至更换。重新索引类似于重新排列图书馆书架或更新书籍以保持一切井然有序。没有它,您的图书馆可能会变得杂乱无章,导致搜索速度变慢,数据可能不准确。


这个类比强调了理解 Elasticsearch 中重新索引的重要性。这不仅仅是复制数据;它还涉及维护“库”的完整性,以便高效搜索和检索。让我们看看何时需要重新索引以及如何掌握它。

何时需要重新索引?

当您的 Elasticsearch 数据模型或映射发生变化,或者您需要提高性能时,重新索引就变得必不可少。在本节中,我们将更详细地研究这些场景,以了解为什么需要重新索引的细微差别。

数据模型的结构变化

数据模型的结构变化是指 Elasticsearch 中数据结构的修改。这些变化可能包括添加或删除新字段或更改现有字段的数据类型等。


引入新字段通常需要重新索引,以确保 Elasticsearch 知道如何高效地搜索存储在该字段中的数据。修改数据类型需要全新的索引,因为您无法就地更改数据类型。一旦为修改后的数据类型创建了新的映射,数据就需要重新索引。


由于 Elasticsearch 的写入时架构方法,这些结构更改需要重新索引。Elasticsearch 在提取数据时对其进行索引,对数据结构的任何更改都可能导致现有数据与使用新架构写入的数据不一致。因此,如果不重新索引,由于数据项的架构不匹配,搜索查询可能会产生意外或不准确的结果。这可能会影响数据准确性和搜索性能。

映射更新或更改

映射是 Elasticsearch 中数据索引和查询方式的蓝图。修改这些映射时,通常需要重新索引。


映射定义了 Elasticsearch 中字段的数据类型和属性。对这些映射的任何更改都会影响数据的索引、存储和检索方式。例如,将文本字段更改为日期字段会从根本上改变数据的处理和查询方式。Elasticsearch 根据映射定义强制执行数据一致性。如果未重新索引数据,则对映射的更改可能会导致现有数据与更新后的架构之间出现不一致。


当修改映射时,特别是当它涉及更改数据类型或字段属性时,回填也变得很重要。回填是回溯填充或更新现有数据以使其与新架构或数据结构保持一致的过程。这意味着在映射更改后仍可以高效准确地查询现有数据。

性能增强和索引优化

重新索引不仅仅是一项例行维护任务,它还是一个用于优化 Elasticsearch 内搜索性能的强大工具。例如,重新索引允许您修改索引中的分片数量。调整分片数量或重新分片可以更均匀地分配数据,防止特定节点上的工作负载不均衡,从而提高搜索性能。


重新索引还可用于将索引合并在一起。假设您有多个小索引,它们共享相同的数据结构,并且经常一起查询。重新索引可以将它们合并为一个更大的索引。这减少了管理大量小索引的开销,从而可以提高搜索速度。


最后,重新索引可用于改进路由。通过重新索引并有效应用路由策略,您可以将查询路由到特定分片,从而最大限度地减少需要搜索的分片数量。如果您的数据经常按特定键(例如用户 ID)进行搜索,则这种有针对性的方法可以显著加快搜索查询速度。

升级集群

从 Elasticsearch 版本 6.X 升级到 8.0(当前主要版本)及更高版本时,您可能需要重新索引在版本 6 中创建的任何索引。Elasticsearch 的数据结构和底层机制在这些版本之间发生了显著变化,需要重新索引以实现兼容性和最佳性能。


重新索引过程可确保数据与更新的结构和新功能保持一致,从而确保您能够无缝地从旧版本迁移到新版本。Elasticsearch 建议使用其升级助手来帮助完成此过程。

如何触发重新索引操作

通过 Elasticsearch Reindex API,您可以在 Elasticsearch 中重新索引。Reindex API 是现有索引与要创建或修改的新索引之间的桥梁。其主要目的是实现从一个索引到另一个索引的数据高效传输,除此之外,您还可以:


  • 有选择地将文档从源索引复制到目标索引。

  • 应用复杂的数据转换,例如字段重命名或类型转换。

  • 根据特定标准过滤数据。

  • 使用限制和刷新间隔等选项来控制索引过程。


在使用 Reindex API 之前,请确保您想要移动或转换数据的目标索引已创建并正确配置。


要触发重新索引,您需要向_reindex端点制定 POST 请求,指定源和目标索引以及任何所需的转换或过滤器。重新索引 POST 请求的示例如下所示。


 POST /_reindex { "source": { "index": "source_index" }, "dest": { "index": "target_index" }, "script": { "source": "ctx._source.new_field = 'transformed value'" }, "query": { "term": { "category.keyword": "example" } } }


请求构建完成后,您可以将请求发送到 Elasticsearch,启动重新索引过程。Elasticsearch 将按照您定义的指令开始将数据从源索引复制到目标索引。


重新索引完成后,彻底测试目标索引中的数据,以确保其符合您的预期。例如,您可以比较源索引和目标索引之间的字段映射,以确认在重新索引期间字段映射正确。您还可以从源索引和目标索引中检索文档样本,并进行比较以验证数据是否已准确重新索引。

重新索引的最佳实践

在 Elasticsearch 中重新索引时,您应该遵循这些最佳实践,以确保重新索引过程顺利,不会丢失数据,并且对现有集群操作的影响很小。

优先考虑数据备份

在启动任何重新索引活动之前,备份集群非常重要。此预防措施可充当安全网,如果在重新索引过程中出现任何意外问题,可以恢复到原始状态。


重新索引后,源索引应该仍然存在,但是,在进行重大更改之前始终拥有可靠的数据副本是一个基本原则。

首先在受控环境中进行重新索引

为了减轻重新索引过程中的潜在风险和挑战,建议先在预生产环境中执行该操作。这样,您可以识别并解决任何不可预见的问题,而不会影响生产系统。在预生产环境中完成并验证该过程后,即可在生产中安全地运行。

监控资源使用情况

在重新索引期间监控系统资源非常重要,以防止对基础架构造成压力。重新索引可能耗费大量资源,尤其是对于较大的数据集。密切关注 CPU、内存、磁盘使用情况和网络活动有助于优化资源分配,确保流程高效运行而不会造成性能瓶颈。要检查资源使用情况,您可以使用节点统计 API。


GET /_nodes/stats


这将返回如下的响应。


 { "_nodes": { "total": 2, "successful": 2, "failed": 0 }, "cluster_name": "my_cluster", "nodes": { "node_id1": { "name": "node_name1", "process": { "cpu": { "percent": 30, } }, "jvm": { "mem": { "heap_used_percent": 40.3, "heap_used_in_bytes": 123456789, "heap_max_in_bytes": 256000000 } } }, "node_id2": { "name": "node_name2", "process": { "cpu": { "percent": 50, } }, "jvm": { "mem": { "heap_used_percent": 60.8, "heap_used_in_bytes": 210987654, "heap_max_in_bytes": 256000000 } } } } }


如果您发现重新索引过于繁琐,您可以在提交重新索引请求时设置requests_per_second参数来限制该过程。这将在批次之间添加一个休眠时间,休眠时间由参数设置,以在批次之间提供冷却时间。

验证并确认结果

重新索引完成后,您应该验证目标索引中的数据,以确保其符合预期。此验证过程应包含各种测试,包括文档计数、字段映射和搜索查询。

替代解决方案

Elasticsearch 无疑已成为 NoSQL 搜索和分析领域的杰出解决方案。然而,值得探索提供独特数据索引和查询方法的替代解决方案,尤其是像 Rockset 这样的解决方案。


Rockset 是 Elasticsearch 的云原生替代方案,它提供了索引和查询数据的不同视角。与 Elasticsearch 的写入时模式方法不同,Rockset 允许无模式提取。无需预先定义模式即可提取和查询数据,从而提供更大的灵活性来处理不断发展的数据集,而无需重新索引。


在索引管理方面,Rockset 受益于其融合索引模型,其中行索引、列索引和搜索索引都是在数据被提取时自动创建的。这与 Elasticsearch 形成鲜明对比,Elasticsearch 中的索引是由用户创建的,并且结构更改通常需要耗时的重新索引程序。


虽然 Elasticsearch 仍然是各种用例的强大解决方案,但探索 Rockset 等替代方案可能会很有用,特别是当您发现在 Elasticsearch 中重新索引成为一种频繁活动时。

结论

重新索引是 Elasticsearch 中的一个基本过程,对于在数据结构发展过程中保持搜索结果的效率和准确性非常重要。


如果您发现重新索引已成为团队的持续时间负担,那么可能值得探索 Rockset 等替代解决方案。Rockset 提供了更简化的索引管理流程,使开发人员能够专注于更多增值活动。