排查不平衡的集群

edit

排查不平衡的集群

edit

Elasticsearch 在数据层之间平衡分片,以实现以下方面的良好折中:

  • 分片数量
  • 磁盘使用情况
  • 写入负载(对于数据流中的索引)

Elasticsearch 在重新平衡分片时不会考虑搜索查询的数量或复杂性。 这是通过平衡分片数量和磁盘使用情况间接实现的。

不能保证各个组件会均匀分布在节点上。 如果某些节点拥有的分片较少,或者使用的磁盘空间较少, 但被分配了写负载较高的分片,这种情况就可能发生。

使用 cat allocation 命令 来列出每个节点的工作负载:

GET /_cat/allocation?v

API返回以下响应:

shards shards.undesired write_load.forecast disk.indices.forecast disk.indices disk.used disk.avail disk.total disk.percent host      ip        node    node.role
     1                0                 0.0                  260b         260b    47.3gb     43.4gb    100.7gb           46 127.0.0.1 127.0.0.1 CSUXak2 himrst

此响应包含以下影响平衡的信息:

  • shards 是当前分配给节点的分片数量
  • shards.undesired 是需要移动到其他节点以完成平衡的分片数量
  • disk.indices.forecast 是根据预测的分片增长预期的磁盘使用量
  • write_load.forecast 是与此节点相关的预测总写入负载

当所有分片都位于其期望的位置时,集群被认为是平衡的,这意味着不再计划进行分片移动(所有 shards.undesired 值都等于 0)。

一些操作,如节点重启、退役或更改集群分配设置,可能会造成中断,并且可能需要移动多个分片以重新平衡集群。

分片移动顺序不是确定性的,主要由源节点和目标节点准备移动分片的准备情况决定。 在重新平衡过程中,某些节点可能看起来比其他节点更忙。

当一个分片被分配到非预期的节点时,它会使用当前节点的资源,而不是目标节点的资源。 这可能会导致热点(磁盘或CPU),当多个分片驻留在当前节点上且尚未移动到其对应的目标节点时。

如果一个集群完成重新平衡需要很长时间,你可能会发现以下日志条目:

[WARN][o.e.c.r.a.a.DesiredBalanceReconciler] [10%] of assigned shards (10/100) are not on their desired nodes, which exceeds the warn threshold of [10%]

只要此类分片的数量在减少,并且此警告偶尔出现,例如在滚动重启或更改分配设置后,这并不令人担忧。

如果集群长时间(多个小时)反复出现此警告,可能是因为期望的平衡状态与当前状态之间的差距过大。

如果是这样,增加 cluster.routing.allocation.balance.threshold 以降低试图在集群内均衡分片数量和磁盘使用率的算法的敏感度。

并使用以下 API 调用来重置所需的余额:

DELETE /_internal/desired_balance