ElasticSearch优化

tech2025-05-21  10

1、写入速度优化

ES默认设置下,是综合考虑数据可靠性、搜索实时性、写入速度等因素的。有时候业务上对数据可靠性和搜索实时性要求并不高,反而对写入速度要求很高,此时可以调整整一些策略,最大化写入速度。

1)加大translog flush间隔:默认的translog的持久化策略是每个请求都“flush”。如果系统可以接受一定概率的数据丢失,可以调整translog持久化策略为周期性和一定大小时“flush”;

2)索引刷新间隔refresh_intercal:默认是1s,每次refresh会产生一个新的segment,这会导致频繁的segment merge行为,如果不需要这么高的搜索实时性,应该降低refresh周期;

3)段合并优化:

最大线程数,index.merge.scheduler.max_thread_count(如果只有一块非SSD的硬盘并发写,由于寻址原因,可以设置为1),

每层分段数量,index.merge.policy.segments_per_tier(默认为10,可以考虑适当增加此值,应该大于等于index.merge.policy.max_merge_at_once),

单个segment最大容量,index.merge.policy.max_merged_segment(默认为5GB,可以适当降低此值);

4)indexing buffer:在为doc建立索引时使用,当缓存冲满时会刷入磁盘,生成一个新的segment。

所有shard的buffer总大小,indices.memory.index_buffer_size(默认为整个堆空间10%,在执行大量索引操作时,可以适当增大该值),

indices.memory.min_index_buffer_size(默认为48M),

indices.memory.max_index_buffer_size(默认无限制)

5)使用bulk请求:注意每个请求避免超过几十M

适当增加队列大小,但是过大的队列导致较高的GC压力

并发执行bulk,客户端极限写入并发量应该控制在不产生reject前提下的最大值。

6)磁盘间的任务均衡:es配置多路径使用多块磁盘时,优先将shard分配到可用空间百分比最多的磁盘上看,但是由于预估可能不准,可能导致落到磁盘上的shard可能不均匀。

使用策略,简单轮询、基于可用空间的动态加权轮询;

7)节点间的任务均衡:数据写入客户端应该把bulk请求轮询发送到各个节点。

8)索引过程调整和优化:

自动生成doc ID

对不需要评分的字段禁用norms。

 

2、搜索速度优化

1)*为文件系统cache预留足够的内存

2)使用更快的硬件

3)文档模型,尽量避免使用join、nested

4)*预索引数据

5)字段映射,有些字段内容是数字可以映射为keyword更好比integer更好

6)避免使用脚本

7)优化日期搜索,可以四舍五入到分钟进行缓存会更有效

8)为只读索引执行force-merge

9)*预热文件系统cache

10)使用近似聚合

11)深度优先和广度优先,默认情况是深度优先,构建完整的树

12)*冷热分离(每日滚动生成索引,超过7天的索引迁移到cold节点。参考:https://www.cnblogs.com/iiiiher/p/9268832.html)

13)*分页性能优化

最新回复(0)