当前位置: 首页 > news >正文

大数据-180 Elasticsearch - 原理剖析 索引写入与近实时搜索

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(已更完)
  • Flink(已更完)
  • ClickHouse(已更完)
  • Kudu(已更完)
  • Druid(已更完)
  • Kylin(已更完)
  • Elasticsearch(正在更新…)

章节内容

上节我们完成了如下的内容:

  • Elasticsearch 倒排索引
  • Elasticsearch 读写流程

在这里插入图片描述

索引文档写入和近实时搜索原理

基本概念

Segments in Lucene

众所周知,Elasticsearch存储的基本单元是Shard,ES中的一个Index可能分为多个Shard,事实上每个Shard都是一个Lucence的Index,并且每个LucenceIndex由多个Segment组成,每个Segment事实上是一些倒排索引的集合,每次创建一个新的Document,都会归属于一个新的Segment,而不会去修改原来的Segment。且每次的文档删除操作,会仅仅标记Segment中该文档为删除状态,而不会真正的立马物理删除,所以说ES的index可以理解为一个抽象的概念。就像下图所示:
在这里插入图片描述

Translog-Hbase WAL(Write Ahead Log)

Write Ahead Log 预写入日志
新文档被索引意味着文档会被首先写入内存buffer和translog文件,每个shard都对应一个translog文件

在这里插入图片描述

Refresh In Elasticsearch

在Elasticsearch中,_refresh操作默认每秒执行一次,意味着将内存buffer的数据写入到一个新的Segment中,这个时候索引变成了可检索的,写入新Segment后会清空内存buffer。
在这里插入图片描述

Flush In Elasticsearch

Flush 操作意味着将内存buffer的数据全部写入到新的Segment中,并将内存中所有Segments全部刷盘,并且清空translog日志的过程。
在这里插入图片描述

近实时搜索

基本流程

Elasticsearch写入流程,当一个写请求到达Elasticsearch后,ES将数据写入MemoryBuffer中,并添加事务日志(translog)。如果每次一条数据写入内存后立即写到硬盘上,由于写入的数据肯定是离散的,因此写入磁盘的操作也就是随机写入了。硬盘随机写入的效率相当低,会严重降低ES的性能。
因此ES在设计时在MemoryBuffer和硬盘之间加入了高速缓存(FileSystemCache)来提高ES的写效率。
当写请求发送到ES后,ES将数据写入MemoryBuffer中,此时写入的数据还不能查询到。默认设置下,ES每1秒钟将MemoryBuffer中的数据Refresh到Linux的FileSystemCache,并清空MemoryBuffer,此时写入的数据就可以被查询到了。
在这里插入图片描述

Refresh API

在Elasticsearch中,写入和打开一个新段的轻量的过程叫做Refresh,默认情况下每个分片会每秒自动刷新一次。这就是为什么我们说Elasticsearch是“近”实时搜索:文档的变化并不是立即对搜索可见,但会在一秒之内变成可见。
这些行为可能会对新用户操作困惑,他们索引了一个文档然后尝试搜索它,但却没有搜索到。这个问题的解决方法是用 Refresh API 执行一次手动刷新:

POST /_refreshPOST /my_blogs/_refreshPOST /my_blogs/_doc/1?refresh
{"xxx": "xxx"}PUT /test/_doc/2?refresh=true
{"xxx": "xxx"}
  • 刷新(Refresh)所有的索引
  • 只刷新(Refresh)blogs 索引
  • 只刷新文档

并不是所有的情况都需要每秒刷新,可能你正在使用Elasticsearch索引大量的文件,你可能想优化索引速度而不是近实时搜索,可以通过设置 refrsh_interval,降低每个索引的刷新频率。

PUT /my_logs
{"settings": {"refresh_interval": "30s"}
}

refresh_interval可以在既存索引上动态更新,在生产环境中,当你正在建立一个大的索引时,可以先关比自动刷新,待开始使用该索引时,再把他们调回来。

PUT /my_logs/_settings
{"refresh_interval": -1
}PUT /my_logs/_settings
{"refresh_interval": "1s"
}

持久化变更

基本流程

持久化变更flush
即使通过每秒刷新(Refresh)实现了近实时搜索,仍然要经常进行完整提交来确保从失败中恢复。但在两次提交之间发生变化的文档怎么办?我们也不希望丢掉这些数据。
Elasticsearch增加了一个Translog,叫做事务日志,在每一次对Elasticsearch操作时都会进行日志记录,通过translog,整个流程是下面这个样子:

