欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

elasticsearch 写入速度优化以及搜索优化

程序员文章站 2022-07-05 13:06:57
...

 

一  elasticsearch 写入速度优化提升写入速度

 

1.  加大tranlog flush间隔

    #降低写阻塞,默认每个请求都flush
    index.translog.durability: request

    #这是影响 es 写入速度的最大因素.但是只有这样,写操作才有可能是可靠的,原因参考写入流程
    #如果系统可以接受一定几率的数据丢失,调整translog持久化策略为周期性和一定大小的时候flush
    #改为:
    
    index.translog.durability: async    
    #设置为async表示translog的刷盘策略按sync_interval配置指定的时间周期进行
    
    index.translog.sync_interval: 120s
    #加大translog刷盘间隔时间。默认情况下elasticsearch每隔5s会去检测要不要flush translog,不可低 
    #于100ms
    #默认条件是:每30分钟主动进行一次 flush或者当 translog 文件大小大于 512MB主动进行一次 flush
    
    index.translog.flush_threshold_period: 30m
    #在指定的时间间隔内如果没有进行flush操作,会进行一次强制flush操作。默认是30m
    
    index.translog.flush_threshold_size: 512mb
    #超过这个大小会导致refresh操作,产生新的Lucene分段。默认值为512MB


2.  加大index refresh间隔

    #降低IO,降低segement merge
    #默认情况下索引的refresh_interval为1秒,这意味着数据写1秒后就可以被搜索到,每次索引的refresh 
    #会产生一个新的Lucene段,这会导致
    #频繁的segment merge行为,如果不需要这么高的搜索实时性,应该降低索引refresh周期,
    
    index.refresh_interval: 120s

 
    
3.  调整bulk请求

      批量写比一个索引请求只写单个文档的效率高得多,但是要注意bulk请求的整体字节数不要太大,太大的请求可能会给集群带来内存压力,因此每个请求最好避免超过几十兆字节,即使较大的请求看上去执行得更好

4. shard尽量均匀
5. 优化Lucene建立索引过程
6. 禁用_all
7. 禁用norms    
    

二 分片(shard)与副本(replica)的数量

ElasticSearch在创建索引数据时,最好指定相关的shards数量和replicas,否则会使用服务器中的默认配置参数shards=5,replicas=1

index.number_of_shards: 5
index.number_of_replicas: 1

对于一个索引来说,number_of_shards只能设置一次,而number_of_replicas可以使用索引更新设置API在任何时候被增加或者减少。

那么如何确定分片和副本的数量呢?

依照经验,最理想的分片数量应该依赖于节点的数量。假设索引index配置了10个分片,1个副本,那么总共的分片数应该是20个,10 *(1+1),那么最大的Elasticsearch节点数应该就是20

节点最大数 = 分片数 * (副本数 + 1)

 

相关标签: elasticsearch