面试-【搜索引擎】

article/2025/7/30 19:00:36

elasticsearch分布式架构原理

index -> type -> mapping -> document -> field
elasticsearch 7.x取消了type
mapping类似于schema信息
document代表一行数据
field代表一个字段值
在这里插入图片描述

elasticsearch读写流程底层剖析

(1)es写数据过程

1)客户端选择一个 node 发送请求过去,这个 node 就是 coordinating node (协调节点)
2)coordinating node,对 document 进行路由,将请求转发给对应的 node(primary shard)
3)实际的 node 上的 primary shard 处理请求,然后将数据同步到 replica node
4)coordinating node,如果发现 primary node 和所有 replica node 都搞定之后,就返回响应
结果给客户端

(2)es 读数据过程

查询,GET某一条数据,写入了某个 document,这个 document 会自动给你分配一个全局唯一的id,doc id,同时也是根据 doc id 进行 hash 路由到对应的 primary shard 上面去。也可以手动指定 doc id,比如用订单 id,用户id。
你可以通过 doc id 来查询,会根据 doc id 进行 hash,判断出来当时把 doc id 分配到了哪个shard上面去,从那个 shard 去查询
1)客户端发送请求到任意一个 node,成为 coordinate node
2)coordinate node对document进行路由,将请求转发到对应的node,此时会使用round-robin随机轮询算法,在 primaryshard以及其所有 replica 中随机选择一个,让读请求负载均衡
3)接收请求的 node 返回 document给 coordinatenode
4) coordinate node 返回 document给客户端

实际的 node 上的 primary shard 处理请求详细解析
在这里插入图片描述
1)先写入 buffer,在 buffer 里的时候数据是搜索不到的,同时将数据写入 translog 日志文件
2)如果 buffer 快满了,或者到一定时间,就会将 buffer 数据 refresh到一个新的 segmentfile中,但是此时数据不是直接进入 segment file 的磁盘文件的,而是先进入os cache 的。这个过程就是 refresh
每隔1秒钟,es将 buffer 中的数据写入一个新的segment file,每秒钟会产生一个新的磁盘文件,segment file,这个 segment file 中就存储最近1秒内 buffer 中写入的数据
但是如果 buffer 里面此时没有数据,那当然不会执行 refresh 操作,每秒创建一个空的segment file,如果 buffer 里面有数据,默认1秒钟执行一次 refresh 操作,刷入一个新的segment file 中
操作系统里面,磁盘文件其实都有一个东西,叫做 os cache,操作系统缓存,就是说数据写入磁盘文件之前,会先进入 os cache,先进入操作系统级别的一个内存缓存中去
只要 buffer 中的数据被 refresh 操作,刷入 os cache
默认是每隔1秒 refresh 一次的,所以es是准实时的,因为写入的数据1秒之后才能被看到。
可以手动 refresh,就是手动将 buffer 中的数据刷入 os cache中,让数据可以立即被搜索到。
只要数据被输入 os cache中,buffer就会被清空了,因为不需要保留 buffer了,数据在translog里面已经持久化到磁盘去一份了
3)只要数据进入 os cache,此时就可以让这个 segmentfile 的数据对外提供搜索了

