最近一直在着手优化公司某些业务的大数据的查询。
数据量级大约在每天110亿个doc
左右,并且通常要对最近两天的数据做一定的处理,query的响应时间比较长,因此需要优化query api响应时间。
但是在架构层面从一开始的mapping
、分片数量、节点等各种配置上已经确定了,一些修改对数据影响比较大,所以只能在一些其他方面做一些优化。
结合之前工作中对Es的使用来说,总结了以下关于Es的优化建议,或者说是搭建Es集群之前就应该了解的,从配置开始就做符合自身业务的配置,而不是等到搜索时出现问题再优化,这个时候其实优化的空间已经不大了。
主要从以下几个方面进行优化:
1、合理的分配角色和每个节点的配置,在部署集群的时候,应该根据多方面的情况去评估集群需要多大规模去支撑业务。这个是需要根据在当前的硬件环境下测试数据的写入和搜索性能,然后根据你目前的业务参数来动态评估的,比如:
2、节点并非越多越好,会增加主节点的压力
3、分片并非越多越好,从deep pageing
的角度来说,分片越多,JVM开销越大,负载均衡(协调)节点的转发压力也越大,查询速度也越慢。单个分片也并非越大越好,一般来说单个分片大小控制在30-50GB。
4、Mpping优化:
1、增加flush时间间隔,目的是减小数据写入磁盘的频率,减小磁盘IO
2、增加refresh_interval
的参数值,目的是减少segment
文件的创建,减少segment
的merge
次数,merge
是发生在jvm
中的,有可能导致full GC
,增加refresh
会降低搜索的实时性。
3、增加Buffer
大小,本质也是减小refresh
的时间间隔,因为导致segment
文件创建的原因不仅有时间阈值,还有buffer
空间大小,写满了也会创建。 默认最小值 48MB < 默认值 堆空间的10% < 默认最大无限制
4、大批量的数据写入尽量控制在低检索请求的时间段,大批量的写入请求越集中越好。
5、Lucene的数据的fsync是发生在OS cache的,要给OS cache预留足够的内从大小,这点有知道JVM调优的人应该比较熟悉,这个我之前写过一点经验,可以参考。垃圾回收及JVM调优
6、通用最小化算法,能用更小的字段类型就用更小的,keyword类型比int更快,
7、ignore_above:字段保留的长度,越小越好
8、调整_source字段,通过include和exclude过滤
9、store:开辟另一块存储空间,可以节省带宽
注意:source设置为false,则不存储元数据,可以节省磁盘,并且不影响搜索。但是禁用_source必须三思而后行:
reindex
失效,原本可以修改的mapping
部分参数将无法修改,并且无法升级索引10、禁用_all字段:_all字段的包含所有字段分词后的Term,作用是可以在搜索时不指定特定字段,从所有字段中检索,ES 6.0之前需要手动关闭
11、关闭index_options(谨慎使用,高端操作):词设置用于在index time过程中哪些内容会被添加到倒排索引的文件中,例如TF,docCount、postion、offsets等,减少option的选项可以减少在创建索引时的CPU占用率,不过在实际场景中很难确定业务是否会用到这些信息,除非是在一开始就非常确定用不到,否则不建议删除
1、禁用swap
2、使用filter
代替query
3、避免深度分页,避免单页数据过大,可以参考百度或者淘宝的做法。es提供两种解决方案scroll search
和search after
4、注意关于index type的使用
5、避免使用稀疏数据
6、避免单索引业务重耦合
7、命名规范
8、冷热分离的架构设计
9、fielddata
:搜索时正排索引,doc_value
为index time正排索引。
10、enabled
:是否创建倒排索引。
11、doc_values
:正排索引,对于不需要聚合的字段,关闭正排索引可节省资源,提高查询速度
12、开启自适应副本选择(ARS),6.1版本支持,7.0默认开启,
es的默认配置是一个非常合理的默认配置,绝大多数情况下是不需要修改的,如果不理解某项配置的含义,没有经过验证就贸然修改默认配置,可能造成严重的后果。比如max_result_window
这个设置,默认值是1W,这个设置是分页数据每页最大返回的数据量,冒然修改为较大值会导致OOM
。ES没有银弹,不可能通过修改某个配置从而大幅提升ES的性能,通常出厂配置里大部分设置已经是最优配置,只有少数和具体的业务相关的设置,事先无法给出最好的默认配置,这些可能是需要我们手动去设置的。关于配置文件,如果你做不到彻底明白配置的含义,不要随意修改。
jvm heap分配:7.6版本默认1GB,这个值太小,很容易导致OOM
。Jvm heap
大小不要超过物理内存的50%,最大也不要超过32GB(compressed oop),它可用于其内部缓存的内存就越多,但可供操作系统用于文件系统缓存的内存就越少,heap过大会导致GC时间过长
ES cluster
的使用目的是什么?主要应用于哪些场景,比如是用来存储事务日志,或者是站内搜索,或者是用于数据的聚合分析。针对不同的应用场景,应该指定不同的优化方案。脑裂
时无法选举出新的Master节点的情况,另外可能还需要一些其他的单独的节点,比如ELK系统中的Kibana、Logstash等。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有