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

这篇具有很好参考价值的文章主要介绍了Elasticsearch:数据是如何被写入的?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

现在你已经了解了主要术语、序列号和检查点的基础知识,你应该能够很好地跟进。 请记住,主要术语和序列号在对写入请求的响应和使用其 ID 访问文档时都可用。文章来源地址https://www.toymoban.com/news/detail-477267.html

到了这里,关于Elasticsearch:数据是如何被写入的?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch 基本使用(一)写入数据

    my_index :索引名 _doc :文档类型,现在只有一个类型,都是_doc 1 :文档id(PUT时,必须,POST时不是必须) PUT 为修改操作; 必须指定文档id POST 为保存操作; 指定id时,以该id保存;id存在则修改,不存在则新增。 未指定id时,直接新增,并随机生成一个id。 写入数据时,如果

    2024年02月10日
    浏览(50)
  • ElasticSearch搜索引擎:数据的写入流程

    (1)ES 客户端选择一个节点 node 发送请求过去,这个节点就是协调节点 coordinating node  (2)协调节点对 document 进行路由,通过 hash 算法计算出数据应该落在哪个分片 shard 上,然后根据节点上维护的 shard 信息,将请求转发到对应的实际处理节点node上 shard = hash(document_id) %

    2023年04月14日
    浏览(68)
  • Elasticsearch大数据量写入调优和原理解析

    千万、亿级别数据批量写入ES的调优和原理解析 Elasticsearch version (bin/elasticsearch --version): 7.8   Plugins installed: kibana   JVM version (java -version): java version \\\"1.8.0_102\\\" OS version (uname -a if on a Unix-like system): Linux 4.9.0-4-amd64 #1 SMP Debian 4.9.65-3 (2017-12-03) x86_64 GNU/Linux ES节点:3台,4C16G,JVM8G E

    2023年04月12日
    浏览(48)
  • 项目实战——参数配置化Spark将Hive表的数据写入需要用户名密码认证的ElasticSearch(Java版本)

    项目实战——将Hive表的数据直接导入ElasticSearch    此篇文章不用写代码,简单粗暴,但是相对没有那么灵活;底层采用MapReduce计算框架,导入速度相对较慢! 项目实战——Spark将Hive表的数据写入ElasticSearch(Java版本)    此篇文章需要Java代码,实现功能和篇幅类似,直接

    2023年04月08日
    浏览(62)
  • 如何使用Python给Excel写入数据

    openpyxl三步走 获取work book 获取 work sheet 再然后 获取单元格 进行操作 保存文件 安装OpenpyXl 导包方式以下两种都可以 from openpyxl import Workbook from openpyxl import load_workbook 向工作表中写入数据 保存至文件 最保险的保存方式是调用 save 方法保存到指定文件: 结果如下: 向工作表中

    2024年02月14日
    浏览(39)
  • Slave被误写入数据如何恢复到主库

    在GreatSQL主从复制环境中,有时候可能会出现一些误操作,将本应该写入到主库的数据写入到了从库,导致主从数据不一致,影响数据同步。是否可以将写入从库的数据同步写入主库呢? 角色 IP地址 数据库开放端口 版本 主库 192.168.137.179 3308 GreatSQL 8.0.32 从库 192.168.137.180 33

    2024年03月09日
    浏览(46)
  • python如何操作excel,在excel中读取和写入数据

    Excel 是 Microsoft 为使用 Windows 和 Apple Macintosh 操作系统的电脑编写的一款电子表格软件。直观的界面、出色的计算功能和图表工具,再加上成功的市场营销,使 Excel 成为最流行的个人计算机数据处理软件。在 1993 年,作为 Microsoft Office 的组件发布了5.0版之后, Excel 就开始成为

    2024年02月03日
    浏览(61)
  • 手把手入门MO | 如何使用使用 Spark 将批量数据写入 MatrixOne

    Apache Spark 是一个为高效处理大规模数据而设计的分布式计算引擎。它采用分布式并行计算的方式,将数据拆分、计算、合并的任务分散到多台计算机上,从而实现了高效的数据处理和分析。 大规模数据处理与分析 Spark 能够处理海量数据,通过并行计算任务提高了处理效率。

    2024年02月01日
    浏览(188)
  • 【免杀前置课——PE文件结构】十八、数据目录表及其内容详解——数据目录表(导出表、导入表、IAT表、TLS表)详解;如何在程序在被调试之前反击?TLS反调试(附代码)

    数据目录表:可选PE头最后一个成员,就是数据目录.一共有16个 分别是:导出表、导入表、资源表、异常信息表、安全证书表、重定位表、调试信息表、版权所以表、全局指针表 TLS表、加载配置表、绑定导入表、IAT表、延迟导入表、COM信息表 最后一个保留未使用,默认为0。

    2024年01月15日
    浏览(41)
  • Elasticsearch进阶篇(一):Elasticsearch写入原理深入详解

    引用官方文档地址:分片内部原理 | Elasticsearch: 权威指南 | Elastic 索引是 Elasticsearch 存储、组织和搜索数据的逻辑容器。它类似于 MySQL 中的 数据表 ,一个 Elasticsearch 集群可以包含多个索引。从 Elasticsearch 7.x 开始,Elasticsearch 不再支持多个 type且默认为_doc,并在之后的版本中

    2024年04月10日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包