4)重复1~3步骤,新的数据不断进入 buffer 和 translog,不断将 buffer 数据写入一个又一个新的segment file 中去,每次 refresh 完 buffer清空,translog 保留。随着这个过程推进,translog会变得越来越大。当 translog达到一定长度的时候,就会触发 commit 操作。
buffer 中的数据,倒是好,每隔1秒就被刷到 os cache 中去,然后这个 buffer 就被清空了。
所以说这个 buffer 的数据始终是可以保持住不会填满es 进程的内存的。
buffer 中的数据,倒是好,每隔1秒就被刷到 os cache 中去,然后这个 buffer 就被清空了。
所以说这个 buffer 的数据始终是可以保持住不会填满es 进程的内存的。
每次一条数据写入 buffer,同时会写入一条日志到 translog日志文件中去,所以这个 translog日志文件是不断变大的,当translog 日志文件大到一定程度的时候,就会执行 commit 操作。
5)commit 操作发生第一步,就是将 buffer 中现有数据 refresh 到 os cache 中去,清空 buffer
6)将一个 commit point写入磁盘文件,里面标识着这个 commit point 对应的所有 segment file
7)强行将 os cache中目前所有的数据都 fsync到磁盘文件中去
translog 日志文件的作用是什么? 就是在你执行 commit 操作之前,数据要么是停留在 buffer中,要么是停留在 os cache中,无论是 buffer 还是 os cache 都是内存,一旦这台机器死了,内存中的数据就全丢了。
所以需要将数据对应的操作写入一个专门的日志文件,translog 日志文件中,一旦此时机器宕机,再次重启的时候,es 会自动读取 translog日志文件中的数据,恢复到内存 buffer 和os cache中去。
8)将现有的 translog 清空,然后再次重启启用一个translog,此时 commit 操作完成。默认每隔30分钟会自动执行一次 commit,但是如果 translog过大,也会触发commit。整个 commit的过程,叫做 flush 操作。我们可以手动执行 ush 操作,就是将所有 os cache数据刷到磁盘文件中去。
9)translog 其实也是先写入 os cache 的,默认每隔5秒刷一次到磁盘中去所以默认情况下可能有5秒的数据会仅仅停留在 buffer或者 translog 文件的os cache 中,如果此时机器挂了.会丢失 5秒钟的数据。但是这样性能比较好,最多丢5秒的数据。也可以将 translog 设置成每次写操作必须是直接 fsync到磁盘,但是性能会差很多。
实际上你在这里,如果面试官没有问你 es 丢数据的问题,你可以在这里给面试官炫一把,你说,其实 es 第一是准实时的,数据写入1秒后可以搜索到,可能会丢失数据的,你的数据有 5秒的数据,停留在 buffer、translog os cache、segment file os cache 中,有5秒的数据不在磁盘上,此时如果宕机,会导致 5秒的数据丢失。
10)如果是删除操作,commit 的时候会生成一个.del文件,里面将某个 do 标识为 deleted状态,那么搜索的时候根据.del 文件就知道这个 doc 被删除了
11)如果是更新操作,就是将原来的 doc 标识为 deleted 状态,然后新写入一条数据
12)buffer 每次refresh 一次,就会产生一个 segment file,所以默认情况下是1秒钟一个segmentfile,segmentfile 会越来越多,此时会定期执行 merge
13)每次 merge 的时候,会将多个 segment file 合并成一个,同时这里会将标识为 deleted的 doc 给物理删除掉,然后将新的 segment file 写入磁盘,这里会写一个 commit point,标识所有新的 segment file,然后打开 segmentfile 供搜索使用,同时删除旧的 segment file


http://www.hkcw.cn/article/GauhlQANPW.shtml

相关文章

引领机器人交互未来!MANUS数据手套解锁精准手部追踪

MANUS数据手套为机器人技术带来高精度手部追踪,助力实现人与机器的自然交互!近年,越来越多客户希望利用这项技术精准操控机械臂、灵巧手和人形机器人,不断提升设备的智能化水平和交互体验。 MANUS数据手套是高精度人机交互设备&am…

国标GB28181设备管理软件EasyGBS实现生产全流程可视化监控与精细化管理

一、引言​ 在全球经济一体化与工业化浪潮的推动下,市场竞争愈发激烈,企业想要在行业中占据优势,实现生产流程的高效管理与精准把控成为关键。生产流程不仅是产品质量的生命线,更是提升生产效率、保障经济效益的核心环节。国标GB…

数据治理系统是什么?数据治理工具有什么用?

目录 一、数据治理系统是什么? 二、数据治理系统的重要性 1. 保障数据质量 2. 确保数据安全 3. 促进数据共享与协作 三、常见的数据治理工具及其特点 1. 数据质量管理工具 2. 数据集成工具 3. 元数据管理工具 四、数据治理工具有哪些作用? 1.…

AD9361 的工作原理

AD9361 由Analog Devices 公司设计并产出的。该器件集成了相当多的滤波器,频率合成器,数字处理模块以及接收端自动增益控制模块等。拥有上千个寄存器可供配置,通过对寄存器存入数值的更改可对该器件进行工作控制,正是因为此芯片配…

AI Agent开发入门笔记(1)

目录 1️⃣ 选择框架2️⃣开发操作导入Python库创建功能函数装载环境变量创建Agent运行Agent 学习参考资料: 微软 AI Agents for Beginners 代码仓库 1️⃣ 选择框架 semantic-kernel开发框架 导入库创建功能函数(Agent 要完成什么功能)…

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.11 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第5章析因设计引导5.7节思考题5.11 R语言解题。主要涉及方差分析&#xff0c;正态假设检验&#xff0c;残差分析&#xff0c;交互作用图。 dataframe<-data.frame( densityc(570,565,…

Cadence学习笔记终章

目录 01 | 引 言 02 | 文章汇总 03 | 结 语 01 | 引 言 在历时一个半月后&#xff0c;终于更新完Cadence的原理图与PCB的设计流程&#xff1b; 本篇文章主要是将全部的Cadence学习文章汇总起来&#xff0c;以供朋友们以及自己日后进行翻阅。 02 | 文章汇总 文章从上至下的…

第100+41步 ChatGPT学习:R语言实现误判病例分析

