文档章节

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

泥瓦匠BYSocket
 泥瓦匠BYSocket
发布于 08/15 16:49
字数 1497
阅读 1219
收藏 20

前言

最近 TL 分享了下 《Elasticsearch基础整理》https://www.jianshu.com/p/e8226138485d ,蹭着这个机会。写个小文巩固下,本文主要讲 ES -> Lucene 的底层结构,然后详细描述新数据写入 ES 和 Lucene 的流程和原理。这是基础理论知识,整理了一下,希望能对 Elasticsearch 感兴趣的同学有所帮助。

一、Elasticsearch & Lucene 是什么

es

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

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

Elasticsearch 不仅仅是 Lucene 和全文搜索,我们还能这样去描述它:

  • 分布式的实时文件存储,每个字段都被索引并可被搜索
  • 分布式的实时分析搜索引擎
  • 可以扩展到上百台服务器,处理 PB 级结构化或非结构化数据

二、Elasticsearch & Lucene 的关系

file

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

在应用开发中,用 Elasticsearch 会很简单。但是如果你直接用 Lucene,会有大量的集成工作。

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

三、新文档写入流程

3.1 数据模型

file

如图

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

3.2 Lucene Index

file

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 过程

file

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

这时候数据还没到 segment ,是搜不到这个新文档的。数据只有被 refresh 后,才可以被搜索到。那么 讲下 refresh 过程

3.3.2 refresh 过程

file

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 过程

file

上个过程中 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 过程

file

file

上面几个步骤,可见 segment 会越来越多,那么搜索会越来越慢?怎么处理呢?

通过 merge 过程解决:

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

四、小结

file

如这个图,ES 写入原理不难,记住关键点即可。

write -> refresh -> flush

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

写入的原理告诉我们,考虑的点很多:性能、数据不丢失等等

(完)

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

© 著作权归作者所有

泥瓦匠BYSocket

泥瓦匠BYSocket

粉丝 951
博文 171
码字总数 226430
作品 4
杭州
程序员
私信 提问
Elastic Search原理简述

一、Elastic Search概述: 1.1 Elastic Search 简介 Elastic Search(ES)是一个基于Lucene构建的开源、分布式、RESTFul接口全文搜索引擎。ES还是一个分布式文档库,其中每个字段均是被索引的...

zhglance
02/25
0
0
Elasticsearch学习四

大纲 1、lucene和elasticsearch的前世今生 2、elasticsearch的核心概念 3、elasticsearch核心概念 vs. 数据库核心概念 ------------------------------------------------------------------......

东风破2019
09/08
15
0
Elasticsearch中数据是如何存储的

前言 很多使用Elasticsearch的同学会关心数据存储在ES中的存储容量,会有这样的疑问:xxTB的数据入到ES会使用多少存储空间。这个问题其实很难直接回答的,只有数据写入ES后,才能观察到实际的...

浮躁的码农
03/06
170
1
快速掌握分布式搜索引擎ElasticSearch(一)

前言 由于最近在项目中接触使用到了ElasticSearch,从本篇博客开始将给大家分享这款风靡全球的产品。将涉及到ElasticSearch的安装、基础概念、基本用法、高级查询、中文分词器、与SpringBoo...

张丰哲
2018/11/10
0
0
当ES赶超Redis,这份ES进修攻略不容错过!

从4月DB-Engines最新发布的全球数据库排名中,我们赫然发现ElasticSearch逆袭超越了Redis,从原先的第9名上升至第8名,而Redis则落后一名,排在了其后。 事实上,这场逆袭并不算太让人意外。...

DBAplus社群
2018/04/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mac下redis安装、设置、启动停止

常用命令说明 redis服务器:redis-server redis客户端:redis-cli redis性能测试工具:redis-benchmark AOF文件修复工具:redis-check-aof RDB文件修复工具:redis-check-rd redis设置临时密...

botkenni
2分钟前
0
0
好程序员web前端分享HTML5常见面试题集锦四

好程序员web前端分享HTML5常见面试题集锦四 1、为什么要初始化CSS样式? 答案:因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面...

好程序员官方
3分钟前
0
0
CDN的网络架构是什么?

CDN网络架构主要由两大部分,分为中心和边缘两部分,中心指CDN网管中心和DNS重定向解析中心,负责全局负载均衡,设备系统安装在管理中心机房,边缘主要指异地节点,CDN分发的载体,主要由Cac...

云漫网络Ruan
3分钟前
1
0
pandas入门07---可视化

01 入门 制作提供信息的可视化是数据分析的重要任务之一。首先介绍一下matplotlib库。 import matplotlib.pyplot as pltimport numpy as npdata = np.arange(10)print(data)plt.plot(da...

筠初
5分钟前
1
0
201_PyTorch中文教程:Torch与Numpy互操作

201_PyTorch中文教程:Torch与Numpy互操作 更多参考: https://morvanzhou.github.io/tutorials/ 油管频道:https://www.youtube.com/user/MorvanZhou 依赖软件包: torch numpy Torch的更多数......

openthings
5分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部