问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ES近实时搜索原理

发布网友 发布时间:2022-09-24 06:02

我来回答

1个回答

热心网友 时间:2023-09-11 21:55

Segment(段):Lucene里面的一个数据集概念
提交点文件:有一个列表存放着所有已知的所有段
ES底层是基于Lucene,最核心的概念就是Segment(段),每个段本身就是一个倒排索引。
ES中的Index由多个段的集合和commit point(提交点)文件组成。

提交点文件中有一个列表存放着所有已知的段,下面是一个带有1个提交点和3个段的Index示意图:

Doc新增提交主要过程如下:
一、写入磁盘后可见:
1、Doc写入Buffer
Doc会先被搜集到内存中的Buffer内,这个时候还无法被搜索到,如下图所示:

(1)创建一个新段,作为一个追加的倒排索引,写入到磁盘(文件系统缓存)
(2)将新的包含新段的Commit Point(提交点)写入磁盘(文件系统缓存)
(3)磁盘进行fsync,主要是将文件系统缓存中等待的写入操作全部物理写入到磁盘,保证数据不会在发生错误时丢失
(4)这个新的段被开启, 使得段内文档对搜索可见
(5)将内存中buffer清除,又可以把新的Doc写入buffer了
下面展示了这个过程完成后的段和提交点的状态:

为了数据安全,每次的索引变更都最好要立刻刷盘, 所以 Commit 操作意味着将Segment 合并并写入磁盘。保证内存数据尽量不丢。刷盘是很重的 IO 操作, 所以为了机器性能和近实时搜索, 并不会刷盘那么及时。

新文档被索引意味着文档会被首先写入内存 buffer 和 translog 文件。每个 shard 都对应一个 translog 文件。

在 elasticsearch 中, _refresh操作默认每秒执行一次,意味着将内存 buffer 的数据写入到一个新的Segment 中,这个时候索引变成了可被检索的。

Flush操作意味着将内存buffer的数据全都写入新的Segments中,并将内存中所有的Segments全部刷盘,并且清空translog日志的过程。

1、refresh:
Lucene支持对新段写入和打开 - 可以使文档在没有完全刷入硬盘的状态下就能对搜索可见,而且是一个开销较小的操作,可以频繁进行。
下面是一个已经将Docs刷入段但还没有完全提交的示意图:

2、translog
为了避免在两次commit操作间隔时间发生异常导致Doc丢失,ES中采用了一个事务日志记录每次对ES的操作。加上translog后新增文档流程如下:
文档被添加到buffer同时追加到translog,如图:

下面示意图展示了这个状态:

4、flush
flush就是执行commit清空、干掉老translog的过程。默认每个分片30分钟或者是translog过于大的时候自动flush一次。可以通过flush API手动触发,但是只会在重启节点或关闭某个索引的时候这样做,因为这可以让未来ES恢复的速度更快(translog文件更小)。
三、 ES对Doc删除的处理
(1)删除一个ES文档不会立即从磁盘上移除,它只是被标记成已删除。因为段是不可变的,所以文档既不能从旧的段中移除,旧的段也不能更新以反映文档最新的版本。
ES的做法是,每一个提交点包括一个.del文件(还包括新段),包含了段上已经被标记为删除状态的文档。所以,当一个文档被做删除操作,实际上只是在.del文件中将该文档标记为删除,依然会在查询时被匹配到,只不过在最终返回结果之前会被从结果中删除。ES将会在用户之后添加更多索引的时候,在后台进行要删除内容的清理。
(2)Doc删除与段合并的关系
通过每秒自动刷新创建新的段,用不了多久段的数量就爆炸了,每个段消费大量文件句柄,内存,cpu资源。更重要的是,每次搜索请求都需要依次检查每个段。段越多,查询越慢。
ES通过后台合并段解决这个问题。ES利用段合并的时机来真正从文件系统删除那些version较老或者是被标记为删除的文档。被删除的文档(或者是version较老的)不会再被合并到新的更大的段中。
ES对一个不断有数据写入的索引处理流程如下:
索引过程中,refresh会不断创建新的段,并打开它们。
合并过程会在后台选择一些小的段合并成大的段,这个过程不会中断索引和搜索。合并过程如图:

两个已提交的段 和一个未提交的段合并为一个更大的段。从上图可以看到,段合并之前,旧有的Commit和没Commit的小段皆可被搜索。
(3)段合并后的操作:
a、新的段flush到硬盘
b、编写一个包含新段的新提交点,并排除旧的较小段。
c、新的段打开供搜索
d、旧的段被删除
合并完成后新的段可被搜索,旧的段被删除,如下图所示:

注:
什么情况下要强制刷新:
1、reindex后,手动修改refresh,由-1(不刷新)改为想要的刷新值
2、在读多,写少时,可以强制不刷新,因为每写入一条数据就会产生一个新段,查询时就会查一次,降低效率
3、即时性要求高,:如广告立马需要被看到,需要手动强制刷新
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 Elasticsearch——search搜索入门 ES索引设计 经典好听的歌词个性签名2020 歌词的句子_关于歌词的句子_描写好句 dev c++怎么用 买回家洗过之后变形变大,可以退货吗 伊利集团液态奶事业部的待遇怎么样啊,我应聘的是设备工程师,本科,前途怎么样呢?急 啊,谢谢 被封了怎么办? 被封号怎么解除? 被永久封号了如何解开? 被封了怎么办 已被封禁怎么办 关于想念青春岁月的句子 被封了怎么办? 蒜可以放在蜂蜜中腌着吃吗 被封如何解开 惠普的打印机不能进纸怎么解决 七夕是那一天多少号星期几 长大后对于人生的一些感悟个性说说? 感悟人生个性经典说说:你哪里是念旧,你只是现在过得不幸福罢了 ES中的索引生命周期管理 古代最低贱的妃子叫什么? 宝宝第一次走路祝福语 作为妈妈太期待这个瞬间 古代妃子的等级化分是什么??? 2020全家福什么时候开奖 2020全家福卡怎么知道自己中没中奖 正航导航者工业专业版的服务器账号和服务器密码是怎么回事 什么是服务器登录账户?什么是数据库访问用户?急需答案,谢谢! 魔兽世界台湾服务器授权账号是什么意思谢谢 运营流程管理 问问大家代练丸子a p p是一款什么软件? 有朋友比较了解代练丸子这个APP吗?能不能给我说一下? 问下问题代练丸子是一个什么软 件? 代练丸子这个app正规吗? 代练丸子app有什么优势? 三岁以上宝宝喝什么奶粉好 宝宝第一步的祝福语 贵妃 妃嫔 贵人 答应 常在还有她们都住在什么宫 十八岁出门远行读书心得感悟范文 请问一下桥香波尔多特藏干红葡萄酒的大约价为多少 谢谢 清朝后妃的品级是啥?