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

三、Lucene Index
Elasticsearch分布式架构原理(一)_第1张图片

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
Elasticsearch分布式架构原理(一)_第2张图片
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
Elasticsearch分布式架构原理(一)_第3张图片

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
Elasticsearch分布式架构原理(一)_第4张图片
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

Elasticsearch分布式架构原理(一)_第5张图片