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 数据恢复原理 :
在索引写入的过程中,只要segment缓存文件没有刷新到磁盘上,当elasticsearch集群出现宕机后,留住缓存中的数据都会丢失掉;当出现上面数据丢失的现象后,怎么处理呢;Elasticsearch有一套容错恢复规则;当数据出现丢失后,会根据transLog记录点重新生产segment缓存文件。
每一秒就是刷新Buffer,生成一个segment文件,导致文件过多,默认后台会执行segment merge 操作,在merge的时候,被标记为deleted 的document也会被彻底物理删除