一、ES分片 1、分片是ES中最小的工作单元。 2、是一个Lucence的Index 二、倒排索引的不可变性 1、倒排索引采用的是Immutable Design,一旦生成不可更改。 2、不可变性,带来的好处如下: 2.1、不需要考虑并发写文件的问题,避免了锁机制带来的性能问题 2.2、一旦读入内核的文件系统缓存,便留在那里,只要文件系统有足够的空间,大部分请求就会直接请求内存,不会命中磁盘,极大的提高了性能 2.3、缓存容易生成和为何,并且数据可以被压缩 3、不可变性,也带来了挑战: 如果需要让一个新的文档可以被搜索,需要重建整个索引
三、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