深入理解Elasticsearch分片

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

前言

了解分片的基本原理,对Elasticsearch性能调优有帮助。

关系梳理

ES底层使用的是Lucene库,ES的分片(shard )是Lucene的索引,ES的索引是分片的集合,Lucene的索引是由多个段(segment)组成。

elasticsearch 分片,数据库,大数据,elasticsearch,lucene,大数据,全文检索

段(segment)

Per-segment search,也即按段搜索,是Lucene中的概念。每个段本身就是一个倒排索引,Lucene中的索引除了表示段的集合外,还增加了提交点的概念,一个提交点就是一个列出了所有已知段的文件。

elasticsearch 分片,数据库,大数据,elasticsearch,lucene,大数据,全文检索

Per-segment search的工作流程如下:

  1. 新的文档首先被写入内存区的索引缓存(buffer)。
  2. 不时,这些buffer被提交。
  3. 新段被打开,它包含的文档可以被检索。
  4. 内存的缓存被清除,等待接收新的文档。

elasticsearch 分片,数据库,大数据,elasticsearch,lucene,大数据,全文检索

elasticsearch 分片,数据库,大数据,elasticsearch,lucene,大数据,全文检索

提交

一次完整的提交会将段刷到磁盘,并写入一个包含所有段列表的提交点。ES在启动或重新打开一个索引的过程中使用这个提交点来判断哪些段隶属于当前分片。

不可变性

写入磁盘的倒排索引是不可变的,也即段是不可改变的,所以既不能把文档从旧的段中移除,也不能修改旧的段来更新文档。取而代之的是,每个提交点会包含一个 .del 文件,它记录了段中被删除的文档。

当一个文档被 “删除” 时,它实际上只是在 .del 文件中被标记为删除。一个被标记为删除的文档仍然可以被查询匹配到,但它会在最终结果被返回前从结果集中移除。

文档更新也是类似的操作方式:当一个文档被更新时,旧版本文档被标记为删除,文档的新版本被索引到一个新的段中。 可能两个版本的文档都会被一个查询匹配到,但被删除的那个旧版本文档在结果集返回前会被移除。

近实时搜索

提交一个新的段到磁盘需要调操作系统的fsync方法,确保段被物理地写入磁盘,即使断电也不会丢失数据。但是fsync是昂贵的,它不能在每个文档被索引时就触发。所以需要一种更轻量级的方式使新的文档可以被搜索。

位于ES和磁盘间的是文件系统缓存。在内存索引缓存中的文档被写入新的段,新的段首先写入文件系统缓存,这代价很低,之后会被同步到磁盘,这代价很大。一旦一个文件被缓存,它也可以被打开和读取,就像其他文件一样。

elasticsearch 分片,数据库,大数据,elasticsearch,lucene,大数据,全文检索

elasticsearch 分片,数据库,大数据,elasticsearch,lucene,大数据,全文检索

Refresh

在ES中,refresh是指这样一个过程:将In-memory buffer中的文档写入到文件系统缓存中新的段,新的段被打开(可被搜索)。默认情况下每个分片会每秒自动刷新一次。文档在In-memory buffer中是不能被搜索的,写入到段里面才能被搜索。这就是为什么我们说Elasticsearch是近实时搜索: 文档的变化并不是立即对搜索可见,但会在一秒之内变为可见。

Flush

在ES中,进行一次提交并删除事务日志的操作叫做flush。一些老资料说ES每30分钟flush一次,或者事务日志过大也会flush。官网最新的说法是ES根据需要自动触发刷新,主要取决于事务日志的大小和权衡执行flush的成本。也可以调用flush API主动flush。

Translog

Translog全称transaction log(事务日志)。事务日志主要是为了防止在两次提交之间的数据丢失。事务日志也被用来提供实时 CRUD ,当你通过文档ID查询、更新、删除一个文档,在从相应的段检索之前, ES会首先检查事务日志最新的改动,这意味着ES总是能够通过文档ID实时地获取到文档的最新版本。

