刚接触 Elasticsearch 吗?欢迎参加我们的 Elasticsearch 入门网络研讨会。您也可以开始免费云服务试用,或立即在您的计算机上试用 Elastic。
Elasticsearch 在 Lucene 的基础上建立了一个分布式系统,解决了可扩展性和容错问题,从而增强了 Lucene 的功能。它还提供基于 JSON 的 REST 应用程序接口,使与其他系统的互操作性变得非常简单。
Elasticsearch 等分布式系统可能非常复杂,影响其性能和稳定性的因素很多。分片是 Elasticsearch 中最基本的概念之一,了解分片的工作原理将使您能够有效地管理 Elasticsearch 集群。
本文将解释什么是主分片和副本分片,它们对 Elasticsearch 集群的影响,以及有哪些工具可以调整它们以适应不同的需求。
了解碎片
Elasticsearch 索引中的数据可能会大量增长。为了便于管理,每条数据都保存在一个索引中,而索引是将一个索引分割成若干碎片。每个 Elasticsearch 分区都是一个 Apache Lucene 索引,每个单独的 Lucene 索引都包含 Elasticsearch 索引中文档的一个子集。以这种方式拆分索引可以控制资源使用量。Apache Lucene 索引的上限为 2,147,483,519 (2³¹ - 129) 个文档。
有时,出于重新平衡的目的,需要在节点间移动指数。由于这一过程需要大量时间和资源,因此索引不应过大,这有助于保持可控的恢复时间。此外,由于索引是由需要不断合并在一起的 Lucene 段组成的,因此段不能太大,这一点很重要。由于这些原因,Elasticsearch 将索引数据分割成更易于管理的小块(称为主分片),这些分片可以更方便地分布在多台计算机上。复制分区只是相应主分区的一个精确副本,我们将在本文稍后部分介绍它们的功能。
拥有适当数量的分片对性能非常重要。因此,提前制定计划是明智之举。当查询在不同分片上并行运行时,其执行速度要快于由单个分片组成的索引,但前提是每个分片位于不同的节点上,且集群中有足够多的节点。但与此同时,分片也会消耗内存和磁盘空间,包括索引数据和集群元数据。分片过多(也称为过度分片)会降低查询、索引请求和管理操作的速度,因此保持适当的平衡至关重要。
主分区的数量是在为特定索引实例创建索引时定义的。如果以后需要不同数量的主分片,可以使用 调整大小API --拆分(更多的主分片)、收缩(更少的主分片)或克隆(相同数量的主分片,并对副本进行新的设置)。创建索引时,可以将主分片和副本分片的数量设置为索引的设置:
(如果没有指定分片或副本的数量,从 Elasticsearch 7.0 开始,两者的默认值都是 1)。理想的分片数量应根据索引中的数据量来确定。一般来说,一个最佳分区应容纳 10-50GB 的数据,每个分区的文件数少于 2 亿。例如,如果您预计一天内会积累约 300GB 的应用程序日志,那么在该索引中设置约 10 个分片是合理的,前提是您有足够多的节点来托管这些分片。
碎片在其生命周期中会经历多种状态,包括
- 初始化:使用分片前的初始状态。
- 已启动:分片处于激活状态,可以接收请求。
- 搬迁:当分片正在被移动到不同节点时出现的一种状态。这在某些情况下可能是必要的,例如,当它们所在的节点快用完磁盘空间时。
- 未分配:未能分配的分区的状态。发生这种情况时会给出原因,例如,托管分片的节点已不在集群中(NODE_LEFT)或由于恢复到一个已关闭的索引中(EXISTING_INDEX_RESTORED)。
要查看所有分片、它们的状态和其他元数据,可以使用以下请求:
要查看特定索引的分片,可以在 URL 中添加索引名称,例如传感器:
该命令会产生输出结果,如下面的示例。默认情况下,显示的列包括索引名称、名称(即编号)、是主分片还是副本、状态、文件数量、磁盘大小以及分片所在节点的 IP 地址和节点 ID。
了解副本
每个分区只包含一份数据副本,而索引则可以包含多个分区副本。因此有两种分片,即主分片和副本或复制 分片。主分片的每个副本总是位于不同的节点上,这就确保了在节点发生故障时数据的高可用性。除了冗余及其在防止数据丢失和宕机方面的作用外,副本还可以帮助提高搜索性能,因为它允许查询与主分片并行处理,因此速度更快。
主分片和副本分片的行为方式存在一些重要差异。虽然两者都能处理查询、索引请求(即向索引添加数据)必须先经过主分片,然后才能复制到副本分片。如上所述,如果主分片不可用--例如,由于节点断开或硬件故障--副本就会被提升以接替其角色。
虽然复制可以在节点发生故障时提供帮助,但重要的是不要有太多的复制,因为它们会在编制索引时消耗内存、磁盘空间和计算能力。主分片和副本之间的另一个区别是,虽然主分片的数量在索引创建后无法更改,但副本的数量可以通过更新索引设置随时动态更改。
复制的另一个考虑因素是可用节点的数量。副本总是放在与主分片不同的节点上,因为如果节点发生故障,同一节点上的两个相同数据副本将无法提供保护。因此,一个系统要支持n 个副本,集群中至少需要有n + 1 个节点。例如,如果集群中有两个节点,而索引配置了六个副本,则只会分配一个副本。另一方面,拥有七个节点的系统完全可以处理一个主分片和六个副本。
优化分片和副本
即使在创建了主分片和副本分片平衡得当的索引后,也需要对这些分片进行监控,因为索引的动态会随着时间的推移而发生变化。例如,在处理时间序列数据时,最新数据的指数通常比旧数据的指数更活跃。如果不对这些指数进行调整,它们将消耗相同数量的资源,尽管它们的需求非常不同。
翻转索引 API 可用于区分新旧索引。可以对其进行设置,一旦达到某个阈值(磁盘上索引的大小、文档数量或年限),它就会自动创建新索引。该 API 对于控制分片大小也很有用。由于索引创建后无法轻易更改分片数量,因此如果不满足翻转条件,分片将继续积累数据。对于只需不经常访问的旧索引,缩小和强制合并索引是减少其内存和磁盘占用的两种不同方法。前者减少了索引中分片的数量,后者则减少了 Lucene 片段的数量,并释放了已删除文档的空间。
作为 Elasticsearch 基础的主分片和副本分片
Elasticsearch 作为适用于海量数据的分布式存储、搜索和分析平台,已经建立了良好的声誉。然而,在如此大规模的运作中,挑战将不可避免地出现。这就是为什么了解主分片和副本分片如何工作对 Elasticsearch 如此重要和基础的原因,因为这有助于优化平台的可靠性和性能。
了解它们如何工作以及如何优化它们,对于实现更强大、更高性能的 Elasticsearch 集群至关重要。如果您经常遇到查询响应迟缓或中断的情况,这些知识可能是克服这些障碍的关键。
请关注 Elasticsearch 的官方文档,了解有关群集、节点和分片、如何确定分片大小、分片分配和恢复的更多信息。
本主题还可作为入门课程在Elastic Community YouTube 频道上观看。
最后但并非最不重要的一点:如果你不想担心节点、分片或副本,可以试试Elastic Cloud Serverless。该 Elastic 云产品由 Elastic 全面管理,并可根据您的工作负载自动扩展。免费试用可以帮助您熟悉无服务器方法的其他优势。




