ElasticSearch性能优化

一、搜索效率优化

批量提交

  当有大量数据提交的时候,建议采用批量提交。

比如在做 ELK 过程中 ,Logstash indexer 提交数据到 Elasticsearch 中 ,batch size 就可以作为一个优化功能点。但是优化 size 大小需要根据文档大小和服务器性能而定。

像 Logstash 中提交文档大小超过 20MB ,Logstash 会请一个批量请求切分为多个批量请求。

如果在提交过程中,遇到 EsRejectedExecutionException 异常的话,则说明集群的索引性能已经达到极限了。这种情况,要么提高服务器集群的资源,要么根据业务规则,减少数据收集速度,比如只收集 Warn、Error 级别以上的日志。

优化硬件

  优化硬件设备一直是最快速有效的手段。

  1. 在经济压力能承受的范围下, 尽量使用固态硬盘 SSD。SSD 相对于机器硬盘,无论随机写还是顺序写,都较大的提升。
  2. 磁盘备份采用 RAID0。因为 Elasticsearch 在自身层面通过副本,已经提供了备份的功能,所以不需要利用磁盘的备份功能,同时如果使用磁盘备份功能的话,对写入速度有较大的影响。

增加 Refresh 时间间隔

  为了提高索引性能,Elasticsearch 在写入数据时候,采用延迟写入的策略,即数据先写到内存中,当超过默认 1 秒 (index.refresh_interval)会进行一次写入操作,就是将内存中 segment 数据刷新到操作系统中,此时我们才能将数据搜索出来,所以这就是为什么 Elasticsearch 提供的是近实时搜索功能,而不是实时搜索功能。

当然像我们的内部系统对数据延迟要求不高的话,我们可以通过延长 refresh 时间间隔,可以有效的减少 segment 合并压力,提供索引速度。在做全链路跟踪的过程中,我们就将 index.refresh_interval 设置为 30s,减少 refresh 次数。

同时,在进行全量索引时,可以将 refresh 次数临时关闭,即 index.refresh_interval 设置为 -1,数据导入成功后再打开到正常模式,比如 30s。

减少副本数量

  Elasticsearch 默认副本数量为 3 个,虽然这样会提高集群的可用性,增加搜索的并发数,但是同时也会影响写入索引的效率。

在索引过程中,需要把更新的文档发到副本节点上,等副本节点生效后在进行返回结束。使用 Elasticsearch 做业务搜索的时候,建议副本数目还是设置为 3 个,但是像内部 ELK 日志系统、分布式跟踪系统中,完全可以将副本数目设置为 1 个。

二、查询效率优化

路由

当我们查询文档的时候,Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?它其实是通过下面这个公式来计算出来

shard = hash(routing) % number_of_primary_shards

routing 默认值是文档的 id,也可以采用自定义值,比如用户 id。

不带 routing 查询

在查询的时候因为不知道要查询的数据具体在哪个分片上,所以整个过程分为 2 个步骤

  • 分发:请求到达协调节点后,协调节点将查询请求分发到每个分片上。
  • 聚合: 协调节点搜集到每个分片上查询结果,在将查询的结果进行排序,之后给用户返回结果。

带 routing 查询

查询的时候,可以直接根据 routing 信息定位到某个分配查询,不需要查询所有的分配,经过协调节点排序。

向上面自定义的用户查询,如果 routing 设置为 userid 的话,就可以直接查询出数据来,效率提升很多。

Filter VS Query

Ebay 曾经分享过他们使用 Elasticsearch 的经验中说到:

