Elasticsearch的Refresh与Flush操作

初次接触到这两个概念,估计都会觉得他们没什么差别,都是为了在操作索引之后让索引可以被实时性的搜索,不过它们还是有点不同的。
Elasticsearch底层依赖Lucene,这里我们介绍下Lucene的segment, Reopen,commit。
Segment
在ES中,基本的存储单元是shard(分片),但是在更底层的Lucene上稍微有点不同,ES的每一个shard是Lucene的一个index(索引),Lucene的索引由多个segment组成,每个segment就是ES文档的倒序索引,里面包含了一些term(词)的mapping(映射)。

当每个ES的文档创建的时候,都会写入一个新的segment中,因此每次写入的都是新的segment,所以不需要修改之前的segment。在删除文档的时候,只是在它属于的segment哪里标记为已删除就可,没有真正的从磁盘中抹除。更新也是同样的,只是在对应之前segment哪里标记为逻辑删除,然后新建一个新的segment。
Lucene Reopen
Reopen是为了让数据可以可以被搜索到,尽管这个时候数据可以被搜索到,但是不一定保证数据已经被持久化到磁盘中。
Lucene Commit
Commit就是为了让数据持久化,每一次的Commit,不同segment的数据都会被持久化到磁盘中,虽然这样可以让数据更安全,但是每一次操作都会消耗系统资源,会有大量的IO操作。
Translog
ES在持久化的时候引入了一种新的方式,translog(transaction log),一个文档被索引之后,就会被添加到内存缓冲区,并且 追加到了translog.

ES的Refresh

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

ES的Flush

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

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

最后

简单来说,ES的refresh操作是为了让最新的数据可以立即被搜索到。而flush操作则是为了让数据持久化到磁盘中,另外ES的搜索是在内存中处理的,因此Flush操作不影响数据能否被搜索到。
translog一般在进行flush的时候被清空,一般在fsync和commit的时候被持久化到磁盘,默认的translog是在6.x版本以后,每次请求都会fsync到磁盘。不过有些index.translog的配置可以设置

原文地址:https://blog.51cto.com/13981400/2402526

时间: 2024-10-16 17:29:19

Elasticsearch的Refresh与Flush操作的相关文章

Elasticsearch:Elasticsearch中的refresh和flush操作指南

在今天的文章里,我们来主要介绍一下Elasticsearch的refresh及flush两种操作的区别.如果我们从字面的意思上讲,好像都是刷新的意思.但是在Elasticsearch中,这两种操作是有非常大的区别的.本指南将有效解决两者之间的差异. 我们还将介绍Lucene功能的基础知识,例如重新打开(reopen)和提交(commit),这有助于理解refresh和flush操作. Refresh及Flush 乍一看,Refresh和Flush操作的通用目的似乎是相同的. 两者都用于使文档在索

HRegionServer Flush操作源码分析

Flush操作是将HBase中的数据存到硬盘上的过程,具体的flush的流程图如下,本文主要简要分析flush的过程相关源码. Flush 任务提交 每当HRegion完成数据插入的操作的时候,就会进行检查此时是否需要进行一次flush,flush是将HRegion缓存的数据存储到磁盘的过程: long addedSize = doMiniBatchMutation(batchOp); long newSize = this.addAndGetGlobalMemstoreSize(addedSi

TLB flush操作

一.前言 Linux VM subsystem在很多场合都需要对TLB进行flush操作,本文希望能够把这个知识点相关的方方面面描述清楚.第二章描述了一些TLB的基本概念,第三章描述了ARM64中TLB的具体硬件实现,第四章描述了linux中和TLB flush相关的软件接口.内核版本依然是4.4.6版本. 二.基本概念 1.什么是TLB? TLB的全称是Translation Lookaside Buffer,我们知道,处理器在取指或者执行访问memory指令的时候都需要进行地址翻译,即把虚拟

当redis执行flush操作后的补救措施

redis误操作flushall的补救措施前提:开启了aof持久化注意: 当执行了flushall或者flushdb等手残命令,切记千万不要触发aof重写 可以利用config set命令将如下两值调巨大,防止重写操作.auto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb 手残操作:由于我这个远远没有达到aof重写,所以没有设置那两个参数 然后打开aof文件发现其实就是多了3行记录这时候把红框中的三行删掉并保存退出 保险起见,

ElasticSearch中实现文档操作后立即被搜索到

ElasticSearch一般称为近实时的大数据处理引擎,为什么是近实时呢?原因是当我们提交索引数据时,实际上只是写到了Buffer里面,并不是立即可搜索的,最多需要等1秒才可搜索(index.refresh_interval由这个参数控制,可以通过动态API自定义设置,或在建索引时在settings里面设置),还有一点,当存在副本时,只保证主分片写入成功写入请求就会返回,此时搜索请求如果分配到了副本上,有可能是搜索不到的. 那怎么做到实时搜索呢,在Java的UpdateRequest.Inde

写个Elasticsearch的client库简化操作

[TestMethod] public void Analyze() { string[] d = mIndex.Analyze("c# socket", "ik"); } [TestMethod] public void match() { IList<Blog> items = mIndex.Query<Blog>(q => q.Match(new SearchMatch { field = "title", q

elasticsearch 查询优化

首先对不必要的字段不做分词也就是不做索引,禁止内存交换 1.shard 一个Shard就是一个Lucene实例,是一个完整的搜索引擎. 分片数过多会导致检索时打开比较多的文件,多台服务器之间通讯成本加大. 而分片数过少会导至单个分片索引过大,所以检索速度也会慢. 建议单个分片最多存储10G-20G左右的索引数据,并且尽量集群的所有节点都分片数一致,不要出现分片数不一样导致的一个实例负载过大,等待合并的时间变长: 2.shard副本 使用副本的优点:数据备份,提高对大索引的查询效率,建议副本在1-

ElasticSearch操作实例大全---文档结构操作(2)

接上一篇ElasticSearch操作实例大全---文档结构操作(1) 前提条件--开发环境已安装 (自行百度) 客户端用的是nest 学习elasticSearch主要是要掌握像sqlserver要会操作数据结构的增删改和数据的增删改查,这里主要写elasticSearch的文档结构操作和文档数据操作 一.如果你已经建好了索引,但是需求改变需要新增一个字段,那就改了之后要进行映射,映射主要是确定字段的数据类型 /// <summary> /// 创建mapping /// </summ

剖析Elasticsearch集群系列第一篇 Elasticsearch的存储模型和读写操作

剖析Elasticsearch集群系列涵盖了当今最流行的分布式搜索引擎Elasticsearch的底层架构和原型实例. 本文是这个系列的第一篇,在本文中,我们将讨论的Elasticsearch的底层存储模型及CRUD(创建.读取.更新和删除)操作的工作原理. Elasticsearch是当今最流行的分布式搜索引擎,GitHub. SalesforceIQ.Netflix等公司将其用于全文检索和分析应用.在Insight,我们用到了Elasticsearch的诸多不同功能,比如: 全文检索 比如找