Elasticsearch:数据是如何被写入的?

news2024/12/23 7:04:04

在我之前的文章 “Elasticsearch:索引数据是如何完成的”,我详述了如何索引 Elasticsearch 的数据的。在今天的文章中,我将从另外一个视角来诠释如何写入数据到 Elasticsearch。更多关于 Elasticsearch 数据操作,请阅读文章 “Elasticsearch:彻底理解 Elasticsearch 数据操作”。

发送写请求时,它会通过我们路由机制。 此过程有助于确定哪个复制组(主分片及其副本分片统称为复制组,详细请阅读文章 “Elasticsearch:复制 - replication”)存储当前文档。

在写请求时,是有区别的。 写入请求直接发送到主分片,而不是复制组的任何分片。 写操作由这个主分片处理。

主分片的第一项工作是验证请求。 它检查请求的结构并验证字段值。 例如,尝试将一个类型为对象的字段输入到一个只应包含数字的字段中将导致主分片出现验证错误。

一旦请求通过了验证阶段,主分片就会在本地开始写入操作。 它确保数据在其自己的副本分片中正确写入和更新。

Elasticsearch通过这种方式保证数据准确高效地写入到复制组内的相关分片中。

 

为了提高性能,主分片将操作并行发送到其副本分片。重要的是要记住,即使无法复制到副本分片,该操作仍然会成功。

因此,简而言之,当收到写入请求时,它会被定向到主分片。 主分片验证操作,在本地执行,然后将其分发到其副本分片(如果适用)。

这是写入模型的高级概述,但让我们更深入地了解 Elasticsearch 如何处理数据复制错误。

由于 Elasticsearch 是分布式的,很多操作是异步发生的,所以可能会遇到硬件故障等问题。 不幸的是,这些故障随时可能发生并导致重大中断。 让我举个例子来证明这一点:

假设我们收到了一个要索引的新文档。 主分片处理操作验证和本地文档索引。 我们的复制组中有两个副本分片,主分片将操作传递给它们。

不幸的是,主分片在操作到达副本分片之一之前失败,这可能是由于硬件问题。

发生这种情况时,Elasticsearch 会启动恢复过程。 我不会详细介绍这个过程的复杂细节,因为它非常复杂。 但是,我可以告诉你,它涉及提升其中一个副本分片成为新的主分片,因为每个复制组都需要一个主分片。

 

这就是问题出现的地方。 剩下的两个分片没有相同的状态,因为其中一个成功地索引了新文档,而另一个则错过了。

没有接收到索引操作的副本分片误认为是最新的,但事实并非如此。

正如你可以想象的那样,从这一点开始,事情开始变得有些奇怪。 新文档只能有50%的几率被搜索到(这是因为 replica B2 不含有这个文档 ),这取决于哪个分片服务于检索它的请求。 这是一个非常混乱的情况!

这只是可能发生的潜在陷阱之一。 事实上,在任何给定时间,很多事情都可能出错。 虽然此类事件发生的可能性相对较低,但 Elasticsearch 为它们做好准备至关重要。 随着集群规模的增长以及节点数量的增加以及写入索引的数据量的增加,这一点变得更加重要。

幸运的是,Elasticsearch 通过称为 “Primary Terms and Sequence Numbers - 主要术语和序列号” 的功能解决了这些挑战和其他几个挑战。 在不深入研究错综复杂的技术的情况下,让我为你提供对这些概念的一般理解。

 Primary terms 是 Elasticsearch 在复制组的主分片发生变化时区分新旧主分片的一种方式。

复制组的 Primary terms 本质上只是主分片更改次数的计数器。

在你刚刚看到的示例中,复制组的主项将增加 1,因为主分片发生故障,其中一个副本分片被提升为新的主分片。

 

 

所有复制组的主要术语都保存在集群的状态中。 作为写操作的一部分发生的是,当前的 primary terms 被附加到发送到副本分片的操作。 这使副本分片能够判断主分片在转发操作后是否发生了变化。

虽然这种机制有助于 Elasticsearch 避免某些问题,但它本身是不够的。 除了将每个操作与 primary terms 相关联之外,还为每个操作分配了一个序列号。 这个序列号充当一个计数器,随着每个操作递增,至少直到主分片发生变化。

主分片负责在处理写入请求时增加序列号。 序列号帮助 Elasticsearch 跟踪特定主分片上发生的操作的顺序。

Primary terms 和序列号(sequence number)使 Elasticsearch 能够从主要分片发生变化的情况下恢复,例如由于网络错误。

它不是比较磁盘上的数据,而是可以使用主要术语和序列号来确定哪些操作已经完成,哪些是更新特定分片所必需的。