Use filter context instead of query context if possible.
尽可能使用过滤器上下文(Filter)替代查询上下文(Query

  • Query:此文档与此查询子句的匹配程度如何?
  • Filter:此文档和查询子句匹配吗?

Elasticsearch 针对 Filter 查询只需要回答「是」或者「否」,不需要像 Query 查询一下计算相关性分数,同时 Filter 结果可以缓存。

大翻页

  在使用 Elasticsearch 过程中,应尽量避免大翻页的出现。

正常翻页查询都是从 From 开始 Size 条数据,这样就需要在每个分片中查询打分排名在前面的 From + Size 条数据。协同节点收集每个分配的前 From + Size 条数据。协同节点一共会受到 N * ( From + Size )条数据,然后进行排序,再将其中 From 到 From + Size 条数据返回出去。

如果 From 或者 Size 很大的话,导致参加排序的数量会同步扩大很多,最终会导致 CPU 资源消耗增大。

可以通过使用 Elasticsearch scroll 和 scroll-scan 高效滚动的方式来解决这样的问题。具体写法,可以参考 Elasticsearch: 权威指南 - scroll 查询

三、JVM配置优化

32G 现象

  Elasticsearch 默认安装后设置的堆内存是 1 GB。 对于任何一个业务部署来说, 这个设置都太小了。

比如机器有 64G 内存,那么我们是不是设置的越大越好呢?

其实不是的。

  主要 Elasticsearch 底层使用 Lucene。Lucene 被设计为可以利用操作系统底层机制来缓存内存数据结构。 Lucene 的段是分别存储到单个文件中的。因为段是不可变的,这些文件也都不会变化,这是对缓存友好的,同时操作系统也会把这些段文件缓存起来,以便更快的访问。

如果你把所有的内存都分配给 Elasticsearch 的堆内存,那将不会有剩余的内存交给 Lucene。 这将严重地影响全文检索的性能。

标准的建议是把 50% 的可用内存作为 Elasticsearch 的堆内存,保留剩下的 50%。当然它也不会被浪费,Lucene 会很乐意利用起余下的内存。

同时了解过 ES 的同学都听过过「不要超过 32G」的说法吧。

其实主要原因是 :JVM 在内存小于 32 GB 的时候会采用一个内存对象指针压缩技术。

在 Java 中,所有的对象都分配在堆上,并通过一个指针进行引用。 普通对象指针(OOP)指向这些对象,通常为 CPU 字长 的大小:32 位或 64 位,取决于你的处理器。指针引用的就是这个 OOP 值的字节位置。

对于 32 位的系统,意味着堆内存大小最大为 4 GB。对于 64 位的系统, 可以使用更大的内存,但是 64 位的指针意味着更大的浪费,因为你的指针本身大了。更糟糕的是, 更大的指针在主内存和各级缓存(例如 LLC,L1 等)之间移动数据的时候,会占用更多的带宽.

所以最终我们都会采用 31 G 设置

-Xms 31g
-Xmx 31g

假设你有个机器有 128 GB 的内存,你可以创建两个节点,每个节点内存分配不超过 32 GB。 也就是说不超过 64 GB 内存给 ES 的堆内存,剩下的超过 64 GB 的内存给 Lucene

原文地址:https://www.cnblogs.com/smile361/p/9230995.html

时间: 2024-09-29 03:37:05

ElasticSearch性能优化的相关文章

ElasticSearch性能优化方案

ElasticSearch性能优化主要分为4个方面的优化. 一.服务器部署 1.增加1-2台服务器,用于负载均衡节点elasticSearch的配置文件中有2个参数:node.master和node.data.这两个参数搭配使用时,能够帮助提供服务器性能. node.master: false node.data: true 该node服务器只作为一个数据节点,只用于存储索引数据.使该node服务器功能 单一,只用于数据存储和数据查询,降低其资源消耗率. node.master: true no

亿级 Elasticsearch 性能优化

前言 最近一年使用 Elasticsearch 完成亿级别日志搜索平台「ELK」,亿级别的分布式跟踪系统.在设计这些系统的过程中,底层都是采用 Elasticsearch 来做数据的存储,并且数据量都超过亿级别,甚至达到百亿级别. 所以趁着有空,就花点时间整理一下具体怎么做 Elasticsearch 性能优化,希望能对 Elasticsearch 感兴趣的同学有所帮助. 背景 Elasticsearch 是一个基于 Lucene 的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于

Elasticsearch性能优化实战指南

作者:铭毅天下 背景在当今世界,各行各业每天都有海量数据产生,为了从这些海量数据中获取想要的分析结果,需要对数据进行提取.转换,存储,维护,管理和分析. 这已然远远超出了普通处理工具.数据库等的实现能力,只有基于的分布式架构和并行处理机制的大数据工具所才能实现这些功能.Elasticsearch是响应如前所述大多数用例的最热门的开源数据存储引擎之一.Elasticsearch是一种分布式数据存储和搜索引擎,具有容错和高可用性特点.为了充分利用其搜索功能,需要正确配置Elasticsearch.简

Elasticsearch性能优化干货

1.集群规划优化实践 1.1 基于目标数据量规划集群 在业务初期,经常被问到的问题,要几个节点的集群,内存.CPU要多大,要不要SSD? 最主要的考虑点是:你的目标存储数据量是多大?可以针对目标数据量反推节点多少. 1.2 要留出容量Buffer 注意:Elasticsearch有三个警戒水位线,磁盘使用率达到85%.90%.95%. 不同警戒水位线会有不同的应急处理策略. 这点,磁盘容量选型中要规划在内.控制在85%之下是合理的. 当然,也可以通过配置做调整. 1.3 ES集群各节点尽量不要和

elasticsearch 性能优化

#系统默认的最大打开文件数的限制 vi /etc/security/limits.conf *     -       nproc          50240 *     -       nofile          20480 #65535 *                -       npro            20480 *                -       nofile          65535 *                -       memlock

分布式搜索引擎Elasticsearch性能优化与配置

1.内存优化 在bin/elasticsearch.in.sh中进行配置 修改配置项为尽量大的内存: ES_MIN_MEM=8g ES_MAX_MEM=8g 两者最好改成一样的,否则容易引发长时间GC(stop-the-world) elasticsearch默认使用的GC是CMS GC,如果你的内存大小超过6G,CMS是不给力的,容易出现stop-the-world,建议使用G1 GC JAVA_OPTS=”$JAVA_OPTS -XX:+UseParNewGC” JAVA_OPTS=”$JA

让Elasticsearch飞起来!——性能优化实践干货

原文:让Elasticsearch飞起来!--性能优化实践干货 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/wojiushiwo987/article/details/85109769 0.题记 Elasticsearch性能优化的最终目的:用户体验爽. 关于爽的定义--著名产品人梁宁曾经说过"人在满足时候的状态叫做愉悦,人不被满足就会难受,就会开始寻求.如果这个人在寻求中,能立刻得到

ELASTICSEARCH 读写性能优化

ELASTIC 写i性能优化 refresh translog flush refresh 优化 translog优化 flush 优化 读性能优化 shard 设置 原文地址:https://www.cnblogs.com/yg_zhang/p/12099575.html

mysql性能优化总结1

MySQL性能优化总结 一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件.首先肯定会有任何存储引擎都不可缺少的存放表结构定义信息的.frm文件,另外还有.MYD和.MYI文件,分别存放了表的数据(.MYD)和索引数据(.MYI).每个表都有且仅有这样三个文件做为MyISAM存储类型的表的存