ElasticSearch搜索引擎:数据的写入流程

news2024/12/23 0:39:53

一、ElasticSearch 写数据的总体流程:

在这里插入图片描述

(1)ES 客户端选择一个节点 node 发送请求过去,这个节点就是协调节点 coordinating node

(2)协调节点对 document 进行路由,通过 hash 算法计算出数据应该落在哪个分片 shard 上,然后根据节点上维护的 shard 信息,将请求转发到对应的实际处理节点node上

shard = hash(document_id) % (num_of_primary_shards),

(3)实际的节点上的 primary shard 主分片处理请求,然后将数据同步到副本节点 replica node

(4)coordinating node 等到 primary node 和所有 replica node 都执行成功之后,就返回响应结果给客户端。

二、ES 的主分片写数据的详细流程:

在这里插入图片描述

1、refresh 操作:
primary shard 主分片先将数据写入 memory buffer,然后定时(默认每隔1s)将 memory buffer 中的数据写入一个新的 segment 文件中,并进入 Filesystem cache(同时清空 memory buffer),这个过程就叫做 refresh;每个 Segment 文件实际上是一些倒排索引的集合, 只有经历了 refresh 操作之后,这些数据才能变成可检索的。

ES 的近实时性:当数据存在 memory buffer 时是搜索不到的,只有数据被 refresh 到 Filesystem cache 之后才能被搜索到,而 refresh 是每秒一次, 所以称 es 是近实时的,或者可以通过手动调用 es 的 api 触发一次 refresh 操作,让数据马上可以被搜索到;

     上文讲到的 memory buffer,也称为 Indexing Buffer,这个区域默认的内存大小是 10% heap size。

2、写 translog 事务日志文件:
由于 memory Buffer 和 Filesystem Cache 都是基于内存,假设服务器宕机,那么数据就会丢失,所以 ES 通过 translog 日志文件来保证数据的可靠性,在数据写入 memory buffer 的同时,将数据写入 translog 日志文件中,在机器宕机重启时,es 会从磁盘中读取 translog 日志文件中最后一个提交点 commit point 之后的数据,恢复到 memory buffer 和 Filesystem cache 中去。

ES 数据丢失的问题:translog 也是先写入 Filesystem cache,然后默认每隔 5 秒刷一次到磁盘中,所以默认情况下,可能有 5 秒的数据会仅仅停留在 memory buffer 或者 translog 文件的 Filesystem cache中,而不在磁盘上,如果此时机器宕机,会丢失 5 秒钟的数据。也可以将 translog 设置成每次写操作必须是直接 fsync 到磁盘,但是性能会差很多。

3、flush 操作:
不断重复上面的步骤,translog 会变得越来越大,当 translog 文件默认每30分钟或者阈值超过 512M 时,就会触发 flush 操作,将 memory buffer 中所有的数据写入新的 Segment 文件中, 并将内存中所有的 Segment 文件全部落盘,最后清空 translog 事务日志。

(1)将 memory buffer 中的数据 refresh 到 Filesystem Cache 中的一个新的 segment 文件中去,然后清空 memory buffer;
(2)创建一个新的 commit point(提交点),同时强行将 Filesystem Cache 中目前所有的数据都 fsync 到磁盘文件中;
(3)删除旧的 translog 日志文件并创建一个新的 translog 日志文件,此时 flush 操作完成
ES 的 flush 操作主要通过以下几个参数控制:

index.translog.flush_threshold_period:每隔多长时间执行一次flush,默认30m
index.translog.flush_threshold_size:当事务日志大小到达此预设值,则执行flush,默认512mb
index.translog.flush_threshold_ops:当事务日志累积到多少条数据后flush一次。
————————————————
版权声明:本文为CSDN博主「张维鹏」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a745233700/article/details/118076845

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

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

相关文章

设计模式 - 结构型模式考点篇:适配器模式(类适配器、对象适配器、接口适配器)

目录 一、适配器模式 一句话概括结构式模式 1.1、适配器模式概述 1.2、案例 1.2.1、类适配器模式实现案例 1.2.2、对象适配器 1.2.3、接口适配器 1.3、优缺点(对象适配器模式) 1.4、应用场景 一、适配器模式 一句话概括结构式模式 教你将类和对…

剑指offer——JZ68 二叉搜索树的最近公共祖先 解题思路与具体代码【C++】

一、题目描述与要求 二叉搜索树的最近公共祖先_牛客题霸_牛客网 (nowcoder.com) 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q,最近公共祖先LCA(T,p,q)表示一个节点x&#…

头戴式耳机哪个牌子音质好?Y2K的福音!Umelody轻律 U1头戴式耳机分享

作为一款国产头戴式蓝牙耳机,Umelody轻律 U1绝对是性价比之选,可以说是Y2K的福音,复古味十足的设计,快捷方便的蓝牙连接和多功能实用的操作方式,最关键的还是价格低,300元的价格不到就可以拿下。 创始团队…

在Remix中编写你的第一份智能合约

