【问题标题】:What exactly does -1 refresh_interval in Elasticsearch mean?Elasticsearch 中的 -1 refresh_interval 究竟是什么意思?
【发布时间】:2016-04-06 11:14:55
【问题描述】:

我已经阅读了很多关于 Elasticsearch 中索引刷新的文章。我理解大于 0 的不同间隔的含义,这是连续段刷新之间的经过时间,使它们可用于搜索。但是,我不确定 refresh_interval: -1 到底做了什么。据我了解,这是禁用自动索引刷新的一种手段,但并非完全禁用。即使 refresh_interval 设置为 -1,Elasticsearch 仍会不时刷新段。如果禁用自动刷新,我想知道哪种机制控制这种刷新活动。

抱歉,我知道我没有太多要发布的代码,所以我将介绍一下我所追求的背景。我的应用程序不需要近乎实时的搜索;它只需要最终的一致性。但是,这种可能性应该是合理的,即在几秒钟到不到一分钟,而不是半小时内。我想知道是否可以将它留给 Elasticsearch 来决定何时最好在方便时刷新,而不是定期刷新。原因是禁用自动刷新确实给我的应用程序带来了一些性能方面的好处,例如在垃圾回收间隔期间,JVM 堆大小使用率的上升幅度较小(见下图)

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您的理解有些混乱。刷新索引和写入磁盘是两个不同的过程,不一定相关,因此即使refresh_interval 为-1,您对段仍在写入的观察。

    当一个文档被索引时,它被添加到内存缓冲区并附加到 translog 文件中。当刷新发生时,缓冲区中的文档被写入一个新段,没有 fsync,该段被打开以使其对搜索可见并且缓冲区被清除。 translog 尚未清除,实际上没有任何东西保存到磁盘(因为没有 fsync)。

    现在想象一下没有发生刷新:没有索引刷新,您无法搜索文档,段没有在缓存中创建。

    设置here 将指示何时刷新(写入磁盘)发生。默认情况下,当 translog 大小达到 512mb 时,或 30 分钟后。这实际上是将数据保存在磁盘上,其他所有内容都在文件系统缓存中(如果节点死亡或机器重新启动,缓存会丢失,而 translog 是唯一的救星)。

    【讨论】:

    • 谢谢,这很有意义,特别是因为我只观察到当有大量索引时仍在写入的段。
    【解决方案2】:

    默认情况下,index.refresh_interval 设置为 1s。实际上,这在 ES 中可以称为昂贵的操作,尤其是在索引时。你可以注意到,当你增加 refresh_interval 时。

    将 index.refresh_interval 设置为 -1 意味着您正在禁用它,这可以在索引到 ES 时为您带来显着的收益。您只需要禁用 refresh_interval (完成索引数据后再次启用它)

    curl -XPUT "http://localhost:9200/$INDEX_NAME/_settings" -d '{ "index" : { "refresh_interval" : "-1"  }}'
    
    #index data......
    
    curl -XPUT "http://localhost:9200/$INDEX_NAME/_settings" -d '{ "index" : { "refresh_interval" : "1s"  }}'
    

    并且您可以在索引后根据您的要求设置适当的值以确保一致性。 一篇有用的文章:-https://sematext.com/blog/2013/07/08/elasticsearch-refresh-interval-vs-indexing-performance/

    希望对你有帮助!

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-12
    • 2014-10-29
    • 2016-01-27
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多