本期是《第33步 机器学习分类实战&#xff1a;误判病例分析》的R版本。 尝试使用Deepseek-R1来试试写代码&#xff0c;效果还不错。 下面上R语言代码&#xff0c;以Xgboost为例&#xff1a; # 加载必要的库 library(caret) library(pROC) library(ggplot2) library(xgboost)…

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.8 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第5章析因设计引导5.7节思考题5.8 R语言解题。主要涉及方差分析&#xff0c;正态假设检验&#xff0c;残差分析&#xff0c;交互作用图。 (a) dataframe<-data.frame( Lightc(580,568…

OptiStruct实例:消声器前盖ERP分析(2)RADSND基础理论

13.2 Radiated Sound Output Analysis( RADSND ) RADSND 方法通过瑞利积分来求解结构对外的辐射噪声。其基本思路是分为两个阶段&#xff0c;如图 13-12 所示。 图13-12 结构辐射噪声计算示意图 第一阶段采用有限元方法&#xff0c;通过频响分析(模态叠加法、直接法)工况计算结…

安装RHEL9.x操作系统

本案例需要的设备和软件 1.1台安装有Windows操作系统的计算机 2.RHEL 9的ISO映像文件一套 3.VMware Workstation 17.5 Pro软件一套 4.相关软件及镜像下载链接 VMware17.5&#xff0c;链接&#xff1a;https://pan.quark.cn/s/6208d19dbd48 提取码&#xff1a;22Wk rhel-9…

API:解锁网络世界的无限可能

“在数字化时代&#xff0c;互联网已成为我们生活、工作和学习中不可或缺的一部分。然而随着网络环境的日益复杂&#xff0c;访问限制、数据追踪、IP封锁等问题也随之而来。为了应对这些挑战&#xff0c;代理IP API应运而生&#xff0c;它不仅为我们提供了一种绕过限制、保护隐…

js 动画库、2048核心逻辑、面试题add[1][2][3]+4

1、js 动画库 web animation api &#xff08;1&#xff09;初始化代码 hmtl、css 部分 初始化全局背景黑色初始化黄色小球 js 部分 监听全局点击事件创建并添加元素 class"pointer" 的 div 标签 设置 left、top 位置监听动画结束事件&#xff0c;移除该元素 定位小…

Linux:Shell脚本基础

一、变量的命名规则 变量名称中只能包含数字、大小写字母以及下划线 二、变量的调用方法 三、字符的转义及引用 批量转义用“” 双引号是弱引用&#xff0c;单引号是强引用 四、用命令的执行结果定义变量 $1 $2 $3代表脚本后的第几个字节 $* $表示的是所有字节&#xff0c;但…

【Linux】深入解析:云服务器连接 XShell、Linux 目录结构和常用命令

XShell 使用阿里云服务器连接 XShell 使用Xshell连接阿里云服务器&#xff08;超详细截图版&#xff09;-CSDN博客 连接成功后 xshell 页面&#xff1a; 清空页面内容&#xff0c;直接输入 clear 即可&#xff1a; 关于 XShell 下的复制粘贴 复制&#xff1a;Ctrl Insert&…

掌握Java Runtime类的核心用法

Runtime 类的基本概念 Java 的 Runtime 类位于 java.lang 包中&#xff0c;用于与 Java 运行时环境&#xff08;JVM&#xff09;交互。每个 Java 应用程序都有一个 Runtime 实例&#xff0c;可以通过静态方法 Runtime.getRuntime() 获取。Runtime 类提供了与系统资源交互、执行…

如何设计自动化测试框架?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 关于测试框架的好处&#xff0c;比如快速回归提高测试效率&#xff0c;提高测试覆盖率等这里就不讨论了。这里主要讨论自动化框架包含哪些内容&#xff0c;以及如…

历年西安交通大学计算机保研上机真题

2025西安交通大学计算机保研上机真题 2024西安交通大学计算机保研上机真题 2023西安交通大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school 计算圆周率近似值 题目描述 根据公式 π / 4 1 − 1 / 3 1 / 5 − 1 / 7 … \pi / 4 1 - 1/3 1/5 - …

历年武汉大学计算机保研上机真题

2025武汉大学计算机保研上机真题 2024武汉大学计算机保研上机真题 2023武汉大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school 分段函数计算 题目描述 写程序计算如下分段函数&#xff1a; 当 x > 0 x > 0 x>0 时&#xff0c; f ( x ) …

LearnOpenGL-笔记-其十

今天我们要进入高级光照的环节了&#xff1a; Advanced Lighting 之前的学习中&#xff0c;我们的光照模型采用的是比较简单的phong光照模型&#xff0c;也就是光照强度由环境光加上漫反射光加上镜面反射组成。 用一张图足以解释&#xff1a; 就这么简单&#xff0c;针对夹…