初次接触到这两个概念,估计都会以为他们没什么差异,都是为了在操做索引以后让索引能够被实时性的搜索,不过它们仍是有点不一样的。
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.app
ES的Refreshide
默认状况下,ES会每秒refresh一次,每次操做都会把内存缓冲区的内容拷贝到新建立的segment中去,这一步是在内存中操做的,这个时候新的文档就会被搜索了。也就是说ES是近实时性的搜索,差很少1s钟,才能让数据能够被搜索到。索引
ES的Flush内存
Flush操做意味着,全部在内存缓冲区的文档被写到新的Lucene Segment中,也就是全部在内存中的segment被提交到了磁盘,同时清除translog。资源
通常Flush的时间间隔会比较久,默认30分钟,或者当translog达到了必定的大小,也会触发flush操做。文档
最后it
简单来讲,ES的refresh操做是为了让最新的数据能够当即被搜索到。而flush操做则是为了让数据持久化到磁盘中,另外ES的搜索是在内存中处理的,所以Flush操做不影响数据可否被搜索到。
translog通常在进行flush的时候被清空,通常在fsync和commit的时候被持久化到磁盘,默认的translog是在6.x版本之后,每次请求都会fsync到磁盘。不过有些index.translog的配置能够设置io