elasticsearch 优化笔记
综合来说,提升写入速度可以从以下几个方面入手:
1、加大 translog flush ,目的是降低 iops,writeblock
2、加大 index refresh间隔, 目的除了降低 io, 更重要的降低了 segment merge 频率
3、调整 bulk 线程池和队列
4、优化磁盘间的任务均匀情况,将 shard 尽量均匀分布到物理主机的各磁盘
5、优化节点间的任务分布,将任务尽量均匀的发到各节点
6、优化 lucene 层建立索引的过程,目的是降低 CPU 占用率及 IO
一、translog flush 间隔调整
从 es 2.x 开始, 默认设置下,translog 的持久化策略为:每个请求都flush.对应配置项为:
index.translog.durability: request
这是影响 es 写入速度的最大因素.但是只有这样,写操作才有可能是可靠的,原因参考写入流程.
二、索引刷新间隔调整: refresh_interval
默认情况下索引的refresh_interval为1秒,这意味着数据写1秒后就可以被搜索到,每次索引的 refresh 会产生一个新的 lucene 段,
这会导致频繁的 segment merge 行为,如果你不需要这么高的搜索实时性,应该降低索引refresh 周期,如:index.refresh_interval: 120s
三、segment merge
segment merge 操作对系统 CPU 和 IO 占用都比较高,从es 2.0开始,merge 行为不再由 es 控制,而是转由 lucene 控制,因此以下配置已被删除:
indices.store.throttle.type
indices.store.throttle.max_bytes_per_sec
index.store.throttle.type
index.store.throttle.max_bytes_per_sec
改为以下调整开关:
index.merge.scheduler.max_thread_count
index.merge.policy.*
2搜索速度优化
为文件系统cache预留足够的内存
使用更快的硬件
文档模型
尽量避免join操作,嵌套会使得查询慢几倍,父子关系可能使查询慢数百倍