什么是分片
集群由多个节点组成,每个节点上有多个索引
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。可以很方便的实现根据配置和人工干预调整分片分配策略。
作用:文章来源:https://www.toymoban.com/news/detail-859502.html
- canAllocate 给定分片是否可以分配到节点,disk 85%,exclude,shard数量限制,sameshard
- canRemain 给定分片是否可以保留在所在节点exclude,disk 90
- canRebalance 给定分片是否可以rebalance 并发配置
权重函数
该函数确保所有节点拥有相同数量的分片,并且每个索引的分片分布在节点之间。如果一个节点持有太多分片,它与每节点平均分片的偏差很大,这会增加分片权重因子。如果一个索引的太多分片落在同一个节点上,它与每节点平均分片对索引的偏差就会增加,从而增加索引权重因子。这两者都增加了节点上分片的整体权重,分片将会被移动到权重较小的节点。对于大多数用例来说,这是一个合理的信号。与具有较少分片的节点相比,具有更多分片的节点获得更多流量,并且具有更多的磁盘、CPU 和内存消耗。分片计数是一个统一的信号。 JVM 堆、CPU 或内存消耗等指标波动非常频繁.文章来源地址https://www.toymoban.com/news/detail-859502.html
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
到了这里,关于【ElasticSearch】分片分配策略详解(设计目标&执行策略)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!