22

Elasticsearch Refresh 与 Flush 操作

 4 years ago
source link: https://www.tuicool.com/articles/2Inaumr
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

iYFFfmm.jpg!web

本文来自51CTO博客, 文地址  https://blog.51cto.com/13981400/2402526

初次接触到这两个概念,估计都会觉得他们没什么差别,都是为了在操作索引之后让索引可以被实时性的搜索,不过它们还是有点不同的

Elasticsearch 底层依赖 Lucene,这里我们介绍下 Lucene 的 Segment, Reopen,Commit。

Segment、Reopen、Commit

Segment

在 ES 中,基本的存储单元是 shard(分片 ,但是在更底层的 Lucene 上稍微有点不同,ES 的每一个 shard 是 Lucene 的一个 index(索引 ,Lucene 的索引由多个 segment 组成,每个 segment 就是 ES 文档的倒序索引,里面包含了一些 term(词 的 mapping(映射

yIZnIny.jpg!web

当每个 ES 的文档创建的时候,都会写入一个新的 segment 中,因此每次写入的都是新的 segment,所以不需要修改之前的 segment。在删除文档的时候,只是在它属于的 segment 哪里标记为已删除就可,没有真正的从磁盘中抹除。更新也是同样的,只是在对应之前 segment 哪里标记为逻辑删除,然后新建一个新的 segment。

Reopen

Reopen 是为了让数据可以可以被搜索到,尽管这个时候数据可以被搜索到,但是不一定保证数据已经被持久化到磁盘中

Commit

Commit 就是为了让数据持久化,每一次的 Commit,不同 segment 的数据都会被持久化到磁盘中,虽然这样可以让数据更安全,但是每一次操作都会消耗系统资源,会有大量的 IO 操作

Translog

ES 在持久化的时候引入了一种新的方式,translog(transaction log ,一个文档被索引之后,就会被添加到内存缓冲区,并且追加到了 translog。

UZV77vY.jpg!web

Refresh 操作

默认情况下,ES 会每秒 refresh 一次,每次操作都会把内存缓冲区的内容拷贝到新创建的 segment 中去,这一步是在内存中操作的,这个时候新的文档就会被搜索了。也就是说 ES 是近实时性的搜索,差不多1s钟,才能让数据可以被搜索到。

NfINbmu.jpg!web

Flush 操作

Flush 操作意味着,所有在内存缓冲区的文档被写到新的 Lucene Segment 中,也就是所有在内存中的 segment 被提交到了磁盘,同时清除 translog。

qUVbEbu.jpg!web

一般 flush 的时间间隔会比较久,默认30分钟,或者当 translog 达到了一定的大小,也会触发 flush 操作。

最后

简单来说,ES 的 refresh 操作是为了让最新的数据可以立即被搜索到。而 flush 操作则是为了让数据持久化到磁盘中,另外 ES 的搜索是在内存中处理的,因此 flush 操作不影响数据能否被搜索到

translog 一般在进行 flush 的时候被清空,一般在 fsync 和 commit 的时候被持久化到磁盘,默认的 translog 是在6.x版本以后,每次请求都会 fsync 到磁盘,不过有些 index.translog 的配置可以设置。

阅读完有所收获?欢迎分享本文给更多的小伙伴

vMja2qq.png!web

长按二维码 关注我 ↑

一起认真学习大数据, 预研新技术


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK