Elasticsearch 集群扩展策略增长指南
Elasticsearch 已成为无数需要实时搜索、日志和分析能力的应用程序的基石。随着数据量的增长和查询负载的增加,Elasticsearch 集群不可避免地会面临扩展挑战。有效地扩展集群对于维持性能、确保高可用性以及在不停机的情况下应对未来增长至关重要。本指南将探讨水平扩展和垂直扩展的成熟策略,以及硬件和智能分片分配的关键考量。
了解如何在性能下降之前进行正确扩展,是成功、增长的系统与无响应瓶颈之间的区别。我们将介绍扩展容量的核心方法以及保持集群健壮所需的架构最佳实践。
理解 Elasticsearch 扩展基础
扩展 Elasticsearch 集群主要涉及两种策略:垂直扩展(向上扩展)和水平扩展(向外扩展)。最佳策略通常需要两者之间进行仔细平衡,具体取决于您的工作负载特性。
垂直扩展(向上扩展)
垂直扩展涉及增加现有节点的资源。这是最简单的方法,但很快会达到物理限制。
何时使用垂直扩展:
- 当延迟是主要考虑因素,并且您需要从现有数据集中获得更快的查询响应时。
- 用于处理短期、高峰负载,此时添加新节点可能会引入不必要的协调开销。
主要资源升级:
- RAM(内存): 这通常是最关键的升级。Elasticsearch 严重依赖 JVM 堆大小(通常应设置为系统总 RAM 的 50%,最高约 30-32GB)。更多的内存允许更大的缓存(字段数据、请求缓存)和更好的垃圾回收性能。
- CPU: 对于复杂聚合、繁重索引和高查询并发性是必需的。
- 存储(磁盘 I/O): 更快的 SSD 或 NVMe 驱动器显著提高索引吞吐量和搜索速度,特别是对于繁重的 I/O 工作负载。
⚠️ 垂直扩展警告: 由于 JVM 限制,为了获得最佳的压缩普通对象指针(oops),您不能为堆分配超过大约 32GB 的内存。过度垂直扩展通常只是一个临时解决方案。
水平扩展(向外扩展)
水平扩展涉及向集群添加更多节点。这会将数据和查询负载分布到更多机器上,提供近乎线性的可扩展性和高可用性。
何时使用水平扩展:
- 当数据量超出现有节点的容量时。
- 当您需要提高整体索引吞吐量或查询并发性时。
- 作为长期、可持续增长的主要策略。
水平扩展通过添加新的数据节点来实现。也可以添加协调节点,但通常数据节点的扩展才是容量增长的驱动力。
可扩展性的架构最佳实践
扩展不仅仅是增加硬件;它需要一个结构良好的索引和节点拓扑。
节点角色和专业化
现代 Elasticsearch 部署通过为节点分配专用角色而大大受益,尤其是在大型集群中。这可以防止繁重任务(如索引)与关键任务(如协调搜索)之间的资源争用。
| 节点角色 | 主要职责 | 最佳实践考量 |
|---|---|---|
| 主节点 (Master Nodes) | 集群状态管理,稳定性。 | 专用 3 或 5 个节点。不应处理数据或摄取请求。 |
| 数据节点 (Data Nodes) | 存储数据,索引,搜索。 | 根据数据量和负载积极扩展这些节点。 |
| 摄取节点 (Ingest Nodes) | 在索引前预处理文档(使用摄取管道)。 | 将 CPU 密集型预处理从数据节点卸载。 |
| 协调节点 (Coordinating Nodes) | 处理大型搜索请求,从数据节点收集结果。 | 当搜索请求变得复杂或经常因协调开销而使数据节点过载时,添加这些节点。 |
分片分配策略
分片是 Elasticsearch 中分布和并行化的基本单位。不当的分片分配是扩展痛点的首要原因。
1. 主分片数量优化
选择正确数量的主分片(index.number_of_shards)至关重要,并且在索引创建后不易更改(除非使用索引别名或重新索引)。
- 分片过少: 限制搜索期间的并行性,并阻碍有效的水平扩展。
- 分片过多: 导致主节点开销,不必要地增加内存占用,并导致“小分片问题”效率低下。
最佳实践: 目标是主分片大小在 10GB 到 50GB 之间。一个好的起点通常是每个数据节点每个 CPU 核心一个主分片,但这会因工作负载而异。
2. 用于高可用性和读取吞吐量的副本分片
副本分片(index.number_of_replicas)提供冗余并增加读取容量。
- 将
number_of_replicas: 1设置为 1 意味着每个主分片有一个副本,从而确保高可用性(HA)。 - 增加副本(例如,设置为 2)通过允许搜索同时命中多个分片副本,显著提高读取吞吐量。
高可用性设置示例:
如果您有 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 (Cluster Allocation Explainer API) 来诊断分片为何可能没有移动到新节点或为何某个节点过载。
实际扩展步骤:应对增长
当您的集群性能下降(JVM 堆压力高、查询缓慢、索引缓慢)时,请按顺序执行以下步骤:
步骤 1:监控和诊断
在进行更改之前,诊断瓶颈所在。常见指标包括:
- 高 CPU/低空闲内存: 表示计算或内存不足(可能需要垂直扩展)。
- 过长的磁盘队列: 表示 I/O 瓶颈(需要更快的磁盘或添加节点)。
- 搜索延迟峰值: 通常是由于缓存不足或分片/副本过少(需要更多内存或水平扩展)。
步骤 2:解决即时资源需求(垂直调整)
如果内存压力高,请在安全限制内(最大 32GB)增加 JVM 堆大小,并确保有足够的 RAM 可用于操作系统文件系统缓存。
步骤 3:向外扩展(水平扩展)
如果要添加节点,请遵循以下步骤:
- 调配具有相同或更优硬件的新数据节点。
- 为它们配置正确的主节点资格 (master-eligible) 或数据 (data) 角色。
- 使用
discovery.seed_hosts将它们指向现有集群。 - 一旦新节点加入,Elasticsearch 将自动开始重新平衡现有分片以利用新容量。
步骤 4:面向未来优化索引(重新索引)
如果现有索引的分片数量不理想,它们将无法充分利用新节点。您必须重建它们:
- 创建新的索引模板或使用创建索引 API (Create Index API) 设置所需的分片和副本数量。
- 使用 重新索引 API (Reindex API) 将数据从旧的、大小不佳的索引迁移到新索引。
- 迁移完成后,使用别名切换流量。
重新索引命令示例:
POST _reindex
{
"source": {
"index": "old_index_bad_shards"
},
"dest": {
"index": "new_index_optimized_shards"
}
}
总结和最佳实践清单
有效扩展 Elasticsearch 需要基于对分布和资源管理的理解进行主动规划。避免无限期地进行垂直扩展;应专注于水平分散负载。
要点:
- 优先考虑水平扩展: 它为持续增长和弹性提供了最佳途径。
- 专用主节点: 通过分离主节点角色来保持集群管理的稳定性。
- 分片大小是永久的: 在创建索引时,目标主分片大小为 10GB-50GB。
- 监控 JVM 堆: 每个节点的堆大小不要超过约 30GB。
- 使用重新索引: 当向外扩展需要更改主分片数量时,重建关键索引。