ES毛刺问题
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 来调整) 将数据从缓冲区缓存刷新入系统缓存生成段文件( segment ),然后再进行后续的刷入硬盘、段合并等操作。
毛刺可能原因
- 大量写入后,原本的缓存失效,进行查询时需要重新构建缓存,虽然写入 refresh 后的数据也在系统缓存之中,但此缓存和查询时的缓存不同。进行数据预热的缓存包括倒排索引、文档数据、查询结果缓存、请求缓存、字段缓存、节点查询缓存、Lucene 索引缓存等内容,大量写入后建议手动预热。
- es 在更新操作时,是将原数据标记为删除在段合并时删除,然后新建数据,在大量写入时,会产生大量的被标记为删除的数据,同时大量的写入也会创建大量的小段( segment ),查询时会从这里大量的小段中查询。手动 flush 和段合并可以缓解小段的积累,清除旧数据。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?