重新路由

重新路由命令允许手动更改集群中各个分片的分配。例如,可以显式地将分片从一个节点移动到另一个节点,可以取消分配,并且可以将未分配的分片显式分配给特定节点。

以下是简单重新路由API调用的简短示例:

POST /_cluster/reroute
{
    "commands" : [
        {
            "move" : {
                "index" : "test", "shard" : 0,
                "from_node" : "node1", "to_node" : "node2"
            }
        },
        {
          "allocate_replica" : {
                "index" : "test", "shard" : 1,
                "node" : "node3"
          }
        }
    ]
}

需要重点注意的是,在处理任何重新路由命令之后,Elasticsearch将正常执行重新平衡(基于cluster.routing.rebalance.enable之类的设置)以保持平衡状态。例如,如果请求的分配包括将碎片从node1移动到node2,那么这可能导致一个分片从node2移回node1。

可以使用cluster.routing.allocation.enable设置将集群设置为禁用分配。如果禁用分配,那么将执行的唯一分配是使用reroute命令给出的显式分配,以及由于重新平衡而导致的后续分配。

可以使用?dry_run URI查询参数在“dry运行”模式下运行reroute命令,或者在请求正文中传递"dry_run":true。这将计算将命令应用于当前集群状态的结果,并在应用命令(和重新平衡)后返回生成的集群状态,但实际上不会执行请求的更改。

如果包含?explain URI查询参数,则响应中包含有关可执行或不执行命令的原因的详细说明。

支持的命令是:

move 将已启动的分片从一个节点移动到另一个节点。接受索引名称index和分片编号shard,从节点移动分片的from_node,以及将分片移动到的节点的to_node

cancel 取消分享碎片(或恢复)。接受索引名称index和分片编号shard,以及节点node取消分片分配。这可以用于强制从主分片重新同步现有副本,方法是取消它们并允许它们通过标准恢复过程重新初始化。默认情况下,只能取消副本分片分配。如果需要取消主分片的分配,则allow_primary标志也必须包含在请求中。

allocate_replica 将未分配的副本分片分配给节点。接受索引名称和分片编号的索引和分片,以及分配分片的节点。考虑分配决策者

重试失败分配

在放弃并保留未分配的分片之前,集群将尝试在一行中分配最多index.allocation.max_retries次数(默认为5)的分片。这种情况可能是由结构问题引起的,例如让分析器引用所有节点上都不存在的停用词文件。

一旦问题得到纠正,可以通过使用?retry_failed URI查询参数调用重新路由API来手动重试分配,该参数将尝试对这些分片进行单次重试。

强制分配不可恢复的错误

还有两个命令可用于将主分片分配给节点。但是,这些命令应谨慎使用,因为主要分片分配通常由Elasticsearch完全自动处理。无法自动分配主分片的原因包括:

  • 创建了一个新索引,但没有满足分配决策者的节点。
  • 无法在集群中的当前数据节点上找到最新的数据分片副本。为防止数据丢失,系统不会自动将旧的分片副本提升为主分片。

以下两个命令很危险,可能会导致数据丢失。它们适用于无法恢复原始数据且集群管理员接受丢失的情况。如果您遇到可以修复的临时问题,请参阅上述retry_failed标志。强调:如果执行了这些命令,然后某个节点加入了包含受影响的分片副本的集群,则将删除或覆盖新加入的节点上的副本。

allocate_stale_primary 将主分片分配给包含过时副本的节点。接受索引名称index和分片编号shard,以及节点node取消分片分配。使用此命令可能会导致提供的分片ID丢失数据。如果具有良好数据副本的节点稍后重新加入集群,则将使用此命令强制分配的过时副本的数据删除或覆盖该数据。为确保充分理解这些含义,此命令需要将标志accept_data_loss显式设置为true

allocate_empty_primary 将空主分片分配给节点。接受索引名称index和分片编号shard,以及节点node取消分片分配。如果先前已启动,则使用此命令会导致完全丢失已编入此分片的所有数据。如果稍后具有数据副本的节点重新加入集群,则将删除该数据。为确保充分理解这些含义,此命令需要将标志accept_data_loss显式设置为true

results matching ""

    No results matching ""