集群不均衡故障排除

编辑

Elasticsearch 在数据层之间平衡分片,以在以下方面取得良好的折衷:

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

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

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

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

resp = client.cat.allocation(
    v=True,
)
print(resp)
response = client.cat.allocation(
  v: true
)
puts response
const response = await client.cat.allocation({
  v: "true",
});
console.log(response);
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 调用重置所需平衡

resp = client.perform_request(
    "DELETE",
    "/_internal/desired_balance",
)
print(resp)
const response = await client.transport.request({
  method: "DELETE",
  path: "/_internal/desired_balance",
});
console.log(response);
DELETE /_internal/desired_balance