Elasticsearch Lucene 数据写入原理 | ES 核心篇

  • 时间:
  • 浏览:0
  • 来源:大发pk10_pk10信誉网_大发pk10信誉网

前言

最近 TL 分享了下 《Elasticsearch基础采集》https://www.jianshu.com/p/e8226138485d ,蹭着你这俩是是是是因为。写个小文巩固下,本文主要讲 ES -> Lucene

的底层社会形态,你这俩你这俩完整版描述新数据写入 ES 和 Lucene 的流程和原理。这是基础理论知识,采集了一下,希望能对 Elasticsearch 感兴趣的同学有所帮助。

你这俩是 Elasticsearch ?

Elasticsearch 是一两个基于 Apache Lucene(TM) 的开源搜索引擎。

那 Lucene 是你这俩?

无论在开源还是专有领域,Lucene 能并能被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库,并通过简单的 RESTful API 来隐藏 Lucene 的比较比较复杂,从而让全文搜索变得简单。

Elasticsearch 不仅仅是 Lucene 和全文搜索,我们都都 还能另一两个去描述它:

  • 分布式的实时文件存储,每个字段都被索引并可被搜索
  • 分布式的实深冬析搜索引擎
  • 能并能扩展到上百台服务器,出理 PB 级社会形态化或非社会形态化数据

就像你这俩你这俩业务系统是基于 Spring 实现一样,Elasticsearch 和 Lucene 的关系很简单:Elasticsearch 是基于 Lucene 实现的。ES 基于底层你这俩包,你这俩你这俩进行了扩展,提供了更多的更丰富的查询的话,你这俩你这俩通过 RESTful API 能并能更方便地与底层交互。同类 ES 还有 Solr 也是基于 Lucene 实现的。

在应用开发中,用 Elasticsearch 会很简单。你这俩你这俩是是是是因为你直接用 Lucene,会有絮状的集成工作。

你这俩你这俩,入门 ES 的同学,稍微了解下 Lucene 即可。是是是是因为往高级走,还是时要学习 Lucene 底层的原理。是是是是因为倒排索引、打分机制、全文检索原理、分词原理等等,你这俩回会 无需过时的技术。

3.1 数据模型

如图

  • 一两个 ES Index (索引,比如商品搜索索引、订单搜索索引)集群下,有多个 Node (节点)组成。每个节点你这俩你这俩 ES 的实例。
  • 每个节点上会有多个 shard (分片), P1 P2 是主分片 R1 R2 是副本分片
  • 每个分片上对应着你这俩你这俩一两个 Lucene Index(底层索引文件)
  • Lucene Index 是一两个统称。由多个 Segment (段文件,你这俩你这俩倒排索引)组成。每个段文件存储着你这俩你这俩 Doc 文档。

3.2 Lucene Index

lucene 中,单个倒排索引文件称为 segment。其中有 一两个文件,记录了所有 segments 的信息,称为 commit point:

  • 文档 create 新写入时,会生成新的 segment。同样会记录到 commit point 后面
  • 文档查询,会查询所有的 segments
  • 当一两个段所处文档被删除,会维护该信息在 .liv 文件后面

3.3 新文档写入流程

新文档创建是是是是因为更新时,进行如下流程:

更新无需修改另一两个的 segment,更新和创建操作回会生成新的一两个 segment。数据哪里来呢?先会所处内存的 bugger 中,你这俩你这俩持久化到 segment 。

数据持久化步骤如下:write -> refresh -> flush -> merge

3.3.1 write 过程

一两个新文档过来,会存储在 in-memory buffer 内存缓存区中,顺便会记录 Translog。

这然后 数据还没到 segment ,是搜只有你这俩新文档的。数据只有被 refresh 后,并能并能被搜索到。比较慢 讲下 refresh 过程

3.3.2 refresh 过程

refresh 默认 1 秒钟,执行一次上图流程。ES 是支持修改你这俩值的,通过 index.refresh_interval 设置 refresh (冲刷)间隔时间。refresh 流程大致如下:

  • in-memory buffer 中的文档写入到新的 segment 中,但 segment 是存储在文件系统的缓存中。此时文档能并能被搜索到
  • 最后清空 in-memory buffer。注意: Translog 比较慢 被清空,为了将 segment 数据写到磁盘

文档经过 refresh 后, segment 暂时写到文件系统缓存,另一两个出理 了性能 IO 操作,又能并能使文档搜索到。refresh 默认 1 秒执行一次,性能损耗比较慢 来这麼多。一般建议稍微延长你这俩 refresh 时间间隔,比如 5 s。你这俩你这俩,ES 虽然你这俩你这俩准实时,达只有真正的实时。

3.3.3 flush 过程

上个过程中 segment 在文件系统缓存中,会有意外故障文档丢失。比较慢 ,为了保证文档无需丢失,时要将文档写入磁盘。比较慢 文档从文件缓存写入磁盘的过程你这俩你这俩 flush。写入次怕后,清空 translog。

translog 作用很大:

  • 保证文件缓存中的文档不丢失
  • 系统重启时,从 translog 中恢复
  • 新的 segment 收录到 commit point 中

具体能并能看官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.3/indices-flush.html

3.3.4 merge 过程

后面 几块步骤,可见 segment 会比较慢 来这麼多,比较慢 搜索会比较慢 慢?为什么会么会出理 呢?

通过 merge 过程出理 :

  • 你这俩你这俩各个小段文件,合并成一两个大段文件。段合并过程
  • 段合并结束了了,旧的小段文件会被删除
  • .liv 文件维护的删除文档,会通过你这俩过程进行清除

如你这俩图,ES 写入原理比较慢,记住关键点即可。

write -> refresh -> flush

  • write:文档数据到内存缓存,并存到 translog
  • refresh:内存缓存中的文档数据,到文件缓存中的 segment 。此时能并能被搜到
  • flush 是缓存中的 segment 文档数据写入到磁盘

写入的原理谁能告诉我们都都 ,考虑的点你这俩你这俩:性能、数据不丢失等等

(完)

参考资料:

Java微服务资料,加我微w信x:bysocket01 (加的人,一般很帅)

  • 《深入理解 Elasticsearch》
  • https://lucene.apache.org/core/8_2_0/core/org/apache/lucene/codecs/lucene1000/package-summary.html#package.description
  • https://www.jianshu.com/p/e8226138485d