什么是分片

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

分片的作用是什么

提供集群横向扩展能力。通过将索引中的文档分布在多个分片上,并将这些分片分布在多个节点上,当数据量增大时增加分片数量,再增加节点数量,从而提供集群横向扩展能力。 提供高可用。Elasticsearch 可以确保冗余,这既可以防止硬件故障,又可以在将节点添加到集群时增加查询容量,因为主和副都可以被查询,分摊查询流量。 提升查询容量。当数据量上涨时,可以通过增加分片数和机器数解决

分片分配的目标

集群所有节点负载一致。

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

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

什么时候会分配分片

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

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

控制分片分配的组件

ShardsAllocator

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

作用

allocateUnassigned

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

流程:

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

moveShards

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

流程:

遍历所有已分配分片 使用所有decider的canRemain判断是否需要迁移 若需要迁移使用allocateUnassigned中的方法找到目标节点 迁移分片到该节点

balance

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

流程:

根据权重函数计算每个索引在每个节点上的权重 根据索引节点间的权重差排序索引 遍历所有索引,优先对权重差大的索引rebalance 对该索引权重最大和最小的两个节点进行迁移分片,直到权重差小于阈值或者尝试迁移遍历完所有节点组 直到遍历完所有索引

Decider

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

作用:

canAllocate 给定分片是否可以分配到节点,disk 85%,exclude,shard数量限制,sameshardcanRemain 给定分片是否可以保留在所在节点exclude,disk 90canRebalance 给定分片是否可以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.45和0.55

# theta0 + theta1 = 1

文章链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。