elasticsearch如何在分片运动中选择目标节点?

时间:2017-10-07 04:01:24

标签: elasticsearch elasticsearch-5

我有一个大型ES群集。我通常得到磁盘警报,因为我们将磁盘警报策略设置为90%[我的ES高水印设置为87%]。当我查看分片分配时,我看到节点从高磁盘使用节点移出到某个随机节点,这可以快速解决我的磁盘问题,但它通常不会将该分片移动到磁盘使用率最低的节点。是否可以强制弹性搜索将分片移动到磁盘使用率最低的节点,而不是在达到高水位时将其移动到随机节点?

1 个答案:

答案 0 :(得分:1)

实际上ES不会使用考虑a lot of factors的随机决策:

  • MaxRetryAllocationDecider - 防止分配分片 任何节点,如果已经重试分片分配N次 成功
  • NodeVersionAllocationDecider - 阻止从可能不是的节点重定位或分配 版本兼容。
  • SameShardAllocationDecider - 防止在同一节点上分配同一分片的多个实例。
  • DiskThresholdDecider - 检查可能分配了分片的节点是否有足够的磁盘空间。
  • ShardsLimitAllocationDecider - 限制每个索引或节点范围内每个节点的分片数。
  • AwarenessAllocationDecider - 根据节点配置中定义的感知键值对控制分片分配。

正如您所看到的,有很多因素,并且没有低磁盘空间检查器。因此,唯一的解决方案是编写your own plugin,其中org.elasticsearch.plugins.ClusterPlugin扩展server_sem,这将提供您的决策。但我认为这不是一个好主意,因为它与ES分配决策模式的主要设计/理念相矛盾:

  • 任何决策者都可以否决所有先前决策者的决定
  • 任何积极的解决方案都不会影响后续决定
  • 大多数决策者使用本地节点数据

此策略允许您禁止并旨在最大限度地在群集中进行选择。这就是为什么从外面看起来像一个随机的移动。对于大型和长期集群来说,这是一个很好的策略。

引入任何类型的偏差都可能导致生产中的灾难性问题。让我们假设您有基于磁盘空间的决策程序,并且一台服务器具有令人难以置信的大型硬盘 - 过了一段时间,所有分片都将在此机器上分配。要解决这个问题,有必要考虑更重要的资源,如CPU,内存,网络,分片数量等。此外,我们需要为每个因素提出一个度量和权重。