【Elasticsearch】存在数据的分片分配流程梳理

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

由于master节点只保存了cluster级别和indices级别的元数据,但没有shard在哪个node上的元数据,需要走一遍allocation流程确定每个shard分配到哪个节点,allocation使用allocator和deciders进行节点选择,allocator负责整个流程会找出哪些节点可以分配,deciders通过多个decider判断该节点能否分配,很多分片分配的配置都是通过decider实现的,例如primary和replica不能分配在同一个节点、磁盘容量大于85%不能分配。

I. Master node

  1. gateway阶段结束后,触发reroute分配分片
  2. shuffle 所有未分配的分片。作用是避免一些有问题的分片影响其他分片分配。例如,集群分片分配的并发是1,有一个分片因为文件损坏无法分配,如果不进行shuffle,每次分片分配的都是这个有问题的分片,直到到达次数上限
  3. 对unassigned shard按优先级排序,首先比较index.priority,其次是index create time,最后index name。
    没错,鉴权相关的索引优先级最高,确保集群接口最快可用
  4. 首先使用primaryShardAllocator对所有primary进行分配,根据每个shard向所有节点异步发起fetchData请求,拉取shard的元数据
  5. 由于请求是异步的,当前还没有元数据,因此reroute结束

II. Data node

  1. 从磁盘目录加载shard元数据,包含allocationId, boolean primary, discovery node。
  2. 尝试调用Lucene从shard目录打开索引,如果遇到异常则加入返回信息中,例如磁盘故障就会抛出异常
  3. 将allocationId, boolean primary, discovery node,store exception返回给master节点

III. Master node

  1. 当fetchData请求的response返回后,会保存结果,触发reroute来继续分配分片
  2. 将该分片在所有节点的返回结果进行排序,排序依次比较no excepiton 和 primary
  3. 使用deciders将节点分为三组yes(可以分配) no(不能分配) throttled(分配受到并发限制)
  4. 如果yes不为空,则将shard分配给列表中的第一个节点
  5. 如果yes和throttle为空,no不为空,则尝试是否能够forceAllocate,forceAllocate会将no返回为yes,yes和throttle正常返回
  6. 如果结果为yes则将分片分配给对应节点,更新相关数据结构,否则分片标记ignore,避免分片走到新建分片分配流程
  7. 遍历replica shard,使用replicaShardAllocator进行allocate
  8. 先通过deciders判断一下,是否至少有一个节点可以分配shard,如果分配不了就省略后面逻辑
  9. 和primary一样,拉取分片元数据,不过元数据不同

IV. Data node

  1. 从内存或者磁盘获取StoreFilesMetadata,其中包含retention lease, MetadataSnapshot(shard Lucene文件元数据)
  2. 返回StoreFilesMetadata给master

