不为失败找理由,要为成功找方法。

ES读取的时候,为什么要先到translog中查询呢

Elasticsearch | 作者 laohan | 发布于2020年11月13日 | 阅读数:2682

ES读取的时候,为什么要先到translog中查询呢?大致的流程是怎么样的,我理解的是这样,先在内存中的translog中查询记录,如果找到的话,就直接返回,没找到的话,就去磁盘上的translog中查询,如果没找到,就说明没有。请大神指点
已邀请:

Charele - Cisco4321

赞同来自: Ombres

认为get会首先去translog里去拿数据的同学们,
 
先看懂InternalEngine.get(Get, BiFunction<String, SearcherScope, Searcher>)这个方法再说吧
 
有可能会去translog里面取,但只是有可能,
大部分情况都不会。

JiangJibo - 喊我雷锋

赞同来自: Ombres

普通的GET请求不会从translog里读取,GET请求的_id是倒排索引里的docValues,是Lucene里的元素,和translog没有多少关系
但通过_id 更新document,如果指定的_id对应的数据还没有refresh进segment,那么是会从tranlog里读取的,因为此时通过_id检索不到数据,也就是相应的数据是最近1S内写入的。
 
给个赞,老铁 

Charele - Cisco4321

赞同来自:

谁告诉你会先去translog里读的呢?

laohan - 会的越多,不会的越多

赞同来自:

我不太清楚,所以请大神指点

loredp

赞同来自:

GET操作会首先到translog里面搜索得,主要是因为生成segment到open需要时间,所以现在es在get方面也可以说是实时的,而不是NRT

FFFrp

赞同来自:

https://github.com/elastic/ela ... 64504  好像7.11要改成从内存中读了

FFFrp

赞同来自:

https://github.com/elastic/ela ... 48843  是否从translog中读取看这个就行了, 目前最新版本是get的默认请求就会读取translog,5.x之前是从translog中读取,而从5.x 到 7.5是使用refresh实现的,后来官方又恢复使用translog,在下个版本中会从内存来读取,期待一下吧。

要回复问题请先登录注册