随着现代应用程序的发展,对实时数据处理和检索的需求不断增加,扩展性也变得日益重要。其中一个开源的分布式搜索和分析引擎是Elasticsearch,它在处理大规模数据集和高速度查询方面非常高效。然而,有效扩展Elasticsearch的过程可能比较复杂,因为需要对其背后的架构和性能权衡有正确的理解。
虽然Elasticsearch的分布式特性使其可以横向扩展,但这也增加了数据分布和查询服务方式的复杂性。与扩展Elasticsearch相关的一个理论挑战是其固有的分布式特性。在大多数实际场景中,独立节点的读取性能总是优于分片集群中的读取。这是因为在分片集群中,数据所有权分散在多个节点上。这意味着每个查询可能需要向不同的节点发出多个请求,在协调节点上聚合结果并返回结果。这种额外的网络开销将导致与单节点架构相比,延迟明显增加,因为单节点架构中的数据访问方式相对简单。
在这方面,分片集群对于将Elasticsearch扩展到大数据集、高流量和近实时索引是至关重要的。了解如何在节点之间分散数据与保持查询延迟低之间找到微妙的平衡是实现最佳性能的关键。接下来,本文将探讨Elasticsearch可扩展性的理论方面、集群性能优化的实际策略,以及从实际部署经验中获得的教训。
在Swoo,我们的直播和游戏应用中,Elasticsearch是所有搜索相关事务的支柱,随着用户增长,它一直表现良好。当并行用户数量超过15万时,搜索页面开始偶尔出现故障,很明显Elasticsearch集群中存在一些瓶颈。这很快在直播游戏环境中变得不可接受,并促使我们进行一系列优化,最终稳定了我们的搜索和主页体验。
了解Elasticsearch的可扩展架构
Elasticsearch本身支持分布式架构,使系统具有高度可扩展性,但同时与传统的单节点解决方案相比更复杂。Elasticsearch将数据划分为索引,每个索引又划分为分片。分片是数据存储和索引的基本单元,因为该系统在集群的多个节点上分发和并行化搜索操作。
一个典型的集群将包含多个数据节点,托管一部分数据并执行搜索查询。默认情况下,Elasticsearch可以自动在节点之间分发数据,因此每个节点仅执行部分查询负载。通过这种方式,Elasticsearch实现水平扩展:通过简单地向其添加节点,处理更多数据并提供更多请求。
在设计Elasticsearch集群时,考虑到可扩展性与查询性能之间的权衡是其中最重要的事项之一,特别是对于那些需要高写入吞吐量并且读取延迟较低的应用程序。这样的挑战确实需要对集群进行仔细的配置,以及结合各种优化技术。
因此,实际上,我们的Elasticsearch集群针对Swoo的情况有一些数据节点和三个专用的主节点。每个节点都运行在一个8核CPU和16GB RAM上,主要用于实时索引和即时搜索正在进行的游戏事件。由于我们在高并发环境下工作,我们需要分配非常大的网络带宽,以确保节点之间的最小延迟。
制定您的扩展策略
换句话说,有效地扩展Elasticsearch需要分析当前的性能指标,找出瓶颈,并明确关于可扩展性的目标。例如,监控查询延迟、吞吐量和集群健康状况将是很有帮助的,以便了解集群的限制。通过识别热分片、CPU负载增加和内存问题,您将能够创建优化路线图。
另一个需要注意的重要活动是对Elasticsearch进行容量规划。估算磁盘使用量、流量模式以及数据保留需求将确保您的集群具有正确的大小。一般来说,水平扩展(向集群添加节点)通常是应对数据和流量增加的最佳方法。然而,在这种情况下,垂直扩展——提升单个节点的资源——可能会更有效。
我们的预测表明,活跃用户每月大约增长10-15%,每个用户在使用游戏过程中会产生大量事件数据。根据这些预测,我们预计集群将在同时查询量和索引文档量上实现健康的逐渐增加。因此,我们分析了通过增加更多数据节点进行水平扩展,或者通过升级当前节点进行垂直扩展,对于这种增长更加适合。
核心扩展技术
Elasticsearch优化将涉及一系列策略,每个策略针对系统的不同方面。在这些策略中,最有效的技术包括数据摄入优化、分片管理和内存使用优化。
主要关注的领域将是数据摄取。Elasticsearch 原生支持批量索引,这意味着您可以一次请求发送非常大的文档批次。这减少了开销,并通常加快了索引过程。其次,微调刷新间隔可能会在快速摄取数据时产生重大影响。您可以将默认的一秒刷新间隔覆盖为更高的值,例如十秒,因为这将减轻集群上频繁刷新的压力,您的写入速度会更快。
其他构成 Elasticsearch 可扩展性特征的关键原因包括 分片管理。虽然 Elasticsearch 能够通过分片水平扩展,但不适当的分片大小实际上会导致性能下降。分片数量过高或过低会导致索引速度和/或查询性能下降。关键在于平衡,以获得 Elasticsearch 的最佳性能。
当然,内存管理是 Elasticsearch 扩展中的另一个非常重要的因素。通过优化 JVM 堆大小、配置字段数据缓存和启用查询缓存,您可以显著减少资源消耗并提高查询性能。合理使用内存和正确的缓存设置可以防止内存溢出错误,并最小化垃圾收集开销。
Elasticsearch 压力较大的原因之一是持续摄入实时游戏数据。我们通过批量文档处理优化了摄入管道,使用 Bulk API。在特定高峰负载期间,我们可以进一步增加批量大小,并增加刷新周期,以在近实时索引和集群稳定性之间取得适当的平衡。
高级扩展解决方案
当规模变得巨大时,Elasticsearch 需要更先进的技术才能保持高性能。其中,查询优化是其中的亮点。通过编写高效的查询来最小化涉及搜索的分片数量,您还可以大大降低查询延迟。例如,您可以通过自定义路由,将查询根据键(如客户 ID 或产品类别)路由到特定的分片。这样可以避免 Elasticsearch 搜索所有分片;因此,减少了所使用的时间和资源。
ILM,即索引生命周期管理,是另一个优化 Elasticsearch 随着数据集变老的绝佳功能。您可以通过实现热-温-冷架构,将较旧的数据转移到较慢、更便宜的存储中,同时保留最相关的数据在更快、更易访问的存储中,来优化 Elasticsearch。随着集群规模的增长,它可以保持集群性能出色。
关于 Elasticsearch 可伸缩性的最终讨论主题是硬件考虑因素。随着集群规模的增长,您需要确保为增加的负载适当配置硬件。这意味着确保节点具有适当的 CPU、内存和磁盘 I/O,以便有效运行。SSD 或 NVMe 驱动器将极大提高性能,特别是对于需要高数据访问速度的索引和搜索操作。
一个深刻的教训是,仅仅为较新的索引分配默认的分片数量会导致热点问题。我们还发现,通过将重写索引重新分配到多个小分片上,适当地调整副本,可以找到一个理想的状态,使得没有任何一个分片因来自我们游戏平台的大量实时更新而过载。
理论见解与优化权衡
除了上述的实际优化之外,还有一些有趣的理论考虑可以用于扩展Elasticsearch。其中一个关键见解涉及到分布式系统中的可扩展性与查询性能的权衡。特别是,虽然分片集群是水平可扩展的,但它们确实增加了查询开销,因为必须合并来自多个节点的结果。这与单个节点的情况形成对比,在单个节点上,数据驻留在本地机器上,查询可以在不与其他节点“对话”的情况下执行。理解这种权衡对于设计一个需要平衡性能与可扩展性的Elasticsearch集群是很重要的。
另一个更为理论的Elasticsearch扩展方面是数据局部性的概念。您可以使用preference=local
查询参数仅针对托管相关分片数据的本地节点运行查询。这最小化了跨节点的通信,并减少了查询延迟。这也可能降低数据复制和负载均衡带来的挑战。Elasticsearch自适应副本选择算法试图通过在当前条件下选择最佳副本节点来优化查询的执行。然而,它并不一定能带来最有效的查询执行。
我们环境中经历的第一波故障与JVM堆压力过高有关。Elasticsearch 服务器最初以最小堆分配运行,导致在高查询负载下频繁进行垃圾回收。我们通过调整 JVM 进行解决,特别是将最小和最大堆大小调整为 8 GB,这为 Elasticsearch 提供了足够的空间来处理查询,而不会过度拖累堆。
常见陷阱与解决方案
当然,扩展 Elasticsearch 也并非没有挑战。在那些常见的错误中,人们希望避免的包括糟糕的分片大小、缺乏监控、过度依赖缓存,以及不使用适当的索引生命周期管理。如果通过积极的配置调优早期诊断,这些将节省大量时间和资源。
主要的陷阱之一是没有调整 Elasticsearch 的默认设置,无论是在内存分配还是分片管理方面。默认设置在中等流量条件下运行良好,但在高峰流量下则不堪重负。我们的解决方案是多层面的:调整堆分配、热索引复制和针对重复查询的短期缓存。总体而言,这阻止了整个集群中的重复故障,并极大地减少了超时。
实际实施指南
扩展 Elasticsearch 将涉及规划、测试、部署以及之后的维护。因此,良好的实践、配置模板以及在将新更改部署到生产环境之前对集群进行大量测试,将为您提供一个无问题扩展到长期稳定的集群。
- 微调JVM参数。我们在每个Elasticsearch服务器上将Xms和Xmx都设置为8 GB,在系统可用内存和堆需求之间取得平衡。
- 分片分布优化。大型索引被拆分为更小的分片,以防止热点出现,并为最活跃的索引扩展副本。这确保查询流量在集群中均匀分布。
- 启用短期TTL缓存。我们在主页上对频繁使用的静态查询应用了1秒的缓存窗口,并注意到这极大地减少了Elasticsearch对重复请求的负载,同时又保持了实时响应能力。
- 监控和迭代。我们使用Kibana,结合一些定制的仪表板实时观察分片健康状况、JVM性能和查询延迟。根据这些指标,我们持续进行微调。
前瞻性计划或技术栈扩展
此外,为了发展,我们希望通过将访问频率较低的数据转移到更便宜的节点来管理热-温-冷的索引生命周期,同时保留顶级硬件用于实时索引和查询。我们正在研究先进的监控解决方案和基于AI的异常检测,以确保提前发现异常查询导致的峰值或减速,避免影响用户体验。
结论
Elasticsearch的扩展需要理解架构、仔细规划,并落实最佳实践。尽管Elasticsearch通过分片实现了水平扩展,但也存在一些挑战,必须保持在适当范围内以获得最佳性能。通过适当的数据摄入、分片管理、内存使用和查询优化可以确保Elasticsearch集群的高可扩展性和性能。
在我们的情况下,将Solr迁移到Elasticsearch是必要的,除了纯粹的技术问题之外,一个重要的贡献是理解分布式系统中实际隐藏的理论困难。这种谨慎的调整和创造性的问题可能会让一个跨多个供应商的单个Elasticsearch集群显著增长——通过改善其查询性能,实现每天接收数百万次查询并大幅缩短响应时间。在将Elasticsearch部署扩展到确保长期成功时,理论和实践元素相互融合。
Source:
https://dzone.com/articles/how-to-scale-elasticsearch-to-solve-scalability-issues