V. Master node

  1. 需要对返回结果的node按照replica数据的落后程度进行排序,优先数据较全的。最匹配的节点的排序方式是

    • 无需回放操作(replica SeqNo(从retention lease获取) > primary SeqNo或者replica sync flush id = primary https://www.elastic.co/guide/en/elasticsearch/reference/6.0/indices-synced-flush.html) 。顺便说一句,Elasticsearch 跟踪每个分片的索引活动。 5 分钟内未收到任何索引操作的分片将自动标记为非活动状态。 这为 Elasticsearch 提供了减少分片占用资源并执行一种特殊类型的刷新(称为synced flush)的机会。 同步刷新执行正常刷新,然后将生成的唯一标记(sync_id)添加到所有分片。

      由于sync id标记是在没有正在进行的索引操作时添加的,因此它可以用作检查两个分片的 lucene 索引是否相同的快速方法。 这种快速sync ID 比较(如果存在)在恢复或重新启动期间使用,以跳过该过程的第一个也是成本最高的阶段。 在这种情况下,不需要复制段文件,并且可以立即开始恢复的事务日志重播阶段。 请注意,由于sync ID 标记与刷新一起应用,因此事务日志很可能为空,从而进一步加快恢复速度。

    • retenton lease的seq No较大(意味着需要回放的操作少)

    • Checksum相同的文件大小较大的

  2. 使用decider对最匹配的节点进行决策,如果throttle则返回,如果是yes或者no则返回yes

  3. 如果最匹配的节点都没有数据则replica shard进行延迟分配

  4. reroute完成后构建集群新的状态。最后master将新的集群状态广播下去文章来源地址https://www.toymoban.com/news/detail-786799.html

VI. Data node

  1. 数据节点收到cluster state change后,应用变化,创建或更新shard
  2. 节点上无该shard时,createshard,进行shard recovery,主分片从本地恢复,副本从主分片恢复

总结

  1. fetch data过程会发送shard num * node num个请求,并且会将结果保存在内存中。当集群规模较大时,master节点内存会被打满,150节点 7w分片 master节点10GB内存时就出现过。可以考虑将sync allocation id和node的映射保存在cluster state,或者按分片并发数进行限流
  2. 利用retention lease和synced id加速replica的恢复过程,synced id用于快速比较,retention lease减少回放的doc数。有个问题是为什么不通过sync allocation id列表来给replica排序呢

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

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

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

相关文章

  • 记录ElasticSearch分片被锁定导致无法分配处理过程

    本篇文章记录最近ES做节点替换, 从shard 迁移过程中被锁定导致无法分配, 主shard正常 ,希望可以帮助其它人 failed to create shard,failed to obtain in-memory shard lock,ShardLockObtainFailedException 这次遇到的问题比较特殊,尝试过以下几种手段都没有恢复: _cluster/reroute手动分片shard 由于

    2024年02月05日
    浏览(41)
  • Elasticsearch基础篇(七):分片大小修改和路由分配规则

    在Elasticsearch中,分片是对索引数据的水平划分和分布。索引被分成多个分片,每个分片可以在集群的不同节点上存储。这种分片的设计提供了一种水平扩展的能力,允许将大量数据分布到多个节点上,从而提高性能和可伸缩性。每个分片就是一个Lucene的实例,具有完整的功能

    2024年01月21日
    浏览(60)
  • 【Elasticsearch】索引恢复(recovery)流程梳理之EXISTING_STORE索引数据恢复

    索引recovery是指索引数据恢复,包含以下几种类型 EMPTY_STORE, 索引没有数据,一般是新建索引的情况,不用恢复数据 EXISTING_STORE, 从本地存储的数据恢复,例如集群重启primary shard进行数据恢复 PEER, 从另一个节点恢复数据,例如集群重启replica从primary恢复数据;primary进行relocat

    2024年01月18日
    浏览(56)
  • Elasticsearch:如何使用集群级别的分片分配过滤(不包括节点)安全地停用节点

    当你想停用 Elasticsearch 中的节点时,通常的过程不是直接销毁节点。 如果你这样做,那么你就有数据丢失的风险,这不是你想要对应该是可靠的数据库做的事情。 这样做的问题是,节点很可能会通过 Elasticsearch 处理的恰当命名的分片分配分配给它们的分片。 Elasticsearch 中的

    2024年02月07日
    浏览(46)
  • ElasticSearch学习笔记-第四章 ES分片原理以及读写流程详解

    在学习ES分片原理以及读写流程之前,需要先学习一些ES的核心概念以及ES集群环境的相关知识 4.1 ES核心概念 4.1.1 索引 索引(Index)相当于MySQL中的数据库,一个索引就是一个拥有几分相似特征的文档的集合。 4.1.2 类型 类型(Type)相当于MySQL中的表,一个类型就是索引的一个逻辑上

    2024年02月06日
    浏览(62)
  • ElasticSearch 数据分片

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

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

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

    2024年02月06日
    浏览(52)
  • ElasticSearch数据库修改分片数、副本数及修改mapping字段

            对于已经存在的索引,副本数可以随时修改。 示例演示如下:         ElasticSearch中的数据会被分别存储在不同的分片上,索引库的分片数量是在索引库创建的时候通过settings去设置的,如果不设置,分片数默认是5,分片数一旦确定就不能改变。分片数量的设

    2024年02月02日
    浏览(48)
  • Elasticsearch的集群负载均衡与分片分片

    Elasticsearch是一个分布式、实时的搜索和分析引擎,它可以处理大量数据并提供快速、准确的搜索结果。在大规模应用中,Elasticsearch的性能和可用性是关键因素。为了确保高性能和高可用性,Elasticsearch需要实现集群负载均衡和分片分片。 在本文中,我们将深入探讨Elasticsear

    2024年04月25日
    浏览(43)
  • Elasticsearch查询分片信息

    2024年02月15日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包