第一步:一个文档被索引之后,就会被添加到内存缓冲区中,并且追加到了translog,如下图描述一样:
新的文档被添加到内存缓冲区并且追加到了事务日志:
在这里插入图片描述
第二步:刷新(refresh)使分片处于下图描述的状态,分片每秒刷新(refresh)一次:

  • 这些内存缓冲区的文档被写入到一个新的段中,且没有进行fsync操作
  • 这个段被打开,使其可被搜索。
  • 内存缓存区被清空

刷新(refresh)完成后,缓存被清空但是事务日志不会。

在这里插入图片描述
第三步:这个进程继续工作,更多的文档被添加到内存缓冲区和追加到事务日志,事务日志不断积累文档:
在这里插入图片描述
每隔一段时间:列如translog 变得越来越大,索引被刷新(flush),一个新的translog被创建,并且一个全量提交被执行。

  • 所有在内存缓冲区的文档都被写入一个新的段(Segment)
  • 缓冲区被清空
  • 一个提交点被写入硬盘
  • 文件系统缓存通过fsync被刷新(flush)
  • 老的translog被删除

translog提供所有还没有被刷到磁盘的操作的一个持久化记录,当Elasticsearch启动的时候,它会从磁盘中使用最后一个提交点去恢复已经得段,并且会重放translog中所有在最后一次提交后发生的变更操作。
translog也被用来提供实时CRUD,当你试着通过ID查询、解析、删除一个文档,它会在尝试从相应的段中检索之前,首先检查translog任何最近的变更。这意味着它总是能够实时的获取到文档的最新版本。在刷新(flush)之后,段被全量提交,并且事务日志被清空。

在这里插入图片描述

flush API

这个执行一个提交并且截断translog的行为在Elasticsearch被称作一次flush,分片每30分钟被自动刷新(flush),或者在translog太大(512M)的时候也会刷新。
flush API可以被用来执行一个手工的刷新(flush):

POST /blogs/_flushPOST /_flush?wait_for_ongoin
  • 刷新(flush)blogs索引
  • 刷新(flush)所有的索引并且等待所有刷新在返回前完成,我们很少需要自己手动执行一个flush操作,通常情况下,自动刷新就够了。

这就是说,在重启节点或者关闭之前执行flush有益于你的索引,当Elasticsearch尝试恢复或重新打开一个索引的时候,它需要重放translog中所有的操作,所以如果日志越短,恢复的会越快。

Translog安全问题

Translog有多安全?
Translog的目的是保证操作不会丢失,但是却引出了对应的问题:
在文件被fsync到磁盘前,被写入的文件在重启之后就会丢失。这个过程在主分片和复制分片都会发生。最终,基本上,这意味着在整个请求被fsync到主分片和复制分片的translog之前,你的客户端不会得到一个200的OK响应,在每次写请求后执行一个fsync会带来性能上的损失,尽管实践表明这个损失并不大(特别是bluk导入,在一次请求时平摊了大量的文档开销)
但是对于一些大容量的偶尔丢失几秒数据问题并不眼中的集群,使用异步的fsync还是比较有益的。比如,写入的数据被缓存到内存中,再每5秒执行一次fsync。
这个行为可以通过设置durability参数为async来启动。

PUT /my_index/x_settings
{"index.translog.durability": "async","index.translog.sync_interval": "5s"
}

这个选项可以针对索引单独设置,并且可以动态修改,如果你决定使用异步translog的话,你需要保证在发生crash时,丢失掉sync_interval时间段的数据也无所谓。请在决定前知晓这个特性。
如果你不确定这个行为的后果,最好使用默认参数:“index.translog.durability”: “request” 来避免数据丢失。

相关文章:

大数据-180 Elasticsearch - 原理剖析 索引写入与近实时搜索

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...

大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...

【Java后端】之 ThreadLocal 详解

想象一下,你有一个工具箱,里面放着各种工具。在多人共用这个工具箱的时候,很容易出现混乱,比如有人拿走了你的锤子,或者你找不到合适的螺丝刀。为了避免这种情况,最好的办法就是每个人都有自己独立的工具箱…...

2.链表(代码随想录——python版本)

2.链表(代码随想录——python版本) 链表的概念: 链表是由指针串联在一起的线性结构,一个节点(node)由两部分组成: 数据域——用来存储数据;指针域——用来指向下一个节点&#xf…...

6个解决“由于找不到vcruntime140_1.dll无法继续执行代码”问题的方法

