• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

elasticsearch 性能优化

武飞扬头像
jxj_cd
帮助1

架构层面

  • 合理的分配角色和每个节点的配置,在部署集群的时候,应该根据多方面的情况去评估集群需要多大规模去支撑业务。这个是需要根据当前的硬件环境下测试数据的写入和搜索性能,然后根据目前业务来动态评估的,比如:

    • 业务数据的总量、每天的增量

    • 查询的并发以及QPS

    • 峰值的请求量

  • 节点并非越多越好,会增加主节点的压力

  • 分片并非越多越好,从deep pageing 的角度来说,分片越多,JVM开销越大,负载均衡(协调)节点的转发压力也越大,查询速度也越慢。单个分片也并非越大越好,一般来说单个分片大小控制在30-50GB。

  • Mpping优化:

    • 优化字段的类型,关闭对业务无用的字段

    • 尽量不要使用dynamic mapping分片大小

写入性能调优:
    写入流程
学新通

  • 增加flush时间间隔,目的是减小数据写入磁盘的频率,减小磁盘IO

  • 增加refresh_interval的参数值,目的是减少segment文件的创建,减少segment的merge次数。

  • 增加Buffer大小,本质也是减小refresh的时间间隔,因为导致segment文件创建的原因不仅有时间阈值,还有buffer空间大小。

  • 大批量的数据写入尽量控制在低检索请求的时间段,大批量的写入请求越集中越好。

    • 第一是减小读写之间的资源抢占,读写分离

    • 第二,当检索请求数量很少的时候,可以减少甚至完全删除副本分片,关闭segment的自动创建以达到高效利用内存的目的,因为副本的存在会导致主从之间频繁的进行数据同步,大大增加服务器的资源占用。

  • Lucene的数据的fsync是发生在OS cache的,要给OS cache预留足够的内存一般来说,需要至少一半的 可用内存 作为filesystem cache,这样es可以在物理内存中保有 索引的热点区域(hot regions of the index)。

  • String类型的字段根据业务需求确定text和keyword是否都需要  例如:查询不需分词,直接根据keyword查询就行,完全可以将text字段去掉,这样就能节省很大一部分存储空间,提升性能。

  • 禁用_all字段:_all字段的包含所有字段分词后的Term,作用是可以在搜索时不指定特定字段,从所有字段中检索,ES 6.0之前需要手动关闭

  • 关闭Norms字段:计算评分用的,如果你确定当前字段将来不需要计算评分,设置false可以节省大量的磁盘空间,有助于提升性能。常见的比如filter和agg字段,都可以设为关闭。

搜索速度调优

  • 禁用swap

  • 使用filter代替query。因为query会对搜索结果进行相关度算分,比较耗cpu。

  • 避免深度分页,避免单页数据过大,可以参考百度或者淘宝的做法。可以使用Scroll API。

  • 增加routing key。我们知道,一次ES查询,会将请求分发给所有shard,等所有shard返回结果后再聚合数据,最后将结果返回给调用方。如果事先已经知道数据分布在哪些shard上,那么就可以减少大量不必要的请求,提升查询性能。

  • 冷热分离的架构设计

  • doc_values:正排索引,对于不需要聚合的字段,关闭正排索引可节省资源,提高查询速度

  • 预热 filesystem cache, 机器重启时filesystem cache就被清空。OS将index的热点区域加载进filesystem cache需要花费一段时间。设置 index.store.preload 可以告知OS 这些文件需要提早加载进入内存,比如提前加载norms评分信息和doc value数据到内存,便于快速索引。

硬件优化

jvm heap分配:7.6版本默认1GB,这个值很小,很容易导致OOM。Jvm heap大小不要超过物理内存的50%,最大也不要超过32GB(指针压缩),它可用于其内部缓存的内存就越多,但可供操作系统用于文件系统缓存的内存就越少

  • 内存:

    根据业务量不同,内存的需求也不同,一般生产建议不要少于16G。ES是比较依赖内存的,并且对内存的消耗也很大,内存对ES的重要性甚至是高于CPU的,所以即使是数据量不大的业务,为了保证服务的稳定性,在满足业务需求的前提下,我们仍需考虑留有不少于20%的冗余性能。一般来说,按照百万级、千万级、亿级数据的索引,我们为每个节点分配的内存为16G/32G/64G就足够了,太大的内存,性价比就不是那么高了。

  • 磁盘:

    对于ES来说,磁盘可能是最重要的了,因为数据都是存储在磁盘上的,当然这里说的磁盘指的是磁盘的性能。磁盘性能往往是硬件性能的瓶颈,木桶效应中的最短板。ES应用可能要面临不间断的大量的数据读取和写入。生产环境可以考虑把节点冷热分离,“热节点”使用SSD做存储,可以大幅提高系统性能;冷数据存储在机械硬盘中,降低成本。另外,关于磁盘阵列,可以使用raid 0。

  • CPU:

    CPU对计算机而言可谓是最重要的硬件,但对于ES来说,可能不是他最依赖的配置,因为提升CPU配置可能不会像提升磁盘或者内存配置带来的性能收益更直接、显著。当然也不是说CPU的性能就不重要,只不过是说,在硬件成本预算一定的前提下,应该把更多的预算花在磁盘以及内存上面。通常来说单节点cpu 8核起步,不同角色的节点对CPU的要求也不同。服务器的CPU不需要太高的单核性能,更多的核心数和线程数意味着更高的并发处理能力。

  • 网络:

    ES是天生自带分布式属性的,并且ES的分布式系统是基于对等网络的,节点与节点之间的通信十分的频繁,延迟对于ES的用户体验是致命的,所以对于ES来说,低延迟的网络是非常有必要的。因此,使用扩地域的多个数据中心的方案是非常不可取的,ES可以容忍集群夸多个机房,可以有多个内网环境,但最好不要跨地域构建集群,维护这样(跨地域单个集群)的集群带来的额外成本可能远小于它带来的额外收益。

  • 集群规划:没有最好的配置,只有最合适的配置。

  • 集群需要多少种配置(内存型/IO型/运算型),每种配置需要多少数量,通常需要和产品运营和运维测试商定,是业务量和服务器的承载能力而定,并留有一定的余量。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggfgca
系列文章
更多 icon
同类精品
更多 icon
继续加载