elasticsearch select 分片移动中的目标节点如何?
how does elasticsearch select destination node in shard movement?
我有一个大型 ES 集群。我通常会收到磁盘警报,因为我们将磁盘警报策略设置为 90% [我的 ES 高水位线设置为 87%]。当我查看分片分配时,我看到节点从高磁盘使用率节点移出到某个随机节点,这可以快速解决我的磁盘问题,但通常不会将该分片移动到磁盘使用率最低的节点。是否可以强制 elasticsearch 将分片移动到磁盘使用率最低的节点,而不是在达到高水位线时将其移动到随机节点?
实际上 ES 不使用它考虑的随机决定 a lot of factors:
- MaxRetryAllocationDecider - 防止碎片被分配
任何节点,如果分片分配已经重试 N 次而没有
成功
- NodeVersionAllocationDecider - 防止从可能不是的节点重新定位或分配
版本兼容。
- SameShardAllocationDecider - 防止在同一节点上分配同一分片的多个实例。
- DiskThresholdDecider - 检查分片可能分配到的节点是否有足够的磁盘 space。
- ShardsLimitAllocationDecider - 在每个索引或节点范围内限制每个节点的分片数量。
- AwarenessAllocationDecider - 根据节点配置中定义的感知键值对控制分片分配。
如您所见,有很多因素并且没有低盘 space 跳棋。所以唯一的解决方案是编写 your own plugin 扩展 org.elasticsearch.plugins.ClusterPlugin
它将提供你的决策者。但我认为这不是一个好主意,因为它与 ES 分配决策模式的主要 design/idea 相矛盾:
- 任何决策者都可以否决之前所有决策者的决策
- 任何正解不影响后续决策
- 大部分决策者使用本地节点数据
此策略允许您禁止,旨在最大限度地提高集群内的选择自由度。这就是为什么从外面看起来像是随机移动的原因。对于大型且长期存在的集群来说,这是一个很好的策略。
任何类型的偏差的引入都可能导致生产中的灾难性问题。假设您有基于磁盘 space 的决策器,并且一台服务器具有非常大的 HDD - 一段时间后,所有分片都将分配到这台机器上。为了解决这个问题,有必要考虑更重要的资源,如 CPU、内存、网络、分片数量等。此外,我们需要为每个因素提出一个指标和权重。
我有一个大型 ES 集群。我通常会收到磁盘警报,因为我们将磁盘警报策略设置为 90% [我的 ES 高水位线设置为 87%]。当我查看分片分配时,我看到节点从高磁盘使用率节点移出到某个随机节点,这可以快速解决我的磁盘问题,但通常不会将该分片移动到磁盘使用率最低的节点。是否可以强制 elasticsearch 将分片移动到磁盘使用率最低的节点,而不是在达到高水位线时将其移动到随机节点?
实际上 ES 不使用它考虑的随机决定 a lot of factors:
- MaxRetryAllocationDecider - 防止碎片被分配 任何节点,如果分片分配已经重试 N 次而没有 成功
- NodeVersionAllocationDecider - 防止从可能不是的节点重新定位或分配 版本兼容。
- SameShardAllocationDecider - 防止在同一节点上分配同一分片的多个实例。
- DiskThresholdDecider - 检查分片可能分配到的节点是否有足够的磁盘 space。
- ShardsLimitAllocationDecider - 在每个索引或节点范围内限制每个节点的分片数量。
- AwarenessAllocationDecider - 根据节点配置中定义的感知键值对控制分片分配。
如您所见,有很多因素并且没有低盘 space 跳棋。所以唯一的解决方案是编写 your own plugin 扩展 org.elasticsearch.plugins.ClusterPlugin
它将提供你的决策者。但我认为这不是一个好主意,因为它与 ES 分配决策模式的主要 design/idea 相矛盾:
- 任何决策者都可以否决之前所有决策者的决策
- 任何正解不影响后续决策
- 大部分决策者使用本地节点数据
此策略允许您禁止,旨在最大限度地提高集群内的选择自由度。这就是为什么从外面看起来像是随机移动的原因。对于大型且长期存在的集群来说,这是一个很好的策略。
任何类型的偏差的引入都可能导致生产中的灾难性问题。假设您有基于磁盘 space 的决策器,并且一台服务器具有非常大的 HDD - 一段时间后,所有分片都将分配到这台机器上。为了解决这个问题,有必要考虑更重要的资源,如 CPU、内存、网络、分片数量等。此外,我们需要为每个因素提出一个指标和权重。