一  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

在优化分片时,分片的大小、节点中有多少分片是主要考虑因素。副本分片对于扩展搜索吞吐量很重要,如果硬件条件允许,则可以小心增加副本分片的数量。

容量规划的一个很好的启动点是分配分片,“《深入理解Elasticsearch》强调:最理想的分片数量应该依赖于节点的数量。”其数量是节点数量的1.5到3倍

分配副本分片数的公式:max(max_failures,ceil(num_nodes /) num_primaries) - 1)

原理:如果您的群集具有num_nodes节点,总共有num_primaries主分片,如果您希望最多能够同时处理max_failures节点故障,那么适合您的副本数量为如上公式值。

总的来说:节点数和分片数、副本数的简单计算公式如下: 所需做大节点数=分片数*(副本数+1)

 

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

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

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

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