天天看点

Elasticsearch分布式架构原理(一)

一、ES分片

1、分片是ES中最小的工作单元。

2、是一个Lucence的Index

二、倒排索引的不可变性

1、倒排索引采用的是Immutable Design,一旦生成不可更改。

2、不可变性,带来的好处如下:

2.1、不需要考虑并发写文件的问题,避免了锁机制带来的性能问题

2.2、一旦读入内核的文件系统缓存,便留在那里,只要文件系统有足够的空间,大部分请求就会直接请求内存,不会命中磁盘,极大的提高了性能

2.3、缓存容易生成和为何,并且数据可以被压缩

3、不可变性,也带来了挑战: 如果需要让一个新的文档可以被搜索,需要重建整个索引

三、Lucene Index

Elasticsearch分布式架构原理(一)

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分布式架构原理(一)

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分布式架构原理(一)

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分布式架构原理(一)

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分布式架构原理(一)

继续阅读