事务日志并不是实时落盘的,而是定期刷到磁盘。所以事务日志其实也是存在丢失的可能性的。那么这里就有一个问题,既然调用fsync的提交是一种昂贵的操作,为了防止数据丢失引入了事务日志,但是事务日志也需要刷到磁盘才能保证数据不丢,那事务日志的意义何在?答案是事务日志的刷盘更轻量级,因为它调用的是fdatasync这个系统函数,而不是fsync。感兴趣的朋友可以了解下fsync和fdatasync的差别。

完整流程

我们将上述知识点串起来得到完整流程。

  1. 当一个文档被索引,它被加入到内存缓存,同时写入事务日志。

elasticsearch 分片,数据库,大数据,elasticsearch,lucene,大数据,全文检索

  1. 分片每秒都进行refresh。refresh后,内存缓冲区的文档被写入到文件系统缓存;段被打开,使得新的文档可以被搜索;缓存被清除。

elasticsearch 分片,数据库,大数据,elasticsearch,lucene,大数据,全文检索

  1. 更多的文档加入到缓冲区,写入事务日志,这个过程会持续。

elasticsearch 分片,数据库,大数据,elasticsearch,lucene,大数据,全文检索

  1. 不时的,比如事务日志很大了,会进行一次全提交。内存缓冲区的所有文档会写入到新的段中;缓冲区被清空;一个提交点写入磁盘;文件系统缓存通过fsync操作flush到磁盘;事务日志被清除。

elasticsearch 分片,数据库,大数据,elasticsearch,lucene,大数据,全文检索

合并段

通过每秒自动刷新创建新的段,用不了多久段的数量就爆炸了。每个段都会消费文件句柄、内存、CPU资源。更重要的是,每次搜索请求都需要依次检查每个段。段越多,查询越慢。

ES通过后台合并段解决这个问题。小段被合并成大段,再合并成更大的段。合并段时会真正删除被标记为已删除的文档。旧的段不会再复制到更大的新段中。这个过程你不必做什么,当你在索引和搜索时ES会自动处理。这个过程不会中断索引和搜索。

两个提交的段和一个未提交的段合并为了一个更大的段。

elasticsearch 分片,数据库,大数据,elasticsearch,lucene,大数据,全文检索

这期间发生一系列操作:新的段flush到了硬盘;新的提交点写入新的段,排除旧的段;新的段打开供搜索;旧的段被删除。

elasticsearch 分片,数据库,大数据,elasticsearch,lucene,大数据,全文检索

合并大的段会消耗很多IO和CPU,如果不合并又会影响到搜索性能。默认情况下,ES会限制合并过程,这样搜索就可以有足够的资源进行。optimize API可以强制合并段。文章来源地址https://www.toymoban.com/news/detail-813741.html

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

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

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

