将 Shard 从一个节点移动到另一个节点
当处理任何大小的集群时,这是最常见的用例之一。 一个典型的场景是,如果在一个节点上共存了太多分片,它们将全部用于查询或索引。
这种情况表示节点/群集健康的潜在风险。 因此,将分片从一个节点移动到另一个节点是一个好习惯。 Elasticsearch 可能不会自动处理这种情况,这意味着我们需要手动进行干预。 如何做到这一点?
Elasticsearch 提供了一个集群级 API,该 API 允许将碎片从一个节点移动到另一个节点。 让我们在下面查看使用此 API 的示例:
重要的是要注意,在处理任何重新路由命令之后,Elasticsearch 将正常执行重新平衡(尊重诸如 cluster.routing.rebalance.enable 之类的设置的值),以便保持平衡状态。例如,如果请求的分配包括将分片从节点1移动到节点2,则这可能导致分片从节点2移动回到节点1来保持平衡。
可以使用 cluster.routing.allocation.enable 设置将集群设置为禁用分配。如果禁用了分配,则将执行的唯一分配是使用 reroute 命令指定的显式分配,以及由于重新平衡而导致的后续分配。
通过使用 ?dry_run URI 查询参数,或通过在请求正文中传递 “dry_run”: true,可以在 “dry run” 模式下运行重新路由命令。这将计算将命令应用于当前群集状态的结果,并在应用命令(和重新平衡)后返回结果群集状态,但实际上不会执行所请求的更改。
我们可以使用 reroute API 来实现把一个 shard 从一个节点移动到另外一个节点。下面是一个例子:
POST /_cluster/reroute
{
“commands