一 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)