三、Lucene Index
1、一个ES中的shard就是Lucene中的Index(An ES Shard=A Lucene Index)
2、在Lucene中,单个倒排索引文件被称为Segment;Segment是自包含的,不可变的,多个Segment汇总在一起,称为Lucene的Index;
3、当有新文档写入时,会生成新segment;查询是会同时查询所有的segments,并且对结果汇总。
4、Lucene中有一个文件,用来记录所有segment信息,叫做commit point.
5、删除的文档信息,保存在.del文件中。
四、Refresh
1、将Index Buffer写入Segment的过程叫做Refresh,当执行Refresh的时候不执行fsync操作
2、Refresh频率:默认1s发生一次,可通过参数index.refresh_interval配置,refresh后数据就可以被搜索到了,这也是ES被称为近实时搜索(NRT)
3、如果有大量的数据写入,就会产生很多的segment;
4、Index Buffer被占满是,就会触发refresh,index buffer默认大小是JVM的10%;
五、Transaction Log
1、segment写入磁盘的过程相对耗时,借助文件系统缓存,refresh的时候,先将segment写入文件系统缓存,以开放查询。
2、为了保证数据不会丢失,在写入文档时,同时写入Transcation Log,高版本开始,默认transaction log默认落盘;
3、每个分片都有一个transaction log;
4、在ES refresh的时候,index buffer被清空,transaction Log不会清空。
5、在发生断电的时候,因为有transaction Log的落盘,数据不会丢失。
六、ES Flash和Lucene Commit
1、调用Refresh,Index Buffer清空并且Refresh
2、调用fsync,将缓存中的segments写入磁盘
3、清空(删除)transaction log
4、默认30分钟调用一次
5、transaction log 满(默认512M)
七、Merge
1、Segment很多,需要被定期合并。可以减少segments和删除已经删除的文档
2、ES和Lucene会自动进行merge操作。如果手动执行,可以通过使用以下API进行操作:POST my_index/_forcemerge
原文:https://blog.51cto.com/liqingbiao/2537700