但是,在使用大型索引时,比较数百万个操作会出现问题,尤其是在高速索引和查询数据时。 为了加快这个过程,Elasticsearch 保留了全局和本地检查点,它们只是序列号。

每个复制组都有一个全局检查点,每个副本分片都有一个本地检查点。 全局检查点是复制组中所有活动分片达到或超过的序列号。 这意味着任何序列号低于全局检查点的操作都已经在复制组中的所有分片上执行过。

如果主分片失败并稍后重新加入集群,Elasticsearch 只需要比较它知道的最后一个全局检查点之后发生的操作。 类似地,如果副本分片失败,则只有序列号大于其本地检查点的操作在返回时才必须执行。

本质上,Elasticsearch 只需要检查分片无法恢复时发生的操作,而不是查看复制组的完整历史记录。 当然,这个过程有额外的复杂性,但我不想让你厌烦。

现在你已经了解了主要术语、序列号和检查点的基础知识,你应该能够很好地跟进。 请记住,主要术语和序列号在对写入请求的响应和使用其 ID 访问文档时都可用。

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

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

相关文章

PowerShell install 一键部署postgres15

postgres 前言 PostgreSQL 是一个功能强大的开源对象关系数据库系统,拥有超过 35 年的积极开发经验 这为其赢得了可靠性、功能稳健性和性能的良好声誉。 通过官方文档可以找到大量描述如何安装和使用 PostgreSQL 的信息。 开源社区提供了许多有用的地方来熟悉Postg…

08 【生命周期 组件】

1. 生命周期 1.1 引出生命周期 生命周期 又名生命周期回调函数,生命周期函数、生命周期钩子是什么,Vue在关键时刻帮我们调用的一些特殊名称函数生命周期函数的名字不可更改,但函数的具体内容是根据程序员需求编写的生命周期函数中的this指向的是vm或组件实例对象 <div i…

贺斌教授团队:多少冥想训练才能提高脑机接口的性能?

冥想训练可以帮助人们学会更好地控制脑机接口。但是一项新的研究发现&#xff0c;单次的冥想练习不足以提高表现。发表在《Frontiers in Human Neuroscience》的一项研究结果表明&#xff0c;人们需要更长时间的冥想才能体验到明显的改善。 # 脑机接口性能如何提高&#xff1f;…

kafka 集群是如何选择 leader,你知道吗?

前言 kafka集群是由多个broker节点组成&#xff0c;这里面包含了许多的知识点&#xff0c;以下的这些问题你都知道吗? 你知道topic的分区leader是怎么选举的吗&#xff1f; 你知道zookeeper中存储了kafka的什么信息吗&#xff1f;起到什么做呢&#xff1f; 你知道kafka消息…

基于matlab地形可视化仿真

一、前言 此示例说明了将常规可用的数字高程模型转换为 X3D 格式以用于虚拟现实场景的可能性。 作为地形数据源&#xff0c;已使用南旧金山 DEM 模型。场景中包含一个简单的预制波音 747 模型&#xff0c;以展示从多个来源即时创建虚拟场景的技术。 此示例需要映射工具箱。 二、…

高通全面进攻智能汽车「路径」

“统一技术路线图”&#xff0c;被高通技术公司高级副总裁兼汽车业务总经理Nakul Duggal着重提及。 5月26日&#xff0c;高通在苏州举办汽车技术与合作峰会&#xff0c;Nakul Duggal在峰会上坦言&#xff0c;“我们在所有业务领域、所有产品开发中都遵循‘统一技术路线图’&am…

【owt】WebrtcNode, publish-sdp offer 流程(2)

流程图 创建MediaStream&#xff0c; MediaStream一方面作为从客户端接收到媒体数据&#xff0c;另外一方面做为视频源&#xff1b;创建VideoFrameConstructor&#xff0c;VideoFrameConstructor 把sink 注册到MediaStream&#xff0c;这样MediaStream&#xff08;继承了MediaS…

运维小白必学篇之基础篇第七集:磁盘管理实验

磁盘管理实验 实验作业&#xff1a; 1、添加1块磁盘&#xff0c;并查看&#xff08;lsblk&#xff09; 2、使用MBR分区表的格式对添加的磁盘划分分区&#xff0c;完成以下操作&#xff1a; 1、创建3个主分区&#xff0c;每个分区大小为2个GB 2、创建扩展分区&#xff0c;将剩…

前端技术搭建俄罗斯方块(内含源码)

