Elasticsearch 集群扩展策略指南,助力增长
掌握为指数级增长扩展 Elasticsearch 集群的艺术。本指南详细介绍了横向(扩展)和纵向(升级)扩展的关键策略。了解如何优化节点角色,计算理想的分片分配以获得最佳性能,并实施最佳实践以有效维护高可用性并处理增加的查询和索引负载。
Elasticsearch 集群扩展策略指南:应对增长
当搜索变慢、索引队列堆积或磁盘填充速度超出预期时,Elasticsearch 集群扩展就变得紧迫。随着数据量和查询负载的增长,您需要知道是向现有节点添加资源、添加更多节点、更改分片策略,还是重新设计热索引。
本指南涵盖垂直和水平扩展、节点角色、分片大小以及在不猜测的情况下扩展集群的实用步骤。
理解 Elasticsearch 扩展基础
扩展 Elasticsearch 集群主要涉及两种策略:垂直扩展(向上扩展)和水平扩展(向外扩展)。最佳策略通常需要根据工作负载特征仔细平衡两者。
垂直扩展(向上扩展)
垂直扩展涉及增加现有节点的资源。这是最简单的方法,但会很快达到物理限制。
何时使用垂直扩展:
- 当延迟是主要关注点,并且您需要从现有数据集获得更快的查询响应时。
- 对于短期压力,添加和重新平衡新节点所需的时间比您需要的缓解时间更长。
主要资源升级:
- RAM(内存): Elasticsearch 需要 JVM 堆和大量的操作系统文件系统缓存。一个常见的起点是将堆设置为系统 RAM 的 50% 左右,同时保持在压缩普通对象指针阈值以下,根据 JVM 的不同,通常在 26-32GB 左右。
- CPU: 对于复杂的聚合、大量索引和高查询并发性是必需的。
- 存储(磁盘 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:向外扩展(水平扩展)
如果添加节点,请遵循以下步骤:
- 使用相同或更好的硬件配置新的数据节点。
- 使用正确的角色配置它们。对于容量增长,这通常意味着数据角色,例如
data_hot、data_content或data,具体取决于您的部署。 - 使用
discovery.seed_hosts将它们指向现有集群。 - 一旦新节点加入,Elasticsearch 将自动开始重新平衡现有分片以利用新容量。
步骤 4:面向未来的索引(重新索引)
如果现有索引的分片数量不理想,它们无法充分利用新节点。您必须重建它们:
- 创建一个新的索引模板或使用创建索引 API,并设置所需的分片和副本数量。
- 使用重新索引 API 将数据从旧的、大小不合适的索引迁移到新的索引。
- 迁移完成后,使用别名切换流量。
重新索引命令示例:
POST _reindex
{
"source": {
"index": "old_index_bad_shards"
},
"dest": {
"index": "new_index_optimized_shards"
}
}
最佳实践清单
当您首先进行监控、一次只更改一个变量、并保持分片布局与您的增长模式一致时,扩展 Elasticsearch 效果最佳。
关键要点:
- 优先考虑水平扩展: 它为持续增长和弹性提供了最佳路径。
- 专用主节点: 通过分离主角色来保持集群管理稳定。
- 分片大小是永久的: 在索引创建时,目标主分片大小为 10GB-50GB。
- 监控 JVM 堆: 将堆保持在 JVM 的压缩指针阈值以下,并为操作系统缓存留出足够的 RAM。
- 使用重新索引: 当向外扩展需要更改主分片数量时,重建关键索引。