您当前的位置: 首页 >  ar

zmc@

暂无认证

  • 0浏览

    0关注

    142博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Elasticsearch各个索引结构到底存在哪里?flush、refresh做了什么?

zmc@ 发布时间:2021-03-08 21:09:42 ,浏览量:0

先说结论:

1.ES的倒排索引结构本质是一些文件,最终是存在磁盘的;

2.refresh操作是将buffer中不可见的数据刷到内存;

3.flush操作会先执行一次refresh操作,将buffer中不可见的数据刷到内存,再将内存中的data数据刷到磁盘,清空translog数据;

 

倒排索引结构怎么理解?

1.先看一下elasticsearch中一些概念的层级关系:自上而下分别为:前缀索引层、倒排索引层、数据存储层

2.通常说的倒排索引层实际上就是上图中对应的倒排索引层,正排索引就类似于一个目录,倒排索引就是一个term(词)与doc编号列表的一个键值对。

3.由于倒排索引在数据量很大的情况下,键值对占用空间也很大,于是ES设计了一层前缀索引,前缀索引是用于快速找到倒排索引中的term(key)。

4.前缀索引是常驻内存的,lucene6之前是字典树,之后是FST结构。

 

 

为什么说倒排索引结构最终是落到磁盘?

1.在refresh之后也就生成了一个segment,即产生了倒排索引和前缀索引,此时没有到触发flush的条件,前缀索引、倒排索引、doc源数据全部在内存。

2.触发flush,会先执行一次refresh(防止数据在buffer中),然后将倒排索引和doc源数据写到磁盘(FST不会写到磁盘),将translog数据清空。所以倒排索引结构会先在内存,最终写入磁盘。

 

 

update操作与get API

1.update操作会先get到数据,再覆盖数据,在ES5.x版本时,get操作会执行一次refresh,大量的update操作会导致大量的segment,在ES2.x以及5.x之后的版本,都是使用translog来实现update中的第一步(get)。

2.get API是要求实时的,5.x版本是使用refresh来实现,之前和之后版本都是使用translog实现。

 

 

 

 

 

 

 

 

关注
打赏
1643271353
查看更多评论
立即登录/注册

微信扫码登录

0.0413s