Elasticsearch索引内部原理最简洁的归纳

Elasticsearch 内部索引写入原理 :

   1: 索引首先会写入到索引的 buffer缓存和translog日志文件中,这个期间不能被客户端索引;

   2:每隔一秒钟,buffer 缓存中的数据会被写入到新的segment缓存文件 file中,同时写入系统的缓存中os caching 中,并打开索引,外部客户端可以进行索引查询;这一点说明Elasticsearch 并不是所谓的实时索引,其中有一秒的延迟;

    3:写入segment file 后清空buffer缓存数据

    4:重复 1-3步骤的操作,新的segment不断增加,buffer不断清空;而transLog 的中的数据不断追加;

    5:当transLog 长度达到一定程度是时候,或者到达一定时间的时候,发生commit操作 

    6:发生commit操作的时候,所有的segment文件会被fsync强行刷到磁盘上;这个过程就是flush,默认是30分钟flush一次;或者tanslog过大的时候,也会触发flush .

   7:现有的transLog 被清空,创建一个新的transLog ;

步骤可以参考下图:

Elasticsearch索引内部原理最简洁的归纳

Elasticsearch 数据恢复原理 :

    在索引写入的过程中,只要segment缓存文件没有刷新到磁盘上,当elasticsearch集群出现宕机后,留住缓存中的数据都会丢失掉;当出现上面数据丢失的现象后,怎么处理呢;Elasticsearch有一套容错恢复规则;当数据出现丢失后,会根据transLog记录点重新生产segment缓存文件。

  每一秒就是刷新Buffer,生成一个segment文件,导致文件过多,默认后台会执行segment merge 操作,在merge的时候,被标记为deleted 的document也会被彻底物理删除