Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[转]Elasticsearch:提升 Elasticsearch 性能

[转]Elasticsearch:提升 Elasticsearch 性能

作者头像
保持热爱奔赴山海
发布于 2024-05-08 12:44:01
发布于 2024-05-08 12:44:01
3000
举报

Elasticsearch 是为你的用户提供无缝搜索体验的不可或缺的工具。 在最近的 QCon 会议上,我遇到了很多的开发者。在他们的系统中,Elastic Stack 是不可缺少的工具,无论在搜索,可观测性或安全领域,Elastic Stack 都发挥着巨大的作用。我们在手机中常见的应用或者网站上的搜索基本上有用 Elastic Stack 的影子。Elastic Stack 凭借其快速、准确和相关的搜索结果,它可以彻底改变用户与你的应用程序交互的方式。 但是,为确保你的 Elasticsearch 部署发挥最佳性能,监控关键指标并优化各种组件(如索引、缓存、查询和搜索以及存储)至关重要。 在这篇内容全面的博客中,我们将深入探讨调整 Elasticsearch 以最大限度发挥其潜力的最佳实践和技巧。 从优化集群健康、搜索性能和索引,到掌握缓存策略和存储选项,本博客涵盖了很多方面的内容。 无论你是经验丰富的 Elasticsearch 专家还是新手,遵循一些最佳实践以确保你的部署具有高性能、可靠和可扩展性都非常重要。

常用建议

  • 使用正确的硬件:Elasticsearch 是一个内存密集型应用程序,因此使用具有足够 RAM 来处理数据的硬件非常重要。 此外,最好使用固态硬盘 (SSD) 进行存储,因为它们可以显着提高索引和搜索性能。
  • 规划你的索引策略:Elasticsearch 旨在处理大量数据,但重要的是要考虑这些数据是如何被索引的。 这包括你需要多少分片和副本、数据索引的频率以及如何处理更新和删除。请详细阅读 “Elasticsearch:我的 Elasticsearch 集群中应该有多少个分片?” 及 “Elasticsearch:如何部署 Elasticsearch 来满足自己的要求”。
  • 优化你的查询:Elasticsearch 是一个强大的搜索引擎,但重要的是要确保你的查询针对性能进行了优化。 这包括尽可能使用过滤器而不是查询,以及使用分页来限制返回的结果数量。
  • 让你的 Elasticsearch 版本保持最新:Elasticsearch 是一个活跃的项目,会定期发布新版本,其中包含错误修复和新功能。 务必使你的版本保持最新,以利用这些改进并避免任何已知问题。
  • 监控集群:Elasticsearch 提供了多种监控工具,例如 Elasticsearch Head 插件,可用于监控集群的健康状况和性能。 密切关注磁盘使用情况、CPU 和内存使用情况以及搜索请求的数量等内容非常重要。你可以参考 “Elastic:开发者上手指南” 中的 “监视及管理” 部分。

