分布式全文检索引擎ElasticSearch-数据的写入存储底层原理
一、数据写入的核心流程
当向 ES 索引写入数据时,整体流程如下:
1、客户端发送写入请求
客户端向 ES 集群的任意节点(称为协调节点,Coordinating Node)发送一个写入请求,比如 index
(插入或更新)或 delete
(删除)请求。
2、协调节点处理请求
- 协调节点接收到请求后,确定数据应该存储在哪个索引和分片上。
- 通过路由计算确定目标分片,默认的路由规则是通过文档的
_id
取哈希值,再对分片数取模来定位分片。
shard = hash(_id) % number_of_primary_shards
3、请求转发给主分片
协调节点将请求转发给对应的 主分片(Primary Shard)所在的节点,主分片负责执行写入操作。
4、主分片写入阶段
主分片接收到写入请求后,执行以下操作:
- 写入内存缓冲区(Buffer):首先将数据写入到内存中的写入缓冲区,这是一块内存区域,用于快速接收新数据。
- 写入事务日志(Translog):同时,将数据写入事务日志(Translog)。Translog 是一个顺序写入的日志文件,用于在节点宕机时进行数据恢复,确保数据不会丢失。
5、数据刷新到段(Segment)
- 定期刷新(Flush):每隔一定时间(默认是 1 秒)或当缓冲区达到一定大小时,ES 会将内存缓冲区中的数据刷新到段(Segment)中。段是倒排索引的基本存储单元。
- 生成新的段文件:数据被写入段后,段文件会被写入磁盘,段文件一旦生成便是不可更改的(只读的)。
- 清空缓冲区:刷新后,内存缓冲区被清空,但 Translog 依然保留,直到执行
flush
操作。
6、同步到副本分片
- 主分片写入成功后,将请求转发给对应的 副本分片(Replica Shard) 所在的节点。
- 副本分片执行与主分片相同的写入操作,确保主副本数据一致。
- 当所有副本分片写入成功后,主分片向协调节点返回写入成功的确认。
7、返回写入结果给客户端
协调节点收到主分片和副本分片的成功确认后,向客户端返回写入成功的响应。
二、核心组件介绍
1、内存缓冲区(Buffer)
- 作用:用于临时存储写入的数据,提高写入性能。
- 刷新机制:每隔一段时间(默认 1 秒)或当缓冲区满时,数据会被刷新到段(Segment)。
2、事务日志(Translog)
- 作用:用于记录所有未持久化到段的数据,防止数据丢失。
- 持久化:写入操作在返回成功之前,必须确保数据被写入 Translog。
- Flush 操作:定期将数据从缓冲区刷新到段,并清空 Translog,生成新的空的 Translog。
3、段(Segment)
下一节将详细讲
4、主分片与副本分片
- 主分片(Primary Shard):负责处理写入和查询请求。
- 副本分片(Replica Shard):主分片的冗余副本,用于提高数据可用性和查询性能。
- 一致性:写入时,主分片和副本分片保持数据一致,确保容错能力。
三、段的深度剖析
什么是段
段(Segment) 是倒排索引的基本存储单元。每当数据被写入或更新时,ES 并不会立即将其合并到现有的数据结构中,而是将数据写入新的段。段存储在磁盘上,并以不可变的形式存在。这种设计有助于提升写入和查询的性能,同时简化了数据管理。
段 是一种包含索引数据的小型文件集合,每个段都包含:
- 倒排索引(Inverted Index):用于快速搜索文档的内容。
- 文档元数据(如 _id、分数等)。
- 存储字段(Stored Fields):用于存储完整的文档内容或字段值。
- 删除标记(Deletion Markers):标记哪些文档被逻辑删除。
什么时候生成段?
当 ES 将数据从内存缓冲区刷新(Refresh)到磁盘时,就会创建新的段。这些段会持续累积,直到 ES 触发合并(Merge)操作,将多个小段合并成更大的段。
为什么使用段
-
高效写入
- ES 将数据先写入内存缓冲区,然后批量刷新到新的段,而不是直接修改现有的段。
- 这种批量写入减少了频繁的磁盘操作,提高了写入性能。
-
并发查询与写入
- 由于段是只读的,多个查询可以并发访问这些段,而不会影响写入操作。
- 新数据写入时,不会影响正在查询的旧段,保证了数据的可用性。
-
快速删除与更新
- ES 的删除和更新操作不直接修改段内的数据,而是通过逻辑标记(标记文档为删除)来实现。
- 这种方式避免了频繁的磁盘重写操作,提高了性能。
-
增量合并
- ES 通过定期将多个小段合并成大段,减少段的数量,优化查询性能。
- 合并过程是在后台异步进行的,不影响前台查询和写入。
为什么段是不可变的
-
简化并发控制
- 因为段是不可变的,多个查询可以安全地并发读取相同的段,而无需担心数据被修改或锁定。
- 不需要复杂的并发控制机制,简化了系统设计。
-
提高查询性能
- 由于段不变,ES 可以预先构建和优化倒排索引,确保查询时能够快速检索数据。
- 不可变的段使得查询操作可以直接访问磁盘数据,无需等待写入操作完成。
-
高效的删除和更新
- 删除和更新不会直接修改段内的数据,而是通过生成新的段和标记旧段来完成。
- 这种方式避免了频繁的随机写入,提高了磁盘写入性能。
-
崩溃恢复与数据安全
- 不可变的段一旦写入磁盘,就不会被更改。这意味着即使 ES 崩溃,已写入的段不会丢失或损坏。
- 恢复时,只需要重新应用事务日志(Translog)中尚未刷新的数据。
四、为什么说ES的检索是近实时的
如果ES像MySQL一样,等到数据真正落盘完毕,才返回写入成功,这叫直接写入方式,这能达到实时搜索。但是这会有什么样的问题呢?
直接写入存在的问题
提交一个新的段到磁盘需要 fsync操作,确保段被物理地写入磁盘,即时电源失效也不会丢失数据。
但是 fsync 是昂贵的,严重影响性能,当写数据量大的时候会造成ES 停顿卡死,查询也无法做到快速响应新文档在几分钟之内即可被检索,并且这样还是不够快,磁盘在这里成为了瓶颈。
延时写策略
所以 fsync不能在每个文档被索引的时就触发,需要一种更轻量级的方式使新的文档可以被搜索,所以为了提升写的性能,ES没有每新增一条数据就增加一个段到磁盘上而是采用延时写的策略。
具体做法如下:
每当有新增的数据时,就将其先写入到内存中
在内存和磁盘之间是文件系统缓存,当达到默认的时间(1秒钟)或者内存的数据达到一定量时,会触发一次刷新(Refresh),将内存中的数据生成到一个新的段上并缓存到文件缓存系统上,稍后再被刷新到磁盘中并生成提交点。
相关文章:
分布式全文检索引擎ElasticSearch-数据的写入存储底层原理
一、数据写入的核心流程 当向 ES 索引写入数据时,整体流程如下: 1、客户端发送写入请求 客户端向 ES 集群的任意节点(称为协调节点,Coordinating Node)发送一个写入请求,比如 index(插入或更…...
mfc140u.dll是什么文件?如何解决mfc140u.dll丢失的相关问题
遇到“mfc140u.dll文件丢失”的错误通常影响应用程序的运行,这个问题主要出现在使用Microsoft Visual C环境开发的软件中。mfc140u.dll是一个重要的系统文件,如果它丢失或损坏,会导致相关程序无法启动。本文将简要介绍几种快速有效的方法来恢…...
ChatGPT生成接口测试用例(一)
用ChatGPT做软件测试 接口测试在软件开发生命周期中扮演着至关重要的角色,有助于验证不同模块之间的交互是否正确。若协议消息被恶意修改,系统是否能够恰当处理,以确保系统的功能正常运行,不会出现宕机或者安全问题。 5.1 ChatGP…...
Jenkins 中 写 shell 命令执行失败,检测失败问题
由于项目的 依赖复杂,随着版本的增多,人工操作,手误几率太大,我们选取kenins 来自动化发布、更新。 这里主要解决,发布 的 每个阶段,确保每个阶段执行成功。 比如: js 运行,…...
Dot Foods EDI 需求分析及对接流程
Dot Foods 是一家美国领先的食品和非食品产品的中间批发分销商,主要为食品服务、零售和分销行业的客户提供服务,是北美大型食品中间分销商之一。Dot Foods (以下简称 Dot)的业务模式是通过整合多个供应商的产品,为客户…...
数据特性库 前言
文章目录 一、num-traits库简介二、核心功能三、更新功能四、使用方式五、应用示例六、结论 一、num-traits库简介 num-traits是Rust编程语言中的一个开源库,专注于为数值类型提供一系列的数学运算特性和接口。它支持泛型数学计算,允许开发者在不指定具…...
项目授权无法正常操作的解决方法
概述 在非saas环境的项目中,授权页面的接口不需要token,但是在某些时候会导致页面无法正常操作,暂时用该文档中的解决方法来处理,后续会修复该问题。 现象描述 登录时报未授权跳转至该页面,有时该页面会弹出登录超时对…...
python学opencv|读取图像(十七)认识alpha通道
【1】引言 前序学习进程中,我们已经掌握了RGB和HSV图像的通道拆分和合并,获得了很多意想不到的效果,相关链接包括且不限于: python学opencv|读取图像(十二)BGR图像转HSV图像-CSDN博客 python学opencv|读…...
WSL2安装到自定义盘教程(非先安装后打包)
step1:环境配置 按照官方教程从头到尾配置一遍,直到从微软商店下载好Ubuntu20.04为止 step2:拷贝下载内容 使用微软商店下载的应用安装包会默认保存在C:\Program Files\WindowsApps目录下 在该目录下找到以CanonicalGroupLimited开头的文…...
环境变量的知识
目录 1. 环境变量的概念 2. 命令行参数 2.1 2.2 创建 code.c 文件 2.3 对比 ./code 执行和直接 code 执行 2.4 怎么可以不带 ./ 2.4.1 把我们的二进制文件拷贝到 usr/bin 路径下,也不用带 ./ 了 2.4.2 把我们自己的路径添加到环境变量里 3. 认识PATH 3.…...
【python】OpenCV—Image Moments
文章目录 1、功能描述2、图像矩3、代码实现4、效果展示5、完整代码6、涉及到的库函数cv2.moments 7、参考 1、功能描述 计算图像的矩,以质心为例 2、图像矩 什么叫图像的矩,在数字图像处理中有什么作用? - 谢博琛的回答 - 知乎 https://ww…...
优化 HTTP 接口请求:缓存策略与实现方法
前言 在前端开发中,HTTP 请求的处理是至关重要的一环。Axios 作为一个流行的 HTTP 客户端,其简洁性和灵活性使得它广受开发者青睐。然而,为了优化应用性能和提升用户体验,合理地缓存请求结果显得尤为重要。本文将深入探讨如何在 …...
图形 3.3 曲面细分与几何着色器_大规模草渲染
细分后的顶点曲面细分与几何着色器 大规模草渲染 B站视频:图形 3.3 曲面细分与几何着色器 大规模草渲染 文章目录 细分后的顶点曲面细分与几何着色器 大规模草渲染着色器执行顺序曲面细分着色器概述曲线和曲面相关概念输入与输出总体流程Hull Shader常量外壳着色器…...
shell8
until循环(条件为假的时候一直循环和while相反) i0 until [ ! $i -lt 10 ] doecho $i((i)) done分析 初始化变量: i0:将变量i初始化为0。 条件判断 (until 循环): until [ ! $i -lt 10 ]:这里的逻辑有些复杂。它使用了until循环…...
嵌入式驱动RK3566 HDMI eDP MIPI 背光 屏幕选型与调试提升篇-eDP屏
eDP是嵌入式显示端口,具有高数据传输速率,高带宽,高分辨率、高刷新率、低电压、简化接口数量等特点。现大多数笔记本电脑都是用的这种接口。整个eDP是很复杂的,这里我们不讲底层原理,我们先掌握如何用泰山派来驱动各种…...
2024年华为OD机试真题-字符串分割-C++-OD统一考试(E卷)
最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客 每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。 题目描述: 给定非空字符串…...
图书馆管理系统(三)基于jquery、ajax
任务3.4 借书还书页面 任务描述 这部分主要是制作借书还书的界面,这里我分别制作了两个网页分别用来借书和还书。此页面,也是通过获取books.txt内容然后添加到表格中,但是借还的操作没有添加到后端中去,只是一个简单的前端操作。…...
【练习Day20】字符串变形
链接:字符串变形_牛客题霸_牛客网 方法一:双逆转(推荐使用) 思路: 将单词位置的反转,那肯定前后都是逆序,不如我们先将整个字符串反转,这样是不是单词的位置也就随之反转了。但是单…...
鸿蒙项目云捐助第二十讲云捐助项目物联网IOT的使用
鸿蒙项目云捐助第二十讲云捐助项目物联网IOT的使用 在鸿蒙技术完成云捐助项目中,物联网技术也是具有一定生命力的存在。这里也会在云捐助项目中使用物联网的技术。 一、华为云IoT物联网操作 这里以华为云的Iot物联网操作来介绍华为云I ot物联网技术。 这里从百度…...
Linux设置篇
查看主机名 hostname 修改主机名 hostnamectl set-hostname 主机名 配置ip映射 vi /etc/hosts 192.168.1.10 pure 限制SSH登录的IP a) 设置禁止所有ip连接服务器的SSH vi /etc/hosts.deny sshd:all:deny b) 设置允许指定ip连接服务器的SSH(这边建议设置一个备…...
WatchAlert - 开源多数据源告警引擎
概述 在现代 IT 环境中,监控和告警是确保系统稳定性和可靠性的关键环节。然而,随着业务规模的扩大和数据源的多样化,传统的单一数据源告警系统已经无法满足复杂的需求。为了解决这一问题,我开发了一个开源的多数据源告警引擎——…...
百度面试手撕 go context channel部分学习
题目 手撕 对无序的切片查询指定数 使用context进行子协程的销毁 并且进行超时处理。 全局变量定义 var (startLoc int64(0) // --- 未处理切片数据起始位置endLoc int64(0) // --- 切片数据右边界 避免越界offset int64(0) // --- 根据切片和协程数量 在主线程 动态设…...
主流浏览器内核
1、Chromium内核 由Google主导开发,最具代表性的是Google Chrome浏览器。Chromium内核的优点包括无广告、不易崩溃、速度快、安全性高。目前,许多浏览器都采用了Chromium内核,如360极速浏览器、UC浏览器、QQ浏览器等,windows自…...
Apache Tomcat 漏洞CVE-2024-50379条件竞争文件上传漏洞 servlet readonly spring boot 修复方式
1,关于漏洞 Apache Tomcat是一个流行的开源 Web 服务器和 Java Servlet 容器。 二、 漏洞描述 Apache Tomcat中修复了个 TOCTOU 竞争条件远程代码执行漏洞 (CVE-2024-50379),该漏洞的 CVSS 评分为 9.8。Apache Tomcat 中 JSP 编译期间存在检查时间使用时…...
Java学习教程,从入门到精通,Java LinkedList(链表)语法知识点及案例代码(62)
Java LinkedList(链表)语法知识点及案例代码 一、LinkedList概述 LinkedList是Java集合框架中的一个类,位于java.util包中。它实现了List、Deque、Queue等接口,提供了链表数据结构的实现。链表是一种线性数据结构,其…...
3分钟读懂数据分析的流程是什么
数据分析是基于商业目的,有目的地进行收集、整理、加工和分析数据,提炼出有价值的 信息的一个过程。整个过程大致可分为五个阶段,具体如下图所示。 1.明确目的和思路 在开展数据分析之前,我们必须要搞清楚几个问题,比…...
【Leetcode 热题 100 - 扩展】303. 区域和检索 - 数组不可变
问题背景 给定一个整数数组 n u m s nums nums,处理以下类型的多个查询: 计算索引 l e f t left left 和 r i g h t right right(包含 l e f t left left 和 r i g h t right right)之间的 n u m s nums nums 元素的 和 &a…...
Leecode刷题C语言之同位字符串连接的最小长度
执行结果:通过 执行用时和内存消耗如下: bool check(char *s, int m) {int n strlen(s), count0[26] {0};for (int j 0; j < n; j m) {int count1[26] {0};for (int k j; k < j m; k) {count1[s[k] - a];}if (j > 0 && memcmp(count0, cou…...
API开发:Flask VS FastAPI
在当今的Web开发领域,选择合适的框架对于构建高效、稳定且易于维护的API至关重要。Flask和FastAPI是两个备受关注的Python Web框架,它们各自具有独特的特点和优势,适用于不同的开发场景。 文章目录 一、简介二、性能表现三、开发效率…...
fastAPI接口的请求与响应——基础
1. 后端接口 1.接口实现 pip install fastapi pip install uvicorn# api.py from pydantic import BaseModel from fastapi import FastAPI import uvicorn import os# 定义请求体模型 class Payload(BaseModel):key1: strkey2: str# 创建一个FastAPI应用程序实例 app Fast…...
[oeasy]python054_python有哪些关键字_keyword_list_列表_reserved_words
python有哪些关键字_keyword_list_列表_reserved_words 回忆上次内容 hello world 不是 从来就有的 来自于 c语言 print、小括号 和 双引号 也来自于 c语言 添加图片注释,不超过 140 字(可选) python 标识符 的 命名规则 依然 完全 学习…...
面试题整理2---Nginx 性能优化全方案
面试题整理2---Nginx 性能优化全方案 1. 调整工作进程数和线程数1.1 调整工作进程数1.2 调整进程的最大连接数 2. 配置Gzip压缩2.2 配置Gzip压缩 3. 配置缓存策略3.1 配置浏览器缓存时间3.2 配置代理服务器缓存时间 4. 优化文件访问方式4.1 使用sendfile()函数发送文件数据4.2 …...
15.3、陷阱技术 入侵容忍 隐私保护技术
目录 网络攻击陷阱技术与应用蜜罐主机技术陷阱网络技术三代陷阱网络网络攻击陷阱技术应用入侵容忍及系统生存技术入侵容忍及系统生存技术应用隐私保护技术网络安全的前沿技术发展动向 网络攻击陷阱技术与应用 攻击陷阱技术也叫诱骗技术,它是一种主动防御的方法&…...
PyQt6 学习记录1
简介 PyQt6 是基于 Python 的一系列模块。它是一个多平台的工具包,可以在包括 Unix、Windows 和 Mac OS 在内的大部分主要操作系统上运行。 安装 pip install PyQt6 模块 - QtCore - QtGui - QtWidgets - QtDBus - QtNetwork - QtHelp - QtXml - QtSvg - QtSql…...
ModelArts平台打卡体验活动:MindSpore2.4.0快速入门
一、环境准备 1.进入ModelArts官网 云平台帮助用户快速创建和部署模型,管理全周期AI工作流,选择下面的云平台以开始使用昇思MindSpore,可以在昇思教程中进入ModelArts官网 创建notebook,点击【打开】启动,进入ModelA…...
python学习——洛谷P2010 [NOIP2016 普及组] 回文日期 三种方法
[NOIP2016 普及组] 回文日期 文章目录 [NOIP2016 普及组] 回文日期题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示方法一方法二方法三 题目背景 NOIP2016 普及组 T2 题目描述 在日常生活中,通过年、月、日这…...
现代风格VUE3易支付用户控制中心
适用系统 彩虹易支付 技术栈 vitevue3elementuiplusphp 亮点 独立前端代码,扩展开发,不改动系统文件,不影响原版升级 支持功能订制 界面预览...
重生之我在异世界学智力题(9)
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言时间旅行者的逻辑谜题题目描述&#…...
《Mycat核心技术》第05章:Mycat中文乱码解决方案
作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 星球项目地址:https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀,…...
Flink执行模式(批和流)如何选择
DataStream API支持不同的运行时执行模式(batch/streaming),你可以根据自己的需求选择对应模式。 DataStream API的默认执行模式就是streaming,用于需要连续增量处理并且预计会一直保持在线的无界(数据源输入是无限的)作业。 而batch执行模式则用于有界(输入有限)作业…...
vue 文本域 展示的内容格式要和填写时保持一致
文本域 展示的内容格式要和填写时保持一致 <el-inputtype"textarea":rows"5"placeholder"请输入内容"v-model"formCredit.point"style"width:1010px;" > </el-input> 样式加个: white-space: pre-w…...
计算机基础知识复习12.20
B树与B树差异的点 叶子节点最底部的节点才会存放实际数据(索引记录),非叶子节点只会存放索引 所有索引都会在叶子节点出现,叶子节点之间构成一个有序链表 为什么mysql使用B树 单点查询:B树的非叶子节点不存放实际的记录数据,仅…...
Flash语音芯片相比OTP语音芯片的优势
Flash语音芯片和OTP语音芯片是两种常见的语音解决方案,在各自的应用领域中发挥着重要作用。本文将介绍Flash语音芯片相比OTP(One-Time Programmable)语音芯片的显著优势。 1.可重复擦写:Flash语音芯片的最大特点是支持多次编程和擦除,…...
深度学习模型中增加随机性可以通过多种方式实现,以下是一些可以应用到你的 `TCNAttentionLSTM`
在深度学习模型中增加随机性可以通过多种方式实现,以下是一些可以应用到你的TCNAttentionLSTM模型中的方法: ### 1. Dropout 你已经在模型中使用了dropout,这是增加随机性的一种常见方法。你可以通过调整dropout率来控制随机性的程度。 ###…...
JavaScript:一个争议与机遇并存的编程语言
JavaScript的诞生带着某种戏剧性色彩。1995年,网景公司的Brendan Eich在短短10天内设计出了这门语言。这种仓促的诞生为JavaScript埋下了许多设计缺陷的隐患,这些问题直到今天仍在困扰着开发者。然而,正是这样一个充满争议的语言,…...
后摩尔定律时代,什么将推动计算机性能优化的发展?
在摩尔定律时代,每两年芯片上的晶体管数量就会翻一番,这一看似不可避免的趋势被称为摩尔定律,它极大地促进了计算机性能的提高。然而,硅基晶体管不可能一直小下去,半导体晶体管的微型化推动了计算机性能的提升…...
台球助教平台系统开发APP和小程序信息收藏功能需求解析(第十二章)
以下是开发台球助教系统客户端(APP,小程序,H5)几端的信息收藏功能的详细需求和功能说明,内容比较详细,可以说是一个教科书式的详细说明了,这套需求说明不仅仅用在我们的台球助教系统程序上&…...
软件实验室认可|实验室比对的形式与方法
实验室比对是软件测试实验室在申请软件实验室认可必须要做的一类质量控制活动。实验室比对包括实验室间比对,和实验室内比对。实验室间比对指的是按照预先规定的条件,由两个或多个实验室对相同或类似的物品进行测量或检测的组织、实施和评价。实验室内比…...
HarmonyOS NEXT开发进阶(四):@Builder 装饰器实现UI结构复用
一、前言 当页面有多个相同的UI结构时,若每个都单独声明,同样会有大量重复的代码。为避免重复代码,可以将相同的UI结构提炼为一个自定义组件,完成UI结构的复用。 除此之外,ArkTS还提供了一种更轻量的UI结构复用机制B…...
Vivado/Vitis中自定义IP的驱动
在使用Xilinx FPGA时,很多时候都要添加自定义的IP以实现相应的功能,一些时候会通过AXI总线与软核或硬核相连,这个时候就可以在软件中对IP进行控制。 当我们打开Vitis开始软件编写时,会遇到自定义IP驱动编译不过的情况,…...