故障排除不平衡的集群
编辑故障排除不平衡的集群
编辑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