相关文章

  • 【天衍系列 04】深入理解Flink的ElasticsearchSink组件:实时数据流如何无缝地流向Elasticsearch

    【天衍系列 04】深入理解Flink的ElasticsearchSink组件:实时数据流如何无缝地流向Elasticsearch

    Flink的Elasticsearch Sink是用于将Flink数据流(DataStream)中的数据发送到Elasticsearch的组件。它是Flink的一个连接器(Connector),用于实现将实时处理的结果或数据持续地写入Elasticsearch集群中的索引中。 下面是一些关于Flink的Elasticsearch Sink的基础概念: 数据源(Source) :Flink数据流

    2024年02月20日
    浏览(12)
  • 使用 Elasticsearch 作为向量数据库:深入研究 dense_vector 和 script_score

    使用 Elasticsearch 作为向量数据库:深入研究 dense_vector 和 script_score

    Elasticsearch 是一个非常强大且灵活的搜索和分析引擎。 虽然其主要用例围绕全文搜索,但它的用途广泛,足以用于各种其他功能。 其中一项引起许多开发人员和数据科学家关注的功能是使用 Elasticsearch 作为向量数据库。 随着 dense_vector 数据类型的出现以及利用 script_score 函数

    2024年02月07日
    浏览(12)
  • 深入理解Elasticsearch

    Elasticsearch是一个分布式、实时的搜索和分析引擎,基于Lucene库开发。它可以处理大量数据,提供快速、准确的搜索结果。在本文中,我们将深入探讨Elasticsearch的核心概念、算法原理、最佳实践和实际应用场景。 Elasticsearch起源于2010年,由Elastic Company开发。它初衷是解决实时

    2024年02月19日
    浏览(11)
  • ElasticSearch 数据分片

    ElasticSearch 数据分片

    一、ElasticSearch 分片 ElasticSearch集群中有许多个节点(Node),每一个节点实例就是一个实例;数据分布在分片之间。集群的容量和性能主要取决于分片如何在节点上如何分配。将数据分片是为了提高可处理的容量和易于进行水平扩展,为分片做副本是为了提高集群的稳定性和提高

    2024年02月03日
    浏览(12)
  • 【ES】Elasticsearch-深入理解索引原理

    【ES】Elasticsearch-深入理解索引原理

    索引(Index) ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库,或者一个数据存储方案(schema)。索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新

    2024年02月04日
    浏览(10)
  • 深入理解Elasticsearch的索引映射(mapping)

    当我们谈论Elasticsearch时,索引映射是一个核心概念,它定义了如何存储和检索数据。在Elasticsearch 7.6及更高版本中,映射提供了一系列强大的功能,使您能够精确地控制数据的结构和行为。本文将详细介绍映射的关键属性、用途以及如何正确设置和优化它。 在Elasticsearch中,

    2024年02月22日
    浏览(12)
  • 【Elasticsearch】存在数据的分片分配流程梳理

    由于master节点只保存了cluster级别和indices级别的元数据,但没有shard在哪个node上的元数据,需要走一遍allocation流程确定每个shard分配到哪个节点,allocation使用allocator和deciders进行节点选择,allocator负责整个流程会找出哪些节点可以分配,deciders通过多个decider判断该节点能否分

    2024年02月02日
    浏览(37)
  • Elasticsearch深入理解 并发写入导致版本冲突解决方案【实战】

    Elasticsearch深入理解 并发写入导致版本冲突解决方案【实战】

         数据同步中,在使用阿里云Elasticsearch7.10.0版本的集群作为目标数据源时,在连续写入同一文档(document)出现版本冲突问题。 注意:以下所述均以阿里云7.10.0版本的Elasticsearch集群为前提(不同版本可能会稍有不同)       以生产环境的错误日志信息为例: ElasticsearchSta

    2023年04月18日
    浏览(9)
  • 【Elasticsearch】索引恢复(recovery)流程梳理之副本分片数据恢复

    【Elasticsearch】索引恢复(recovery)流程梳理之副本分片数据恢复

    也是因为应用新的集群状态触发recovery,进入index阶段 进入translog 阶段。先尝试重放本地的translog到global checkpoint 向primary shard发起start recovery的请求,请求包含replica的localCheckpoint+1。(如果第二步重放translog了,localCheckpoint自然也会增加) 如果开启了soft delete并且索引是7.4版本

    2024年01月20日
    浏览(27)
  • Elasticsearch集群搭建、数据分片以及位置坐标实现附近的人搜索

    es使用两种不同的方式来发现对方: 广播 单播 也可以同时使用两者,但默认的广播,单播需要已知节点列表来完成 当es实例启动的时候,它发送了广播的ping请求到地址 224.2.2.4:54328 。而其他的es实例使用同样的集群名称响应了这个请求。 一般这个默认的集群名称就是上面的

    2024年02月06日
    浏览(12)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包