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 和段合并可以缓解小段的积累,清除旧数据。
posted @   钟音城  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示