索引数据

  • 使用批量请求:Elasticsearch 的 bulk API 允许在单个 API 调用中执行多个索引/删除操作。 这显着提高了索引速度。 如果其中一个请求失败,则顶级错误标志设置为 true,错误详细信息将在相关请求下报告。
  • 使用多线程客户端索引数据:发送批量请求的单个线程将无法充分利用 Elasticsearch 集群的索引能力。 从多个线程或进程发送数据将有助于使用集群的所有资源,减少每次 fsync 的成本并提高性能。如果你是使用编程语言来实现数据写入,尽量采用 Elastic 官方所提供的丰富的客户端库来进行写入。它在设计中采用了很多的优化及对连接的管理。
  • 增加刷新间隔(index.refresh_interval):Elasticsearch 中默认的刷新间隔设置为 1 秒,但如果你的搜索流量很小,你可以增加这个值来优化索引速度。在实际的操作中,如果你在短时间里需要大量地写入数据,那么增加这个数值可以提高写入的速度。等数据写入完毕后,你再可以调整回来。
  • 减少 replica 数量:针对有些急需大量数据写入的情况,我们甚至可以把 replica 的数量设置为 0 以提高摄入数据的速度。等数据摄入完毕后,再对 replica 的值进行调整。如果你需要对摄入的过程有一个更为详细的了解,请参阅我的另外一篇文章 “Elasticsearch:彻底理解 Elasticsearch 数据操作”。
  • Use Auto-generated IDs:当使用显式 id 索引文档时,Elasticsearch 需要检查是否已经存在具有相同 id 的文档,这是一个代价高昂的操作。 使用自动生成的 ID 会跳过此检查,从而加快索引速度。
  • index.translog.sync_interval:此设置控制 translog 提交到磁盘的频率,与写操作无关。 默认值为 5s,但不允许小于 100ms 的值。
  • index.translog.flush_threshold_size:translog 存储尚未在 Lucene 中持久化,但如果分片停止则需要重放的操作。 此设置控制这些操作的最大总大小,防止恢复时间过长。
  • 避免大型文档:大型文档对网络、内存使用和磁盘造成压力,使索引速度变慢并影响邻近搜索和突出显示。
  • 显式设置映射:Elasticsearch 可以动态创建映射,但并不适用于所有场景。 显式设置映射将有助于确保最佳性能。
  • 避免嵌套类型:与父文档中的字段相比,对嵌套字段的查询速度较慢,并且检索匹配的嵌套字段也会进一步降低速度。关于 nested 数据类型,请阅读文章 “Elasticsearch:如何修改 nested 字段的值”。此外,目前 Kibana 针对 nested 数据没有支持。无法进行可视化。
  • 禁用“_all”字段:_all 字段将所有其他字段的值连接成一个字符串,需要更多的 CPU 和磁盘空间。 大多数用例不需要 _all 字段,你可以使用 copy_to 参数连接多个字段。 _all 字段在 Elasticsearch 6.0 及更高版本中默认禁用。

更多阅读:

Elasticsearch:增加 Elasticsearch 写入吞吐量和速度的完整指南

如何提高 Elasticsearch 数据摄入速度

查询及搜索

  • 如果可能,使用过滤器上下文而不是查询上下文:查询子句用于回答 “该文档与该子句的匹配程度如何?” 过滤子句用于回答 “该文档是否与该子句匹配?” Elasticsearch 只需要回答 “是” 或 “否”。 它不需要计算过滤子句的相关性分数,并且可以缓存过滤结果。请详细阅读 “Elasticsearch:深入理解 Elasticsearch 查询:过滤器查询 vs 全文搜索” 及 “Elasticsearch:cache 在 Elasticsearch 中的应用”。
  • 增加刷新间隔:增加刷新间隔有助于减少段数并降低搜索的 IO 成本。 并且,一旦发生刷新和数据更改,缓存将无效。 增加刷新间隔可以使 Elasticsearch 更有效地利用缓存。
  • 增加副本数:你拥有的副本越多,搜索中涉及的节点就越多。你可以阅读文章 “Elasticsearch:彻底理解 Elasticsearch 数据操作” 以了解更多关于搜索操作的流程。
  • 仅检索必要的字段:如果你的文档很大,而你只需要几个字段,请使用 stored_fields 来检索你需要的字段而不是所有字段。你可以阅读文章 “Elasticsearch:从搜索中获取选定的字段 fields” 以了解更多。
  • 避免通配符查询:通配符查询可能很慢并且占用大量资源。 最好尽可能避免使用它们。
  • 使用节点查询缓存:过滤器上下文中使用的查询结果缓存在节点查询缓存中,以便快速查找。
  • 使用分片查询缓存:你可以通过将 “index.requests.cache.enable” 设置为 true 来启用分片查询缓存。
  • 使用索引模板:索引模板可以帮助你自动将设置和映射应用于新索引。
  • 为每个索引配置至少一个副本:副本分片提供数据的冗余副本,并增加服务于读取请求(如搜索或检索文档)的能力。

更多阅读:

Elasticsearch:如何提高查询性能

性能

  • Active shards 应该与 CPU 成正比:为了提高 write-heavy 用例的性能,刷新间隔应该增加到一个更大的值,例如 30s,并且应该增加 primary shards 以将写请求分配到不同的节点. 对于读取密集型用例,增加副本分片以平衡副本之间的查询/搜索请求会有所帮助。
  • 如果你的查询具有日期范围过滤器,则按日期组织数据:对于日志记录或监控场景,按每日、每周或每月组织索引并获取指定日期范围的索引列表有助于提高性能。 Elasticsearch 只需要查询一个较小的数据集,而不是整个数据集,当数据过期时,很容易收缩/删除旧索引。
  • 如果你的查询具有筛选字段并且其值是可枚举的,则将你的数据拆分为多个索引:根据区域(例如,美国、欧元和其他)将索引拆分为多个较小的索引可以提高带有筛选子句的查询的性能 “地区”。
  • 确保使用 “索引” 和 “查询和搜索”部分中的最佳实践。请参考上面的部分。

扩展

  • 如果你的查询具有日期范围过滤器,则按日期组织数据:对于大多数日志记录或监控场景,按每日、每周或每月组织索引并获取指定日期范围的索引列表有助于提高性能。 Elasticsearch 只需要查询一个较小的数据集,而不是整个数据集,当数据过期时,很容易收缩/删除旧索引。
  • 索引状态管理:定义自定义管理策略以自动执行日常任务并将其应用于索引和索引模式。 例如,可以定义一个策略,在 30 天后将索引移至只读状态,然后在 90 天后将其删除。
  • 使用 Curator 旋转数据:Curator 可以使用其众多过滤器帮助识别满足特定条件的索引和快照,例如 60 多天前创建的索引或未能完成的快照。

Elastic Stack 里含有索引生命周期管理。它可以帮我们自动管理索引的生命周期,一旦设定策略。请详细阅读文章 “Elastic:开发者上手指南” 中的 “生命周期管理(ILM)” 章节。

监控

为了监控 Elasticsearch 集群的性能并检测任何潜在问题,你应该定期跟踪以下指标:

  • Cluster Health Nodes and Shards:监控集群中的节点数量,以及分片数量及其分布。
  • 搜索性能:请求延迟和速率 - 跟踪搜索请求的延迟和每秒搜索请求的数量。
  • 索引性能:刷新时间和合并时间 - 监控刷新索引所需的时间和合并段所需的时间。
  • Node Utilization: Thread Pools - 监控每个节点上线程池的使用情况,例如索引池

请详细阅读 “Elastic:开发者上手指南” 中的 “监视及管理” 部分

通过遵循这些最佳实践,你可以确保你的 Elasticsearch 部署具有高性能、可靠性和可扩展性。 请记住,Elasticsearch 是一个强大的搜索和分析引擎,可以快速且近乎实时地处理大量数据,但重要的是要规划、优化和监控你的部署以充分利用它。

