分布式全文检索引擎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),将内存中的数据生成到一个新的段上并缓存到文件缓存系统上,稍后再被刷新到磁盘中并生成提交点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/889973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven 生命周期

文章目录 Maven 生命周期- Clean 生命周期- Build 生命周期- Site 生命周期 Maven 生命周期 Maven 有以下三个标准的生命周期: Clean 生命周期: clean:删除目标目录中的编译输出文件。这通常是在构建之前执行的,以确保项目从一个…

Android Studio AI助手---Gemini

从金丝雀频道下载最新版 Android Studio,以利用所有这些新功能,并继续阅读以了解新增内容。 Gemini 现在可以编写、重构和记录 Android 代码 Gemini 不仅仅是提供指导。它可以编辑您的代码,帮助您快速从原型转向实现,实现常见的…

#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍04-盲SQL注入(Blind SQL Injection)

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

Scala 的迭代器

迭代器定义:迭代器不是一种集合,它是一种用于访问集合的方法。 迭代器需要通过集合对应的迭代器调用迭代器的方法来访问。 支持函数式编程风格,便于链式操作。 创建一个迭代器,相关代码如下: object Test {def mai…

底层理论基础(单片机)

计算机基础 IO逻辑 计算机系统中的高低电平逻辑1和0,数据在计算机中的存储、传输、运算都是以二进制形式进行的。 数据的传输通过总线真正传递的是电信号,高低电平(0、1)。运算在电路中进行,集成电路中运算。 计算机的…

B站bilibili视频转文字字幕下载方法

本文将讲述介绍一种使用本地工具如何快速的下载B站的字幕为本地文本文件的方法。 通常获取B站字幕需要在浏览器中安装第三方插件,通过插件获取字幕。随着大模型,生成式AI,ChatGPT的应用,B站也提供了AI小助手对视频的内容进行总结…

ROS+PX4+Gazebo仿真环境配置全流程解析

上一期文章介绍了我们即将发布的仿真平台,并提到后续需要在Ubuntu系统上进行PX4软件在环仿真。本期文章将为大家详细介绍如何配置Ubuntu环境以及安装ROS和PX4仿真环境。具体配置包括:Ubuntu 20.04 ROS Noetic PX4 Python3。 需要注意的是&#xff0c…

基础入门-APP应用微信小程序原生态开发H5+Vue技术WEB封装打包反编译抓包点

知识点: 1、基础入门-APP应用-开发架构安全问题 2、基础入门-小程序应用-开发架构安全问题 通用: 1、反编译-得到源码-源码提取资产(泄漏的配置信息)-安全测试 2、抓包-资产-安全测试 一、演示案例-移动App-开发架构-原生&H…

Elasticsearch:使用 Open Crawler 和 semantic text 进行语义搜索

作者:来自 Elastic Jeff Vestal 了解如何使用开放爬虫与 semantic text 字段结合来轻松抓取网站并使其可进行语义搜索。 Elastic Open Crawler 演练 我们在这里要做什么? Elastic Open Crawler 是 Elastic 托管爬虫的后继者。 Semantic text 是 Elasti…

Qt之自定义标题栏拓展(十)

Qt开发 系列文章 - user-defined-titlebars(十) 目录 前言 一、方式一 1.效果演示 2.创建标题栏类 3.可视化UI设计 4.定义相关函数 5.使用标题栏类 二、方式二 1.效果演示 2.创建标题栏类 3.定义相关函数 4.使用标题栏类 总结 前言 Qt自带…

vue3前端组件库的搭建与发布(一)

前言: 最近在做公司项目中,有这么一件事情,很是头疼,就是同一套代码,不同项目,要改相同bug,改好多遍,改的都想吐,于是就想做一个组件库,这样更新一下就全都可…

学技术学英文:代码中的锁:悲观锁和乐观锁

本文导读: 1. 举例说明加锁的场景: 多线程并发情况下有资源竞争的时候,如果不加锁,会出现数据错误,举例说明: 业务需求:账户余额>取款金额,才能取钱。 时间线 两人共有账户 …

Qt编译MySQL数据库驱动

目录 Qt编译MySQL数据库驱动 测试程序 Qt编译MySQL数据库驱动 (1)先找到MySQL安装路径以及Qt安装路径 C:\Program Files\MySQL\MySQL Server 8.0 D:\qt\5.12.12 (2)在D:\qt\5.12.12\Src\qtbase\src\plugins\sqldrivers\mysql下…

CTFHUB-web(SSRF)

内网访问 点击进入环境,输入 http://127.0.0.1/flag.php 伪协议读取文件 /?urlfile:///var/www/html/flag.php 右击查看页面源代码 端口扫描 1.根据题目提示我们知道端口号在8000-9000之间,使用bp抓包并进行爆破 POST请求 点击环境,访问flag.php 查看页…

游戏引擎学习第43天

仓库 https://gitee.com/mrxiao_com/2d_game 介绍运动方程 今天我们将更进一步,探索运动方程,了解真实世界中的物理,并调整它们,以创建一种让玩家感觉愉悦的控制体验。这并不是在做一个完美的物理模拟,而是找到最有趣…

YashanDB共享集群产品能力观测:细节足见功底

本文基于前泽塔数科研发总监-王若楠2024年11月在“2024年国产数据库创新生态大会”-“根”技术专场的演讲整理形成,主要对崖山共享集群YAC的架构、功能、高可用性、性能四大方面进行全面测试,并分享了测试环境和测试结论。 年初,基于某些商业…

VMware ubuntu16.04怎么设置静态IP联网

1.将VMware桥接到当前电脑使用的网络上面; 2.点击网络符号,编辑连接; 3.双击有线连接1; 4.选择IPv4设置,将地址,子网掩码,网关,DNS服务器设置好,保存; 5.在终…

ElasticSearch的自动补全功能(拼音分词器、自定义分词器、DSL实现自动补全查询、RestAPI实现自动补全查询)

文章目录 1. 什么是自动补全2. 拼音分词器2.1 初识拼音分词器2.2 下载拼音分词器2.3 安装拼音分词器2.4 测试拼音分词器 3. 自定义分词器3.1 拼音分词器存在的问题3.2 分词器(analyzer)的组成3.3 如何自定义分词器3.4 拼音分词器的可选参数3.5 配置自定义…

Windows环境 (Ubuntu 24.04.1 LTS ) 国内镜像,用apt-get命令安装RabbitMQ,java代码样例

一、环境 Windows11 WSL(Ubuntu 24.04.1) 二、思路 1 用Windows中的Ubuntu安装RabbitMQ,贴近Linux的线上环境; 2 RabbitMQ用erlang语言编写的,先安装erlang的运行环境; 2 用Linux的apt-get命令安装,解决软件依赖…

医学预测模型的网页应用必要模块设计(重制版)

医学预测模型的网页应用必要模块设计(重制版) 刘岳鹏 摘要: 网页应用(Web APP)承载医学临床预测模型并在临床实践中实现与用户的互动,必要的功能模块设计将有助于Web APP更好地在临床实践中发挥其功能。在此…