es 毛刺问题
在写入时,边写边查并不会出现明显毛刺,但在写入时不查询,写入完成后再查询会出现明显毛刺。下图的三个毛刺是在是用反转索引时,写入完成后切换索引时出现。
通过 remove 和 add 别名可以无感切换索引
/_aliases
{"actions": [{"add": {"index": "index-2","alias": "index"}},{"remove": {"index": "index-1","alias": "index"}}]
}
以下是优化方法,其中的 1 ,是不做任何处理的情况下的毛刺。
2 是在写入完成后进行缓存预热后再切换的毛刺。
/_search
{"query": {"match_all": {}}
}
3 是在写入完成后,手动进行 flush 将系统缓存写入硬盘,再进行段合并后的毛刺。
/_flush/_forcemerge?max_num_segments=1
4 是先进行 flush 和段合并再 进行缓存预热后的毛刺。
在多次测试中,手动 flush 段合并和数据预热都可以降低毛刺,有时段合并的效果更好,有时数据预热的效果更好,由于我这里是人工操作,在发送请求时会有时间间隔,所有没有进行 refresh ( refresh 操作默认 1 秒 1 次,可设置 refresh_interval 来调整),如果操作时间间隔短,需要先进行 refresh 将数据从缓冲区缓存刷新入系统缓存生成段文件( segment ),然后再进行后续的刷入硬盘、段合并等操作。