elasticsearch 性能优化
架构层面
-
合理的分配角色和每个节点的配置,在部署集群的时候,应该根据多方面的情况去评估集群需要多大规模去支撑业务。这个是需要根据当前的硬件环境下测试数据的写入和搜索性能,然后根据目前业务来动态评估的,比如:
-
业务数据的总量、每天的增量
-
查询的并发以及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
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13