Elasticsearch 集群扩展策略指南,助力增长

掌握为指数级增长扩展 Elasticsearch 集群的艺术。本指南详细介绍了横向(扩展)和纵向(升级)扩展的关键策略。了解如何优化节点角色,计算理想的分片分配以获得最佳性能,并实施最佳实践以有效维护高可用性并处理增加的查询和索引负载。

Elasticsearch 集群扩展策略指南:应对增长

当搜索变慢、索引队列堆积或磁盘填充速度超出预期时,Elasticsearch 集群扩展就变得紧迫。随着数据量和查询负载的增长,您需要知道是向现有节点添加资源、添加更多节点、更改分片策略,还是重新设计热索引。

本指南涵盖垂直和水平扩展、节点角色、分片大小以及在不猜测的情况下扩展集群的实用步骤。

理解 Elasticsearch 扩展基础

扩展 Elasticsearch 集群主要涉及两种策略:垂直扩展(向上扩展)和水平扩展(向外扩展)。最佳策略通常需要根据工作负载特征仔细平衡两者。

垂直扩展(向上扩展)

垂直扩展涉及增加现有节点的资源。这是最简单的方法,但会很快达到物理限制。

何时使用垂直扩展:

  • 当延迟是主要关注点,并且您需要从现有数据集获得更快的查询响应时。
  • 对于短期压力,添加和重新平衡新节点所需的时间比您需要的缓解时间更长。

主要资源升级:

  1. RAM(内存): Elasticsearch 需要 JVM 堆和大量的操作系统文件系统缓存。一个常见的起点是将堆设置为系统 RAM 的 50% 左右,同时保持在压缩普通对象指针阈值以下,根据 JVM 的不同,通常在 26-32GB 左右。
  2. CPU: 对于复杂的聚合、大量索引和高查询并发性是必需的。
  3. 存储(磁盘 I/O): 更快的 SSD 或 NVMe 驱动器可显著提高索引吞吐量和搜索速度,尤其是对于高 I/O 工作负载。

关于垂直扩展的警告: 非常大的 JVM 堆可能会失去压缩普通对象指针的优势,并可能遭受更长的垃圾收集暂停。额外的 RAM 对于文件系统缓存仍然有用,但增加堆大小并不是一个长期的扩展计划。

水平扩展(向外扩展)

水平扩展涉及向集群添加更多节点。这会将数据和查询负载分布到更多机器上,提供近乎线性的可扩展性和高可用性。

何时使用水平扩展:

  • 当数据量超过现有节点的容量时。
  • 当您需要提高整体索引吞吐量或查询并发性时。
  • 作为长期、可持续增长的主要策略。

水平扩展是通过添加新的数据节点来实现的。也可以添加协调节点,但通常,数据节点扩展驱动容量增长。

可扩展性的架构最佳实践

扩展不仅仅是添加硬件;它需要一个结构良好的索引和节点拓扑。

节点角色和专业化

现代 Elasticsearch 部署受益于为节点分配专用角色,尤其是在较大的集群中。这可以防止繁重任务(如索引)和关键任务(如协调搜索)之间的资源争用。

节点角色 主要职责 最佳实践考虑因素
主节点 集群状态管理,稳定性。 专用的一组 3 或 5 个节点。不应处理数据或摄取请求。
数据节点 存储数据,索引,搜索。 根据数据量和负载积极扩展这些节点。
摄取节点 在索引之前预处理文档(使用摄取管道)。 将 CPU 密集型预处理从数据节点卸载。
协调节点 处理大型搜索请求,从数据节点收集结果。 当搜索请求变得复杂或频繁因协调开销而使数据节点过载时,添加这些节点。

分片分配策略

分片是 Elasticsearch 中分布和并行性的基本单元。糟糕的分片分配是扩展痛点的首要原因。

1. 主分片数量优化

