【ElasticSearch】分片分配策略详解(设计目标&执行策略)

什么是分片

集群由多个节点组成,每个节点上有多个索引
Elasticsearch 索引实际上只是一个或多个物理分片的逻辑分组,其中每个分片实际上是一个独立的索引。分片上的段文件是实际存储的数据。分为主、副,索引中主分片的数量在创建索引时是固定的,但副本分片的数量可以随时更改,而不会中断索引或查询操作。一般通过滚动索引的方式加分片(例如ILM)

在这里插入图片描述

分片的作用是什么

  • 提供集群横向扩展能力。通过将索引中的文档分布在多个分片上,并将这些分片分布在多个节点上,当数据量增大时增加分片数量,再增加节点数量,从而提供集群横向扩展能力。

  • 提供高可用。Elasticsearch 可以确保冗余,这既可以防止硬件故障,又可以在将节点添加到集群时增加查询容量,因为主和副都可以被查询,分摊查询流量。

  • 提升查询容量。当数据量上涨时,可以通过增加分片数和机器数解决

分片分配的目标

集群所有节点负载一致。

每个分片都占用高 CPU、RAM、磁盘和网络使用率等资源,分片的分配也就决定了每个节点的负载,目标是集群所有节点负载一致

Elasticsearch 如何在节点上分配分片影响每一个节点的负载,也就影响集群的性能。如果所有流量都流向一两个节点,因为它们包含集群中的活动索引,那么这些节点将显示高 CPU、RAM、磁盘和网络使用率。而集群中其他数十或数百个节点处于空闲状态。分片接收读写流量,并消耗磁盘、内存、JVM 堆和网络等资源。数据节点上的总体资源消耗(工作负载)取决于它拥有的分片和它们接收的流量。分片的平衡分布对应于均匀的工作负载和高效的节点利用率。在 Elasticsearch 中,这个职责属于 ShardsAllocator 组件。

什么时候会分配分片

集群元数据更改且可能影响分片放置时触发分片分配

  • 创建索引
  • 节点加入或离开集群
  • 分片分配相关配置修改时
  • 索引副本数增加或减少
  • 等等…

控制分片分配的组件

ShardsAllocator

分片分配的入口点。对于分片分配和迁移做出决策。ShardsAllocator 是 Elasticsearch 中的一个接口,其实现负责分片放置。当分片因任何原因未分配时,ShardsAllocator 决定在集群中的哪些节点上放置它们。

作用

allocateUnassigned

根据权重算法和decider决定将未分配的分片分片分配到哪个节点,将分配信息更新到集群状态,由master广播下去。

流程:

  1. 当新索引创建时,其shard均处于未分配状态,该流程会遍历所有分片,根据是否为primary,shardid(小的优先),索引优先级进行排序,这可确保 Elasticsearch 为尽可能多的索引分配所有主索引,而不是创建多个部分分配的索引。一旦 Elasticsearch 分配了所有主索引,它就会移动到每个索引的第一个副本。索引优先级,看索引的priority配置,创建时间和名字。.security7配置了最高的优先级1000,确保优先可用。
  2. 遍历过程中会对每个分片进行分配决策,决策中遍历每个node,先根据权重函数计算权重,再遍历所有decider进行判断(can allocate),例如disk 90% , 已有same shard,total shard per node配置达到阈值
  3. 选择权重最小,decider均通过的节点进行分配分片,更改集群元数据
moveShards

对分片根据decider来判断是否需要迁移,若需要,也根据上述的方法选择节点

流程:

  1. 遍历所有已分配分片

  2. 使用所有decider的canRemain判断是否需要迁移

  3. 若需要迁移使用allocateUnassigned中的方法找到目标节点

  4. 迁移分片到该节点

balance

应对集群扩缩容等情况,根据权重算法平衡集群的节点,平衡过程就是将权重大节点上的分片迁移到权重小的节点,决策也会经过decider。随着集群的增长(或缩小),Elasticsearch 会自动迁移分片以重新平衡集群。当您达到工作负载限制时,您可能会决定添加更多节点来扩展集群。 Elasticsearch 应该自动检测这些节点并重新定位分片以实现更好的分布。使用权重函数进行打分。与具有较低权重值的节点相比,具有高权重值的节点不太适合放置分片。计算每个节点上每个索引的权重,以及索引的最小和最大可能权重之间的差异。优先对权重差最大的索引进行rebalance。避免中间状态影响过大,导致进一步的rebalance。对最大和最小节点上的shard进行relocate,直到差值小于阈值,会使用decider的can rebalance进行判断,直到遍历完所有索引。使得集群更加平衡,但分片迁移消耗资源,在这两点之间进行平衡的参数就是threhold参数。

流程:

  1. 根据权重函数计算每个索引在每个节点上的权重

  2. 根据索引节点间的权重差排序索引

  3. 遍历所有索引,优先对权重差大的索引rebalance

  4. 对该索引权重最大和最小的两个节点进行迁移分片,直到权重差小于阈值或者尝试迁移遍历完所有节点组

  5. 直到遍历完所有索引

Decider

决定分片是否可以在某个节点放置。Decider有多个,所有decider都通过才可以分配。例如ConcurrentRebalanceAllocationDecider,EnableAllocationDecider。可以很方便的实现根据配置和人工干预调整分片分配策略。

作用:

  • canAllocate 给定分片是否可以分配到节点,disk 85%,exclude,shard数量限制,sameshard
  • canRemain 给定分片是否可以保留在所在节点exclude,disk 90
  • canRebalance 给定分片是否可以rebalance 并发配置

权重函数

该函数确保所有节点拥有相同数量的分片,并且每个索引的分片分布在节点之间。如果一个节点持有太多分片,它与每节点平均分片的偏差很大,这会增加分片权重因子。如果一个索引的太多分片落在同一个节点上,它与每节点平均分片对索引的偏差就会增加,从而增加索引权重因子。这两者都增加了节点上分片的整体权重,分片将会被移动到权重较小的节点。对于大多数用例来说,这是一个合理的信号。与具有较少分片的节点相比,具有更多分片的节点获得更多流量,并且具有更多的磁盘、CPU 和内存消耗。分片计数是一个统一的信号。 JVM 堆、CPU 或内存消耗等指标波动非常频繁.

mean-shards-per-node = 
num-of-shards-in-cluster / num-nodes-in-cluster
mean-shards-per-node-for-index = 
num-shards-for-index / num-nodes-in-cluster
total-shard-weight = 
theta0 * (num-shards-on-node – mean-shards-per-node)
index-shard-weight = 
theta1 * (num-index-shards-on-node – mean-shards-per-node-for-index)
Weight (index, node) = total-shard-weight + index-shard-weight
# theta0和theta1是用户自定义的参数,默认0.450.55
# theta0 + theta1 = 1
  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值