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)*分页性能优化