前言

最近 TL 分享了下 《Elasticsearch基础整理》

一、Elasticsearch & Lucene 是什么

什么是 Elasticsearch ?

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

那 Lucene 是什么?

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

Elasticsearch 不仅仅是 Lucene 和全文搜索,我们还能这样去描述它:分布式的实时文件存储,每个字段都被索引并可被搜索

分布式的实时分析搜索引擎

可以扩展到上百台服务器,处理 PB 级结构化或非结构化数据

二、Elasticsearch & Lucene 的关系

就像很多业务系统是基于 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 中

3.3.4 merge 过程

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

通过 merge 过程解决:就是各个小段文件,合并成一个大段文件。段合并过程

段合并结束,旧的小段文件会被删除

.liv 文件维护的删除文档,会通过这个过程进行清除

四、小结

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

write -> refresh -> flushwrite:文档数据到内存缓存,并存到 translog

refresh:内存缓存中的文档数据,到文件缓存中的 segment 。此时可以被搜到

flush 是缓存中的 segment 文档数据写入到磁盘

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

(完)

参考资料:

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

apache的es的原理_Elasticsearch Lucene 数据写入原理 | ES 核心篇相关推荐

  1. 面试3连炮:聊聊ES写入数据的原理?查询数据的原理?倒排索引了解吗?

    面试题 es 写入数据的工作原理是什么啊? es 查询数据的工作原理是什么啊? 底层的 lucene 介绍一下呗? 倒排索引了解吗? 面试问这个,其实面试官就是要看看你了解不了解 es 的一些基本原理 ...

  2. Apache Flink 读取本地文件,处理数据,导入ES

    需求 本地有一份文件 使用Flink读取本地数据源 处理数据,导入ES中 提交Flink作业 环境 Flink :1.8.2 Elasticsearch:6.2.3 JDK:1.8 pom.xml & ...

  3. 大数据全样而非抽样原理_大数据思维原理,你了解多少?

    原标题:大数据思维原理,你了解多少? 随着大数据的深入人心,很多大数据技术的专家.战略专家.未来学学者等开始提出.解读并丰富大数据思维概念的内涵和外延.总体来说,大数据思维包括全样思维.容错思维和相关 ...

  4. Elasticsearch 数据写入原理

    我的个人博客:逐步前行STEP 1.elasticsearch 如何使文档可以被搜索 为了支持全文检索而采用倒排索引,倒排索引包含一个有序列表,列表包含所有文档出现过的词项 ,对于每一个词项,包含了它 ...

  5. sqoop关系型数据迁移原理以及map端内存为何不会爆掉窥探

    序:map客户端使用jdbc向数据库发送查询语句,将会拿到所有数据到map的客户端,安装jdbc的原理,数据全部缓存在内存中,但是内存没有出现爆掉情况,这是因为1.3以后,对jdbc进行了优化,改进j ...

  6. influxdb 插入数据_Influxdb 数据写入流程

    数据写入流程分析 本篇不涉及存储层的写入,只分析写入请求的处理流程 Influxdb名词介绍 如果想搞清楚Influxdb数据写入流程,Influxdb本身的用法和其一些主要的专用词还是要明白是什么意 ...

  7. apache的es的原理_Elasticsearch的原理简介

    简介 ES是一个基于RESTful web接口并且构建在Apache Lucene之上的开源分布式搜索引擎. 同时ES还是一个分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索,能 ...

  8. Apache Iceberg核心原理分析文件存储及数据写入流程

    点击上方蓝色字体,选择"设为星标" 回复"面试"获取更多惊喜 全网最全大数据面试提升手册! 第一部分:Iceberg文件存储格式 Apache Iceberg作 ...

  9. elasticsearch原理_ElasticSearch读写底层原理及性能调优

    ES写入/查询底层原理 1. Elasticsearch写入数据流程 客户端随机选择一个ES集群中的节点,发送POST/PUT请求,被选择的节点为协调节点(coordinating node) 协调节 ...

  10. es 查询语法_ES 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?

    点击上方☝SpringForAll社区 轻松关注! 及时获取有趣有料的技术文章 本文来源:http://8rr.co/GFLb 面试官心理分析 这个问题是肯定要问的,说白了,就是看你有没有实际干过 e ...

最新文章

  1. 122网络各层中的设备是什么以及工作原理
  2. intitle:客服机器人代码_游戏客服能影响企业发展?千万别大意
  3. ansys怎么建立弯曲圆柱_螺栓连接模型的建立方法解析
  4. My安卓知识5--百度地图api的使用,周边信息检索
  5. IS-IS详解(六)——IS-IS LSP机制详解
  6. c语言科学计数法 10的负8次方,3*10的负8次方等于多少?为什么计算
  7. java实习第一天日志
  8. 检验入参合法性有哪些_参数检验和非参数检验是什么意思
  9. Java给pdf添加页码(这是我之前的一篇文章)出现内存溢出Java heap space
  10. 交通安全管理毕业论文范文
  11. 陈强教授《机器学习及R应用》课程 第九章作业
  12. 关于sessions.ser文件的一些思考
  13. Java类之间的关联关系
  14. Vim - 官方网站
  15. 电脑中毒所有的exe打不开杀毒软件及win10再带病毒防护无法打开
  16. C++版本OpenCv教程(二十七)图像中添加高斯噪声
  17. 深入剖析斐波拉契数列
  18. C语言运算符号优先级
  19. 计算机校本培训措施,如何高效开展教师计算机、网络技术校本培训.doc
  20. .NET 20周年专访 - 张善友:.NET 技术是如何赋能并改变世界的

热门文章

  1. CSS-样式表插入的三种方法、背景(background)、文本
  2. 62.Linux/Unix 系统编程手册(下) -- 终端
  3. 20.大型网站典型故障分析
  4. 21. Upgrade-Insecure-Requests: 1
  5. java 16进制Util转换类
  6. 洛谷P3958 奶酪
  7. NPOI SetColumnHidden隐藏列不起作用的原因
  8. 系列文章--WF学习资料汇总
  9. 微信小程序——通过百度API查询天气情况
  10. Javascript中的!-- //--