大数据-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” 来避免数据丢失。

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

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

相关文章

美摄科技云服务解决方案,方案成熟,接入简单

美摄科技作为视频处理领域的先锋,凭借其强大的技术实力和深厚的行业经验,推出了成熟的云服务解决方案,为轻量化视频制作开辟了全新的道路。 一、成熟方案,接入无忧 美摄科技云服务解决方案的最大亮点在于其成熟度和易用性。我们…

Vulnhub打靶-matrix-breakout-2-morpheus

基本信息 靶机下载:https://pan.baidu.com/s/1kz6ei5hNomFK44p1QT0xzQ?pwdy5qh 提取码: y5qh 攻击机器:192.168.20.128(Windows操作系统) 靶机:192.168.20.0/24 目标:获取2个flagroot权限 具体流程 …

前端 js 处理一个数组 展示成层级下拉样式

好记性不如赖笔头; 前端开发中,不管是什么时候都会遇到select 下拉框的使用,一般情况下,数据处理后端都会处理好。前端一般使用相应技术栈所推荐的公共组件就可以了。 但是一般也有后端不处理的数组,需要前端自己处理成…

【热门主题】000007 网络安全:守护数字世界的坚固防线

前言:哈喽,大家好,今天给大家分享一篇文章!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热门主题】000007 网络安全:守护数字世界的坚固防线一、网…

精准赋能,助力成长 | 亲笔签数字科技“笔迹大计”第一期培训圆满收官

创新驱动,合作共赢。近日,亲笔签数字科技成功举办第一期“笔迹大计”专业培训,为新入职渠道管理员工和新签约渠道伙伴精准赋能,进一步提升业务能力水平。 精心筹备,全面覆盖 本期“笔迹大计”培训内容全面&#xff0c…

当LangGraph遇上Mem0:如何让你的AI Agent具有更智能的记忆与个性化的体验?

AI Agent(智能体)的记忆(Memory)被认为是一项必备的基础能力,它用来提取、存储会话中的重要信息并用于后续的检索与使用。可以把记忆简单地分成短期记忆与长期记忆两种,用来“记住”不同类型的信息&#xf…

Navicat连接openGauss数据库详细指南

文章目录 环境准备总体的技术路线root权限下,防火墙的关闭切换用户修改文件修改文件pg_hba.conf修改文件postgresql.conf重启数据库 创建用于连接的数据库和数据库用户使用Navicat连接 资料参考 环境准备 自行安装Navicat连接工具(自己找破解版)已经安装好openGaus…

【文心智能体 | AI大师工坊】如何使用智能体插件,完成一款购物类智能体的开发,来体验一下我的智能体『科技君Tom』

目录 1.1、智能体运行效果1.2、创作灵感来源智能体平台拥有个人化且人性化的大致框架,可以让小白也能搭建出一个智能体其次是拥有丰富的插件,可以更加快速的得到自己想要的效果~ 1.3、如何制作智能体常见问题与解决方案关于人设与回复逻辑插件使用模型的…

【Linux内核】eBPF基础篇

系列综述: 💞目的:本系列是个人整理为了学习ebpf机制的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于–知乎ebpf专栏文章–进行的,每个知识点的修正和深…

python获取当前鼠标位置的RGB值

效果 依赖 pip install Pillow pyautoguisudo apt install gnome-screenshot代码 import pyautogui import timedef get_rgb_at_mouse():try:while True:# 获取当前鼠标的位置x, y pyautogui.position()# 截取当前屏幕图像screenshot pyautogui.screenshot()# 获取鼠标位置…

小O睡眠省电调研

摘要 AI 预测睡眠 断网 杀应用为主的策略 UI 睡眠识别 AI 识别 将亮灭屏、音频、上传下载、运动状态数据存到xml中,供预测分析 睡眠策略 OPPO 睡眠省电 1. sOSysNetControlManagerNewInstance:断网(wifi\mobiledata)2. S…

【D3.js in Action 3 精译_036】4.1 DIY 实战:在 Observable 平台实现 D3折线图坐标轴的绘制

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可…

百度统计提示:为了满足法律法规最新规定和要求,您的网站由于存在合规风险将被暂停使用百度统计服务

今天打开百度统计后看到提示: 为了满足法律法规及政府监管的最新规定和要求,保护广大网民的合法权益,您的网站由于存在合规风险将被暂停使用百度统计服务。 请您在10日内完成整改,否则将删除违规站点及数据,有问题可发…

使用dotnet-counters和dotnet-dump 分析.NET Core 项目内存占用问题

在.NET Core 项目部署后,我们往往会遇到内存占用越来越高的问题,但是由于项目部署在Linux上,因此无法使用VS的远程调试工具来排查内存占用问题。那么这篇文章我们大家一起来学习一下如何排查内存占用问题。 首先,我们来看一下应用…

手机数据恢复技巧:适用于手机的恢复应用程序

发现自己意外删除了 Android 设备上的照片,这让人很痛苦。这些照片可能是值得纪念的文件,会让您想起一些难忘的回忆。删除它们后,您知道如何恢复它们。在这种情况下,您需要使用 Android 的照片恢复应用程序。 无论您需要直接从 A…

【控制系统】深入理解反步控制(Backstepping) | 反步法控制器原理与应用实例解析(附Matlab/Simulink仿真实现)

💯 欢迎光临清流君的博客小天地,这里是我分享技术与心得的温馨角落 💯 🔥 个人主页:【清流君】🔥 📚 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 📚 🌟始终保持好奇心&…

使用Airtest自动化某云音乐爬取歌曲名称

简介 本文将介绍如何使用Airtest自动化工具来模拟用户操作,从某云音乐中爬取与特定关键词相关的歌曲名称。我们将以搜索“文字”相关的歌曲为例,并将结果保存到本地文件。 准备工作 安装Airtest并配置好Android设备或模拟器。确保你的设备上已安装某云…

【独家:AI编程助手Cursor如何revolutionize Java设计模式学习】

【独家:AI编程助手Cursor如何revolutionize Java设计模式学习】 导语 在Java高级编程的世界里,设计模式是每个开发者必须掌握的利器。但是,如何快速理解并灵活运用这些模式呢?让我们一起探索如何借助AI编程助手Cursor,轻松掌握设计模式,提升Java编程技能! 正文 设计模式:J…

QUIC(Quick UDP Internet Connections)与 RTMP(Real Time Messaging Protocol)

QUIC(Quick UDP Internet Connections)和 RTMP(Real Time Messaging Protocol)是两种不同的网络传输协议,它们在一些方面有不同的特点和应用场景。 QUIC 协议 特点 基于 UDP:QUIC 建立在 UDP 之上&#xff…

探索 Jupyter 核心:nbformat 库的神秘力量

文章目录 探索 Jupyter 核心:nbformat 库的神秘力量1. 背景介绍:为何选择 nbformat?2. nbformat 是什么?3. 如何安装 nbformat?4. 简单的库函数使用方法4.1 读取 Notebook 文件4.2 修改 Notebook 中的单元格4.3 添加 M…