选择正确的主分片数量(index.number_of_shards)至关重要,并且在索引创建后无法轻易更改(除非使用索引别名或重新索引)。

  • 分片太少: 限制搜索期间的并行性,并阻止有效的水平扩展。
  • 分片太多: 增加集群状态开销,增加内存使用,并产生“小分片”问题,其中协调成本主导了有用的工作。

最佳实践: 对于许多时间序列和日志工作负载,目标分片大小在几十 GB 范围内,通常大约 10GB 到 50GB。将此视为起始范围,然后根据您自己的索引速率、保留窗口和查询模式进行测试。

2. 用于高可用性和读取吞吐量的副本分片

副本分片(index.number_of_replicas)提供冗余并增加读取容量。

  • 设置 number_of_replicas: 1 意味着每个主分片都有一个副本,确保高可用性(HA)。
  • 增加副本可以提高读取容量,因为搜索可以由主分片或副本分片提供服务,但这也会增加存储使用和索引工作。

高可用性设置示例: 如果您有 10 个主分片并设置 number_of_replicas: 1,则集群需要至少 20 个总副本分片(10 个主分片 + 10 个副本分片)分布在节点上。

PUT /my_growing_index
{
  "settings": {
    "index.number_of_shards": 20,
    "index.number_of_replicas": 1 
  }
}

通过感知防止热点

添加新节点时,确保分片分布在故障域中。Elasticsearch 会自动重新平衡,但区域或机架感知仅在您配置节点属性和分配感知设置时才有效。

使用集群分配解释器 API 来诊断为什么分片可能不会移动到新节点,或者为什么节点过载。

实用扩展步骤:处理增长

当您的集群性能下降(高 JVM 堆压力、查询缓慢、索引缓慢)时,请按顺序执行以下步骤:

步骤 1:监控和诊断

在进行更改之前,诊断瓶颈。常见指标:

  • 高 CPU/低空闲内存: 表示计算或内存不足(可能需要垂直扩展)。
  • 磁盘队列长度过长: 表示 I/O 瓶颈(需要更快的磁盘或添加节点)。
  • 搜索延迟峰值: 通常是由于缓存不足或分片/副本太少(需要更多内存或水平扩展)。

步骤 2:解决即时资源需求(垂直调整)

如果内存压力很高,请在安全限制内(最大 32GB)增加 JVM 堆大小,并确保有足够的 RAM 可用于操作系统文件系统缓存。

步骤 3:向外扩展(水平扩展)

如果添加节点,请遵循以下步骤:

  1. 使用相同或更好的硬件配置新的数据节点。
  2. 使用正确的角色配置它们。对于容量增长,这通常意味着数据角色,例如 data_hotdata_contentdata,具体取决于您的部署。
  3. 使用 discovery.seed_hosts 将它们指向现有集群。
  4. 一旦新节点加入,Elasticsearch 将自动开始重新平衡现有分片以利用新容量。

步骤 4:面向未来的索引(重新索引)

如果现有索引的分片数量不理想,它们无法充分利用新节点。您必须重建它们:

  1. 创建一个新的索引模板或使用创建索引 API,并设置所需的分片和副本数量。
  2. 使用重新索引 API 将数据从旧的、大小不合适的索引迁移到新的索引。
  3. 迁移完成后,使用别名切换流量。

重新索引命令示例:

POST _reindex
{
  "source": {
    "index": "old_index_bad_shards"
  },
  "dest": {
    "index": "new_index_optimized_shards"
  }
}

最佳实践清单

当您首先进行监控、一次只更改一个变量、并保持分片布局与您的增长模式一致时,扩展 Elasticsearch 效果最佳。

关键要点:

  • 优先考虑水平扩展: 它为持续增长和弹性提供了最佳路径。
  • 专用主节点: 通过分离主角色来保持集群管理稳定。
  • 分片大小是永久的: 在索引创建时,目标主分片大小为 10GB-50GB。
  • 监控 JVM 堆: 将堆保持在 JVM 的压缩指针阈值以下,并为操作系统缓存留出足够的 RAM。
  • 使用重新索引: 当向外扩展需要更改主分片数量时,重建关键索引。