原文地址

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Elasticsearch索引、搜索流程及集群选举细节整理
最近在做搜索推荐相关的优化,在对elasticsearch进行优化时查阅了比较多的资料,现在对其中的一部分进行整理和翻译,做一个记录。主要分为三个部分:
山行AI
2021/08/18
1.8K0
如何做好 Elasticsearch 性能指标监控
声明:本文是较早的一篇关于Elasticsearch性能指标监控的博文,内容总结全面,作者 Emily Chang,原文地址:https://www.datadoghq.com/blog/monitor-elasticsearch-performance-metrics,由杨文波同学翻译。
大数据技术架构
2019/09/29
1.6K0
如何做好 Elasticsearch 性能指标监控
开源搜索和分析引擎Elasticsearche在Bay的性能优化实践,单集群日搜索请求超4亿
摘要:Elasticsearch是基于Apache Lucene的开源搜索和分析引擎,允许用户以近乎实时的方式存储,搜索和分析数据。虽然Elasticsearch专为快速查询而设计,但其性能在很大程度上取决于用于应用程序的场景,索引的数据量以及应用程序和用户查询数据的速率。这篇文章概述了挑战和调优过程,以及Pronto团队以战略方式构建应对挑战的工具。它还以各种图形配置展示了进行基准测试的一些结果。以下是正文。 Elasticsearch是基于Apache Lucene的开源搜索和分析引擎,允许用户以近乎实
CSDN技术头条
2018/02/06
2.1K0
开源搜索和分析引擎Elasticsearche在Bay的性能优化实践,单集群日搜索请求超4亿
Elasticsearch 聚合性能优化六大猛招
默认情况下,Elasticsearch 已针对大多数用例进行了优化,确保在写入性能和查询性能之间取得平衡。我们将介绍一些聚合性能优化的可配置参数,其中部分改进是以牺牲写入性能为代价的。目标是将聚合优化招数汇总到一个易于消化的短文中,为大家的 Elasticsearch 集群聚合性能优化提供一些指导。
铭毅天下
2021/02/03
4.2K0
Elasticsearch 聚合性能优化六大猛招
触类旁通Elasticsearch:优化
ES提供的批量(bulk)API,可以用来一次索引多篇文档,从而大幅加快索引速度。如图1所示,可以使用http完成这个操作,并且将获得包含全部索引请求结果的答复。
用户1148526
2019/05/25
1.1K0
ElasticSearch学习笔记之原理介绍
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
我的小碗汤
2018/09/30
1.1K0
ElasticSearch学习笔记之原理介绍
深度解析ElasticSearch:构建高效搜索与分析的基石
在数据爆炸的时代,如何快速、准确地从海量数据中检索出有价值的信息成为了企业面临的重要挑战。ElasticSearch,作为一款基于Lucene的开源分布式搜索和分析引擎,凭借其强大的实时搜索、分析和扩展能力,成为了众多企业的首选。本文将深入解析ElasticSearch的核心原理、架构设计及优化实践,帮助读者全面理解这一强大的工具。
小马哥学JAVA
2024/09/19
4450
干货满满丨万字超全 ElasticSearch 监控指南
导语:本文详细介绍了 ElasticSearch 如搜索性能指标、索引性能指标、内存使用和垃圾回收指标等六类监控关键指标、集群和索引两类大盘配置示例,以及 ES 在查询性能差、索引性能差的两种典型问题场景下详细的原因、排查方式和解决方案,同时也介绍了如何通过 Prometheus 监控搭建可靠的监控系统,详尽全面,推荐给大家,也欢迎各位一起交流。
腾讯云可观测平台
2024/03/15
1.9K0
干货满满丨万字超全 ElasticSearch 监控指南
【Elasticsearch专栏 09】深入探索:Elasticsearch如何处理并发写入和读取请求
Elasticsearch处理并发写入和读取请求的能力是其作为高性能搜索和分析引擎的核心特性之一。为了实现这一点,Elasticsearch采用了多种策略和技术,包括分片、副本、事务日志、队列以及多线程处理等。下面将详细解释这些机制如何协同工作以处理高并发请求。
夏之以寒
2024/03/04
4230
干货 |《深入理解Elasticsearch》读书笔记
题记 由于之前已经梳理过Elasticsearch基础概念且在项目中实战过Elasticsearch的增删改查、聚类、排序等相关操作,对ES算是有了一定的认知。 但是,仍然对于一些底层的原理认知模糊
铭毅天下
2018/03/20
2.2K0
干货 |《深入理解Elasticsearch》读书笔记
Elasticsearch 缓存深入详解
Elasticsearch 查询的响应需要占用 CPU、内存资源,在复杂业务场景,会出现慢查询,需要花费大量的时间。
铭毅天下
2021/01/18
4.4K0
ElasticSearch权威指南:基础入门(下)
官方网站:https://www.elastic.co/guide/index.html
HLee
2021/03/19
4K0
ElasticSearch权威指南:基础入门(下)
Elasticsearch数据写入、检索流程及底层原理全方位解析
在当今数据驱动的时代,能够快速、准确地存储和检索信息是企业成功的关键。Elasticsearch,作为一个分布式的、RESTful风格的搜索和分析引擎,以其强大的索引、搜索和聚合功能,成为众多企业和开发者的首选。其背后的读写流程,融合了高效的数据结构与先进的分布式系统原理,确保数据既能被可靠地存储,又能被迅速检索。
公众号:码到三十五
2024/03/19
4.7K0
Elasticsearch数据写入、检索流程及底层原理全方位解析
干货 | Elasticsearch开发人员最佳实战指南
几个月以来,我一直在记录自己开发Elasticsearch应用程序的最佳实践。本文梳理的内容试图传达Java的某些思想,我相信其同样适用于其他编程语言。我尝试尽量避免重复教程和Elasticsearch官方文档中已经介绍的内容。本文梳理的内容都是从线上实践问题和个人总结的经验汇总得来的。
铭毅天下
2020/04/08
1.7K0
干货 | Elasticsearch开发人员最佳实战指南
Elasticsearch性能优化实战指南
在当今世界,各行各业每天都有海量数据产生,为了从这些海量数据中获取想要的分析结果,需要对数据进行提取、转换,存储,维护,管理和分析。 这已然远远超出了普通处理工具、数据库等的实现能力,只有基于的分布式架构和并行处理机制的大数据工具所才能实现这些功能。 Elasticsearch是响应如前所述大多数用例的最热门的开源数据存储引擎之一。
铭毅天下
2019/07/31
1.8K0
如何监控Elasticsearch
Elasticsearch是一个开源的分布式文档存储和搜索引擎,可以近乎实时地存储和检索数据结构,它很大程度上依赖于Apache Lucence--一个用Java编写的全文搜索引擎。
大蟒传奇
2018/07/31
1.6K0
如何监控Elasticsearch
面试题之 Elasticsearch 性能优化详解
大多数 Elasticsearch 部署往往对 CPU 要求不高。因此,相对其它资源,具体配置多少个(CPU)不是那么关键。你应该选择具有多个内核的现代处理器,常见的集群使用 2 到 8 个核的机器。如果你要在更快的 CPUs 和更多的核数之间选择,选择更多的核数更好。多个内核提供的额外并发远胜过稍微快一点点的时钟频率。
wayn
2024/03/11
6070
面试题之 Elasticsearch 性能优化详解
Elasticsearch 生产环境集群部署最佳实践
在生产环境搭建或维护 Elasticsearch 集群和个人搭建集群的小打小闹有非常大的不同。
铭毅天下
2021/03/22
3K0
Elasticsearch 生产环境集群部署最佳实践
2021年春招Elasticsearch面试题
1、可以看到,trie 树每一层的节点数是 26^i 级别的。所以为了节省空间,我们还可以用动态链表,或者用数组来模拟动态。而空间的花费,不会超过单词数×单词长度。2、实现:对每个结点开一个字母集大小的数组,每个结点挂一个链表,使用左儿子右兄弟表示法记录这棵树;3、对于中文的字典树,每个节点的子节点用一个哈希表存储,这样就不用浪费太大的空间,而且查询速度上可以保留哈希的复杂度 O(1)。
zls365
2021/04/23
1.3K0
2021年春招Elasticsearch面试题
同事:膨胀了?Elasticsearch快就不需要调优了吗?
众所周知,ES 中 filter 是不参与相关性评分的,所以查询子句可以被系统进行缓存,性能要高于普通的 query 查询。bool 查询中支持 4 种子句,分别是 filter、must、must_not、should,其中 filter 和 must_not 属于过滤器,过滤器查询先于其它查询执行。另外在 function_score、constant_score 中也可以使用 filter 子句进行查询缓存。
开发者技术前线
2020/11/24
5150
推荐阅读
相关推荐
Elasticsearch索引、搜索流程及集群选举细节整理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档