我在Elasticsearch上阅读了很多关于索引刷新的文章。我理解大于0的不同间隔的含义,即连续段刷新之间经过的时间,使它们可用于搜索。但是,我不确定refresh_interval: -1
到底是做什么的。根据我的理解,它是一种禁用自动索引刷新但不完全禁用的方法。即使refresh_interval
设置为-1,Elasticsearch仍会不时刷新细分。我想知道如果禁用自动刷新,哪个机制会控制此刷新活动。
抱歉,我知道我没有很多代码可以发布,所以我将介绍一下我所追求的内容。我的应用程序不需要接近实时搜索;它只需要最终的一致性。然而,这种可能性应该是合理的,即在几秒到不到一分钟内,而不是半小时。我想知道我是否可以将它留给Elasticsearch来决定何时最好在方便时刷新而不是定期刷新。原因是禁用自动刷新确实在我的应用程序的性能方面带来了一些好处,例如: JVM堆大小使用在垃圾收集间隔之间不那么积极地增加(见下图)
答案 0 :(得分:25)
你的理解有点混乱。刷新索引并写入磁盘是两个不同的过程,并不一定相关,因此即使refresh_interval
为-1,您仍然会对段进行观察。
对文档编制索引时,会将其添加到内存缓冲区并附加到translog文件中。当刷新发生时,缓冲区中的文档将写入新段而不使用fsync ,打开段以使其可见以进行搜索并清除缓冲区。 translog尚未清除,并且实际上没有任何内容持久存储到磁盘(因为没有fsync
)。
现在想象一下刷新没有发生:没有索引刷新,你无法搜索你的文档,这些段不是在缓存中创建的。
设置here将指示何时发生刷新(写入磁盘)。默认情况下,当translog的大小达到512mb时,或者30分钟后。这实际上是持久化数据在磁盘上,其他一切都在文件系统缓存中(如果节点死机或机器重启,则缓存丢失,并且translog是唯一的救赎)。
答案 1 :(得分:2)
默认情况下,index.refresh_interval设置为1秒。实际上,这可以被称为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/
希望它有所帮助!