vcruntime140_1.dll丢失的问题在Windows操作系统中相对常见,它通常与Microsoft Visual C Redistributable有关。本文将详细解读vcruntime140_1.dll丢失的原因、解决方法以及预防措施,帮助用户更好地应对这一问题。 一,vcruntime140_1.dll文件…...

常用数据库获取表,视图,列,索引信息

一、分页获取数据库用户的所有表 (1)、Oracle,OceanBase(Oracle内核版),DM 使用ALL_TABLES,需要添加当前用户作为查询条件 select a3.* from (select a2.* from (select a1.*, rownum rn1 from ( select t1.table_name, t2.comments fro…...

架构设计笔记-16-嵌入式系统架构设计理论与实践

目录 知识要点 嵌入式微处理器 存储器(memory) 内(外)总线逻辑 嵌入式操作系统(Embedded Operating System,EOS) 通用中间件 嵌入式中间件的一般架构 典型嵌入式中间件系统 案例分析 1…...

SpringSecurity使用介绍

1、SpringSecurity 1.1 SpringSecurity简介 Spring Security是基于Spring的安全框架,提供了包含认证和授权的落地方案;Spring Security底层充分利用了Spring IOC和AOP功能,为企业应用系统提供了声明式安全访问控制解决方案;SpringSecurity可…...

# Js 回调函数

Js 回调函数 文章目录 Js 回调函数回调函数的定义和使用回调函数的常见用途异步操作事件处理 回调函数的优点和缺点优点缺点 回调地狱解决回调地狱的方法使用 Promise使用 async/await 应用函数式编程中的回调函数高阶函数函数柯里化 异步编程中的回调函数回调函数的错误处理传…...

COOLSHELL文章:从Code Review 谈如何做技术【阅读笔记】

从Code Review 谈如何做技术原文链接:https://coolshell.cn/articles/11432.html#google_vignette 工程师需要有责任心和修养,不是做出来就了事,而是要做漂亮。 这也是山寨和工业的区别,只以做出来为标准是劳动密集型的装配生产线…...

3.1.1 ReactOS系统中二叉树创建一个MEMORY_AREA节点

二叉树中创建一个MEMORY_AREA节点: 二叉树中创建一个MEMORY_AREA节点: MmCreateMemoryArea() 参数AddressSpace是MADDRESS SPACE结构指针,所指向的数据结构代表着一个进程的用 户空间。 参数BaseAddress是个指针,用来给定和返回内…...

三、Linux 安装全攻略

Linux 安装全攻略 在当今的科技时代,Linux 操作系统以其稳定性、安全性和高度的可定制性而备受青睐。本文将详细介绍 Linux 的安装过程,包括关键步骤和下载资源获取方式,帮助你顺利踏上 Linux 之旅。 一、为什么选择 Linux Linux 有许多优…...

Ansible自动化工具

一、Ansible概述 1.1 什么是Ansible Ansible 是一个开源的自动化工具,用于配置管理、应用程序部署和任务自动化。它让你可以通过编写简单的 YAML 文件(剧本,Playbooks),轻松管理和配置多个服务器。Ansible 的特点是无…...

Flutter Container组件

Over the past few years, I’ve been fortunate to collaborate with interior designers, and there’s a distinct flair to their approach to crafting captivating interiors. It’s not just about arranging furniture randomly; they meticulously plan layouts, sele…...

IPv6 DNS简介

IPv6网络中的每台主机都是由IPv6地址来标识的,用户只有获得待访问主机的IPv6地址,才能够成功实现访问操作。对于用户来讲,记住主机的IPv6地址是相当困难的,因此设计了一种字符串形式的主机命名机制,这就是域名系统。用…...

【Python-AI篇】数据结构和算法

1. 算法概念 1.1 什么是数据结构 存储,组织数据的方式 1.2 什么是算法 实现业务目的的各种方法和思路算法是独立的存在,只是思想,不依附于代码和程序,可以使用不同语言实现(java,python,c&a…...

VideoCLIP-XL:推进视频CLIP模型对长描述的理解

摘要 对比语言-图像预训练(CLIP)已被广泛研究并应用于众多领域。然而,预训练过程中对简短摘要文本的重视阻碍了CLIP理解长描述的能力。在视频方面,这个问题尤为严重,因为视频通常包含大量详细内容。在本文中&#xff…...

【vue】vue-router_ vue3路由管理器

代码获取 vue-router_ vue3路由管理器 ⼀、基本介绍 1. 单⻚应⽤程序介绍 1.1 概念 单⻚应⽤程序:SPA(Single Page Application)是指所有的功能都在⼀个HTML⻚⾯上实现 1.2 具体⽰例 单⻚应⽤⽹站: ⽹易云⾳乐 https://music.163.com/ 多⻚应⽤⽹…...

昇思MindSpore进阶教程--Diffusion扩散模型(上)

大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧 正文 关于扩散模型(Diffusi…...

Nginx:proxy_pass指令

proxy_pass 指令在 Nginx 中是实现反向代理和负载均衡的重要指令。 一. 反向代理 在反向代理的场景下,proxy_pass 指令用于将接收到的请求转发给另一个后端服务器。后端服务器地址可以是 IP 地址加端口、域名加端口、或者一个完整的 URL。 注意事项 proxy_pass …...

Linux Ext 调度器核心原理:BPF 驱动的自定义调度革命

简介 Linux 内核调度器自诞生以来,始终以通用公平调度(CFS)与硬实时调度(SCHED_DEADLINE/SCHED_FIFO)为核心,支撑服务器、桌面、嵌入式等全场景负载。但传统调度框架存在硬耦合、难扩展、定制成本极高的痛…...

【NotebookLM文献综述加速器】:20年科研老兵亲测的5步高效综述法,3天完成导师认可的高质量综述?

更多请点击: https://intelliparadigm.com 第一章:NotebookLM文献综述辅助的底层逻辑与科研适配性 NotebookLM 由 Google Research 推出,其核心并非通用大语言模型问答,而是以用户上传的私有文档(PDF、TXT 等&#xf…...

【亲测免费】 探索RS485通信的利器:开源项目推荐

探索RS485通信的利器:开源项目推荐 【下载地址】RS485通信程序 本仓库提供了一个完整的RS485通信程序,经过本人亲自测试,程序注释详细,非常适合作为学习和开发的参考例程。无论你是初学者还是有经验的开发者,这个资源都…...

告别双系统!用WSL2+Ubuntu20.04+ROS Noetic玩转AirSim仿真(保姆级避坑指南)

告别双系统!用WSL2Ubuntu20.04ROS Noetic玩转AirSim仿真(保姆级避坑指南) 在机器人开发与自动驾驶仿真领域,AirSim与ROS的结合堪称黄金搭档——前者提供高保真物理引擎与视觉渲染,后者则是机器人算法开发的行业标准。…...

避坑指南:Tina Linux下MIPI DSI与LVDS屏调试的那些‘坑’(以V853/D1s为例)

Tina Linux下MIPI DSI与LVDS屏调试实战避坑指南(V853/D1s开发板为例) 1. 高速差分接口调试的"死亡陷阱" 当V853开发板首次连接那块7英寸MIPI屏时,我遭遇了职业生涯最诡异的显示故障——屏幕上半部正常显示,下半部却呈现…...

Adafruit Metro ESP32-S3开发板深度评测:从硬件解析到低功耗物联网实践

1. 项目概述:为什么选择Metro ESP32-S3作为你的下一个开发平台?如果你正在寻找一块既能快速原型开发,又能直接用于产品部署,同时兼顾了强大无线连接、丰富生态和极低功耗的开发板,那么Adafruit Metro ESP32-S3绝对是一…...

2026年Java面试,不会背这些八股文真不行

Java 面试 Java 作为编程语言中的 NO.1,选择入行做 IT 做编程开发的人,基本都把它作为首选语言,进大厂拿高薪也是大多数小伙伴们的梦想。以前 Java 岗位人才的空缺,而需求量又大,所以这种人才供不应求的现状,就是 Java 工程师的薪…...

【NotebookLM新闻传播研究权威指南】:20年传媒技术专家亲授AI驱动的新闻生产新范式

更多请点击: https://kaifayun.com 第一章:NotebookLM新闻传播研究导论 NotebookLM 是 Google 推出的基于大型语言模型的实验性研究助手,专为信息整合、溯源验证与知识重构设计。其核心能力在于对用户上传的文档(PDF、TXT、网页…...

切削液防锈成分消耗机理、三类防锈剂参数与补加管控实测

一、防锈成分消耗核心机理物理消耗:工件表面携带(占比 35%)、切屑比表面积吸附(占比 40%);化学消耗:金属界面化学吸附(15%)、高温裂解(5%)、细菌降…...

多变量分数阶系统的频域分析与设计【附程序】

✨ 长期致力于多变量系统、频率域、分数阶PID控制、鲁棒控制、参数拟合、参数优化、工具箱、框图法研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基…...