Elasticsearch 的 refresh 和 flush 的区别
一、refresh 操作
当我们向 ES 发送请求的时候,我们发现es貌似可以在我们发请求的同时进行搜索。而这个实时建索引并可以被搜索的过程实际上是一次es 索引提交(commit)的过程,如果这个提交的过程直接将数据写入磁盘(fsync)必然会影响性能,所以es中设计了一种机制,即:先将 index-buffer 中文档(document)解析完成的 segment 写到 filesystem cache 之中,这样避免了比较损耗性能 io 操作,又可以使 document 可以被搜索。以上从 index-buffer 中取数据到 filesystem cache 中的过程叫做 refresh。
refresh 操作可以通过 API 设置:
POST /index/_settings
{"refresh_interval" : "10s"}
Elasticsearch 默认的 refresh 间隔时间是 1s,这也是为什么 ES 可以进行近乎实时的搜索。
当我们进行大规模的创建索引操作的时候,最好将将 refresh 关闭。
{"refresh_interval" : "-1"}
二、flush 操作与 translog
我们可能已经意识到如果数据在 filesystem cache 之中是很有可能在意外的故障中丢失。这个时候就需要一种机制,可以将对 Elasticsearch 的操作记录下来,来确保当出现故障的时候,保留在 filesystem 的数据不会丢失,并在重启的时候可以从这个记录中将数据恢复过来。Elasticsearch 提供了 translog 来记录这些操作。
当向 elasticsearch 发送创建 document 索引请求的时候,document 数据会先进入到 index buffer 之后,与此同时会将操作记录在 translog 之中,当发生 refresh 时(数据从 index buffer 中进入 filesystem cache 的过程)translog 中的操作记录并不会被清除,而是当数据从 filesystem cache 中被写入磁盘之后才会将 translog 中清空。而从 filesystem cache 写入磁盘的过程就是 flush。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论