重新路由
重新路由命令允许手动更改集群中各个分片的分配。例如,可以显式地将分片从一个节点移动到另一个节点,可以取消分配,并且可以将未分配的分片显式分配给特定节点。
以下是简单重新路由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。