智能合约简单来讲就是:部署在去中心化区块链上的一个合约或者一组指令,当这个合约或者这组指令被部署以后,它就不能被改变了,并会自动执行,每个人都可以看到合约里面的条款。更深层次的理解就是:这些代码会…

vue实现自定义滚动条

vue实现自定义滚动条 具体效果如下,这边我用的rem单位,比例是1:40, 先写下页面布局,把原生的滚动条给隐藏掉,给自定义的滑块增加transition: marginLeft 1s linear;可以使左边距过度的更顺滑 .top-box-2::-webkit-scr…

基于spso算法的航线规划

matlab2020a GitHub - duongpm/SPSO: Spherical Vector-based Particle Swarm Optimization

智能集成式电力电容器在山东某环保材料制造厂中的应用-安科瑞黄安南

摘要 分析智能集成式电力电容的工作原理及功能,结合山东环保材料制造厂配电现状,选择经济可靠的方案,智能电容过零投切与低功耗,解决了继电器投切产生涌流的问题;接线简单,扩容方便,解决无功补…

MIPS汇编语言实现hello world和冒泡排序

WinMIPS64的IO方法输出hello world 编写一个简单的终端输出“Hello World!!”的小程序,首先写好一些数据包括CONTROL和DATA的地址以及字符串Hello World,然后将CONTROL和DATA的地址存储在寄存器中以之作为基址,将字符…

零基础快速自学SQL,2天足矣。

此文是《10周入门数据分析》系列的第6篇。 想了解学习路线,可以先行阅读“ 学习计划 | 10周入门数据分析 ” 上一篇分享了数据库的基础知识,以及如何安装数据库,今天这篇分享数据库操作和SQL。 SQL全称是 Structured Query Language&#x…

什么是Web组件(Web Components)?它们的主要部分有哪些?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

深度学习笔记之优化算法(五)AdaGrad算法的简单认识

机器学习笔记之优化算法——AdaGrad算法的简单认识 引言回顾:动量法与Nesterov动量法优化学习率的合理性AdaGrad算法的简单认识AdaGrad的算法过程描述 引言 上一节对 Nesterov \text{Nesterov} Nesterov动量法进行了简单认识,本节将介绍 AdaGrad \text{…

华为云云耀云服务器L实例评测|测试CentOS的网络配置和访问控制

目录 引言 1 理解几个基础概念 2 配置VPC、子网以及路由表 3 配置安全组策略和访问控制规则 3.1 安全组策略和访问控制简介 3.2 配置安全组策略 3.3 安全组的最佳实践 结论 引言 在云计算时代,网络配置和访问控制是确保您的CentOS虚拟机在云环境中安全运行的…

每个前端都要学的【前端自动化部署】,Devops,CI/CD

原文发布于:2023-09-21 11:50 作者:65岁退休Coder 原文链接:https://juejin.cn/post/7102360505313918983 DevOps 当我们提到 Jenkins,大家首先想到的概念就是 CI/CD,在这之前我们应该再了解一个概念。 DevOps&#…

3.springcloudalibaba gateway项目搭建

文章目录 前言一、搭建gateway项目1.1 pom配置1.2 新增配置如下 二、新增server服务2.1 pom配置2.2新增测试接口如下 三、测试验证3.1 分别启动两个服务,查看nacos是否注册成功3.2 测试 总结 前言 前面已经完成了springcloudalibaba项目搭建,接下来搭建…

js 之让人迷惑的闭包

文章目录 一、闭包是什么? 🤦‍♂️二、闭包 😎三、使用场景 😁四、使用场景(2) 😁五、闭包的原理六、思考总结一、 更深层次了解闭包,分析以下代码执行过程二、闭包三、闭包定义四、…

每日一题 2578. 最小和分割(简单,模拟)

思路: 拆分 num 的每一位数字,将他们排序。最大的两个放在个位,其次两个放十位,以此类推。注意并不需要重新组合出 num1 和 num2 ,他只要和即可。优化,可以不使用排序,因为只有 0 到 9 一共十个…

【Hello Algorithm】暴力递归到动态规划(一)

暴力递归到动态规划(一) 斐波那契数列的动态规划机器人走路初级递归初级动态规划动态规划 先后选牌问题初级递归初级动态规划动态规划 我们可以一句话总结下动态规划 动态规划本质是一种以空间换时间的行为 如果你发现有重复调用的过程 在经过一次之后把…

jmeter怎样的脚本设计才能降低资源使用

官网地址:Apache JMeter - Users Manual: Best Practices 1、用好断言 频繁的使用断言会加大资源的消耗,尽可能减少断言的使用,或者在使用的过程中断言数据文本尽量精简 2、使用命令执行 启动的时候就提示我们在执行压测的时候应该用命令执…

自动化测试框架有哪些?怎么选?今天我来告诉你

前言 随着软件开发过程中的复杂度不断提高,自动化测试成为了一个必要的手段。Python作为一种灵活易用的编程语言,已经成为自动化测试领域的一种主流工具。Python自动化测试框架可以使得我们更加方便地进行测试脚本的编写和执行,同时也可以提…

【力扣】2. 两数相加

题目描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都…