Elasticsearch深入:Refresh和Flush区别@
整体流程:
- 数据首先写入Buffer缓冲和Translog日志文件中。
当你写一条数据doc的时候,一方面写入到mem buffer缓冲中,一方面同时写入到translog日志文件中。 - buffer满了或者每隔1秒(默认1秒),refresh将Buffer中的数据生成index segment文件并写入文件系统缓存,此时index segment可被打开以供search查询读取,这样文档就可以被搜索到了(注意,此时文档还没有写到磁盘上);然后清空mem buffer供后续使用。可见,refresh实现的是文档从内存移到文件系统缓存的过程。
- 重复上两个步骤,新的segment不断添加到os cache,mem buffer不断被清空,而translog的数据不断增加,随着时间的推移,translog文件会越来越大。
- 当Translog长度达到一定程度的时候,会触发flush操作,否则默认每隔30分钟也会定时flush,其主要过程:
- 执行refresh操作将mem buffer中的数据写入到新的segment并写入os cache,然后打开本segment以供search使用,最后再次清空mem buffer。
- 一个commit point被写入磁盘,这个commit point中标明所有的index segment。
- filesystem cache(os cache)中缓存的所有的index segment文件被fsync强制刷到磁盘os disk,当index segment被fsync强制刷到磁盘上以后,就会被打开,供查询使用。
- translog被清空和删除,创建一个新的translog。
一、Refresh
POST /_refresh 刷新(Refresh)所有的索引。POST /blogs/_refresh 只刷新(Refresh) blogs 索引。
尽管刷新是比提交轻量很多的操作,它还是会有性能开销。当写测试的时候, 手动刷新很有用,但是不要在生产环境下每次索引一个文档都去手动刷新。 相反,你的应用需要意识到 Elasticsearch 的近实时的性质,并接受它的不足。
并不是所有的情况都需要每秒刷新。可能你正在使用 Elasticsearch 索引大量的日志文件, 你可能想优化索引速度而不是近实时搜索, 可以通过设置 refresh_interval , 降低每个索引的刷新频率:
PUT /my_logs{
"settings": {
"refresh_interval": "30s" 每30秒刷新 my_logs 索引。
}
}
refresh_interval 可以在既存索引上进行动态更新。 在生产环境中,当你正在建立一个大的新索引时,可以先关闭自动刷新,待开始使用该索引时,再把它们调回来:
PUT /my_logs/_settings{ "refresh_interval": -1 } 关闭自动刷新。
PUT /my_logs/_settings
{ "refresh_interval": "1s" } 每秒自动刷新。
refresh_interval 需要一个 持续时间 值, 例如 1s (1 秒) 或 2m (2 分钟)。 一个绝对值 1 表示的是 1毫秒 --无疑会使你的集群陷入瘫痪。
二、Flush
Flush是用于translog: ES为了数据的安全,在接受写入文档的时候,在写入内存buffer的同时,会写一份translog日志,从而在出现程序故障或磁盘异常时,保证数据的安全。 flush会触发lucene commit,并清空translog日志文件。
translog的flush是ES在后台自动运行的。默认情况下ES每隔5s会去检测要不要flush translog,默认条件是:每 30 分钟主动进行一次 flush或者当 translog 文件大小大于 512MB主动进行一次 flush。 每次 index、bulk、delete、update 完成的时候,一定触发flush translog 到磁盘上,才给请求返回 200 OK。这个改变提高了数据安全性,但是会对写入的性能造成不小的影响。
在写入效率优先的情况下,可以在 index template 里设置如下参数:"index.translog.durability":"async" 和 "index.translog.sync_interval":30s (默认是5s)。
以上是 Elasticsearch深入:Refresh和Flush区别@ 的全部内容, 来源链接: utcz.com/z/512899.html