The sand accumulates to form a pagoda ✨ 写在前面✨ 功能介绍✨ 页面搭建✨ 样式设置✨ 逻辑部分 ✨ 写在前面 上周我们实通过前端基础实现了扫雷游戏&#xff0c;今天还是继续按照我们原定的节奏来带领大家完成俄罗斯方块游戏&#xff0c;功能也比较简单简单&#xff0c;也…

【源码篇】基于SSM的办公管理系统

1、项目介绍 基于SSM的办公管理系统主要是对于办公用品的申领进行管理&#xff0c;系统分为三种角色&#xff0c;超级管理员、企业职工、审核员&#xff0c;每种角色拥有不同的权限菜单 主要功能模块有&#xff1a; 系统管理(用户管理、角色管理、菜单管理、个人信息管理、修…

ArrayList源码

介绍 ArrayList非线程安全。ArrayList基于动态数组&#xff0c;是一种线性表。随机访问友好&#xff0c;插入和删除效率低。 ​ 增删慢&#xff1a;每次删除元素&#xff0c;都需要改变数组长度、拷贝以及移动数组长度 ​ 查询快&#xff1a;由于数组在内存中是一块连续空间…

Python实战基础20-解密文件及目录操作

任务1 为泸州驰援湖北的89名白衣勇士点赞 【任务描述】 设计python程序&#xff0c;实现用户可以为泸州驰援湖北的89名白衣勇士点赞留言。用户点赞留言内容保存到本地txt文件中。 import os # 导入os模块 import random # 导入随机模块 import string # 导入string模块# 定义…

序列化与反序列化深入理解

序列化与反序列化深入理解 1 介绍1.1 概述1.2 序列化实现的需求 2 常用序列化实现函数序列化语言内置开源序列化实现 3 各序列化实现比较4 各序列化实现概述XMLJSONProtobufJava 内置TLVVLE&#xff08;Variable Length Encoding&#xff09; 5 flex & bison5.1 介绍应用解…

MyBatis-4

MyBatis 工作原理 形式上的应用为&#xff1a; UserMapper userMapper MyBatisSessionFactory.getMapper(UserMapper.class); List<User> userList userMapper.selectByExample(example)真正执行的操作为: SqlSession session MyBatisSessionFactory.getSession();…

聊天更有趣ChatGPT【再次更新】第三方插件

ChatGPT再次更新&#xff0c;第三方插件让你的聊天更有趣 你是否曾经想过&#xff0c;如果你能够和你最喜欢的明星、作家或者历史人物聊天&#xff0c;会是什么样的体验&#xff1f;你是否曾经想过&#xff0c;如果你能够和你的朋友一起玩一些有趣的游戏、挑战或者测试&#x…

spring注解驱动开发(BEAN注册方式与生命周期)

目录 容器中注册BEAN的方式 BEAN生命周期 容器中注册BEAN的方式 包扫描组件标注注解 ComponentScan(basePackages {"com.an.spring.condition"}) Service Component Controller RepositoryBEan方式【导入第三方包里面的组件】 ComponentScan(basePackages {&quo…

chatgpt赋能python:Python处理雷达数据

Python处理雷达数据 雷达技术是一种主要用于测量目标距离、速度和方位的技术。在雷达系统中&#xff0c;雷达接收器接收到的信号经过一系列的处理才能得到有效的数据。在这一过程中&#xff0c;Python语言得到了广泛应用。本文将介绍Python如何处理雷达数据。 雷达数据的格式…

linuxOPS基础_ssh概念详解

ssh 什么是SSH SSH&#xff08;Secure Shell&#xff0c;安全外壳&#xff09;是一种网络安全协议&#xff0c;通过加密和认证机制实现安全的访问和文件传输等业务。传统远程登录和文件传输方式&#xff0c;例如Telnet、FTP&#xff0c;使用明文传输数据&#xff0c;存在很多…

Openlayers 教程 - 基于 Openlayers api 实现空间查询(客户端):点选、范围查询

Openlayers 教程 - 基于 Openlayers api 实现空间查询&#xff08;客户端&#xff09;&#xff1a;点选、范围查询 客户端空间查询核心代码在线示例 客户端空间查询 在地理信息系统中&#xff0c;空间查询有的非常重要的作用&#xff0c;几乎所有地图相关的业务系统都需要空间…

青少年C++编程等考有这么多??机构到底该带孩子考哪个?

随着信息学的普及与发展&#xff0c;越来越多的孩子开始学习C&#xff0c;参加编程等考来检验C的学习成果、作为也逐渐成为了一个共识&#xff0c;跟C有关的等考究竟有哪些&#xff0c;哪个等考含金量够高&#xff0c;能够客观、有效地检验学习成果呢&#xff1f; 在这里整理了…